# Config variant="MinimalIAP"; ver="2.9"; verc="290"; date="28th november, 2020"; minsdk=21; modprop="id=MinMicroG name=Minimal MicroG Pack $variant Edition version=$ver versionCode=$verc author=MOVZX and FatherJony and FriendlyNeighborhoodShane description=A Minimal MicroG installer with just the essentials support=https://t.me/joinchat/FyFlS0X2D7f6YNvdxhEsfw donate= minMagisk=1900 "; stuff=" /system/app/MicroGGSFProxy/MicroGGSFProxy.apk /system/bin/npem /system/etc/default-permissions/microg-permissions.xml /system/etc/permissions/com.android.vending.xml /system/etc/permissions/com.google.android.gms.xml /system/etc/permissions/com.google.android.maps.xml /system/etc/permissions/com.google.android.media.effects.xml /system/etc/permissions/com.google.widevine.software.drm.xml /system/etc/sysconfig/nogoolag.xml /system/framework/com.google.android.maps.jar /system/framework/com.google.android.media.effects.jar /system/framework/com.google.widevine.software.drm.jar /system/priv-app/PatchPhonesky/PatchPhonesky.apk /system/priv-app/MicroGGMSCore/MicroGGMSCore.apk "; stuff_arch=" "; stuff_sdk=" "; stuff_arch_sdk=" "; stuff_util=" "; stuff_other=" /system/app/AppleNLPBackend/AppleNLPBackend.apk /system/app/AuroraDroid/AuroraDroid.apk /system/app/AuroraStore/AuroraStore.apk /system/app/DejaVuNLPBackend/DejaVuNLPBackend.apk /system/app/GoogleCalendarSyncAdapter/GoogleCalendarSyncAdapter.apk /system/app/GoogleContactsSyncAdapter/GoogleContactsSyncAdapter.apk /system/app/LocalGSMNLPBackend/LocalGSMNLPBackend.apk /system/app/LocalWiFiNLPBackend/LocalWiFiNLPBackend.apk /system/app/MozillaUnifiedNLPBackend/MozillaUnifiedNLPBackend.apk /system/app/NominatimNLPBackend/NominatimNLPBackend.apk /system/etc/default-permissions/microg-permissions-unlp.xml /system/etc/permissions/com.aurora.services.xml /system/etc/permissions/com.google.android.backuptransport.xml /system/etc/permissions/gsync.xml /system/etc/sysconfig/nogoolag-unlp.xml /system/lib/libjni_keyboarddecoder.so /system/lib/libjni_latinimegoogle.so /system/lib64/libjni_keyboarddecoder.so /system/lib64/libjni_latinimegoogle.so /system/priv-app/AuroraServices/AuroraServices.apk /system/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk /system/priv-app/MicroGUNLP/MicroGUNLP.apk /system/priv-app/FakeStore/FakeStore.apk "; stuff_old=" /system/addon.d/01-nogoolag.sh /system/app/FDroid/FDroid.apk /system/app/RadioCellsNLPBackend/RadioCellsNLPBackend.apk /system/etc/permissions/org.fdroid.fdroid.privileged.xml /system/priv-app/AuroraStore/AuroraStore.apk /system/priv-app/DejaVuLocationService/DejaVuLocationService.apk /system/priv-app/DejaVuNLPBackend/DejaVuNLPBackend.apk /system/priv-app/FDroidPrivileged/FDroidPrivileged.apk /system/priv-app/LocalGSMNLPBackend/LocalGSMNLPBackend.apk /system/priv-app/LocalWiFiNLPBackend/LocalWiFiNLPBackend.apk /system/priv-app/MicroGDroidGuard/MicroGDroidGuard.apk /system/priv-app/MicroGGSFProxy/MicroGGSFProxy.apk /system/priv-app/MozillaUnifiedNLPBackend/MozillaUnifiedNLPBackend.apk /system/priv-app/NominatimNLPBackend/NominatimNLPBackend.apk "; stuff_uninstall="$stuff $stuff_arch $stuff_sdk $stuff_arch_sdk $stuff_other $stuff_old"; stuff_debloat=" /system/app/GmsCore/GmsCore.apk /system/app/GooglePlay/GooglePlay.apk /system/app/GoogleServicesFramework/GoogleServicesFramework.apk /system/app/Phonesky/Phonesky.apk /system/app/PlayStore/PlayStore.apk /system/app/PrebuiltGmsCore/PrebuiltGmsCore.apk /system/app/Vending/Vending.apk /system/priv-app/GmsCore/GmsCore.apk /system/priv-app/GooglePlay/GooglePlay.apk /system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk /system/priv-app/Phonesky/Phonesky.apk /system/priv-app/PlayStore/PlayStore.apk /system/priv-app/PrebuiltGmsCore/PrebuiltGmsCore.apk /system/priv-app/Vending/Vending.apk /system/app/AMAPNetworkLocation/AMAPNetworkLocation.apk /system/app/BaiduNetworkLocation/BaiduNetworkLocation.apk /system/app/LegacyNetworkLocation/LegacyNetworkLocation.apk /system/app/NetworkLocation/NetworkLocation.apk /system/priv-app/AMAPNetworkLocation/AMAPNetworkLocation.apk /system/priv-app/BaiduNetworkLocation/BaiduNetworkLocation.apk /system/priv-app/LegacyNetworkLocation/LegacyNetworkLocation.apk /system/priv-app/NetworkLocation/NetworkLocation.apk /system/app/BlankStore/BlankStore.apk /system/app/DroidGuard/DroidGuard.apk /system/app/GmsCore/GmsCore.apk /system/app/GmsDroidGuard/GmsDroidguard.apk /system/app/GsfProxy/GsfProxy.apk /system/app/UnifiedNlp/UnifiedNlp.apk /system/priv-app/BlankStore/BlankStore.apk /system/priv-app/DroidGuard/DroidGuard.apk /system/priv-app/GmsCore/GmsCore.apk /system/priv-app/GmsDroidGuard/GmsDroidguard.apk /system/priv-app/GsfProxy/GsfProxy.apk /system/priv-app/UnifiedNlp/UnifiedNlp.apk "; stuff_perm=" /system/app/MicroGGSFProxy /system/bin/npem /system/etc/default-permissions /system/etc/permissions /system/etc/sysconfig /system/framework/com.google.android.maps.jar /system/priv-app/PatchPhonesky /system/priv-app/MicroGGMSCore "; pre_build_actions() { return 0; } post_build_actions() { sign_zip; return 0; } pre_install_actions() { user_conf; microg_cleanup; return 0; } post_install_actions() { addon_install; initscript_install; return 0; } pre_uninstall_actions() { [ "$magisk" = "no" ] && stuff_uninstall="$stuff_uninstall /system/addon.d/10-$modname.sh /system/etc/init.d/10-$modname"; return 0; } post_uninstall_actions() { rm -rf "$root/system/etc/.mmg"; return 0; } sign_zip() { zipsigner="$resdldir/util/zipsigner.jar"; [ "$(which java)" ] && [ -f "$zipsigner" ] || return 0; echo " "; echo " - Signing zip..."; java -jar "$zipsigner" "$tmpdir/release.zip" "$tmpdir/release-signed.zip" || { echo " " >&2; echo "ERROR: Zipsigner failed" >&2; return 1; } mv -f "$tmpdir/release-signed.zip" "$tmpdir/release.zip"; } user_conf() { for file in "$(dirname "$0")/mmg-conf.txt" "$(dirname "$zipfile")/mmg-conf.txt" "$moddir/mmg-conf.txt" "/data/adb/mmg-conf.txt"; do [ -f "$file" ] && { ui_print " "; ui_print "Processing user config $file..."; includelist="$(sed -e 's|\#.*||g' -e 's|[^a-zA-Z0-9.-]| |g' "$file")"; break; } done; [ "$includelist" ] && { new_stuff=""; new_stuff_arch=""; new_stuff_sdk=""; new_stuff_arch_sdk=""; for include in $includelist; do log "Including keyword $include"; new_stuff="$new_stuff $(echo "$stuff" | grep -oi "[ ]*[^ ]*$include[^ ]*[ ]*")"; new_stuff_arch="$new_stuff_arch $(echo "$stuff_arch" | grep -oi "[ ]*[^ ]*$include[^ ]*[ ]*")"; new_stuff_sdk="$new_stuff_sdk $(echo "$stuff_sdk" | grep -oi "[ ]*[^ ]*$include[^ ]*[ ]*")"; new_stuff_arch_sdk="$new_stuff_arch_sdk $(echo "$stuff_arch_sdk" | grep -oi "[ ]*[^ ]*$include[^ ]*[ ]*")"; done; stuff="$new_stuff"; stuff_arch="$new_stuff_arch"; stuff_sdk="$new_stuff_sdk"; stuff_arch_sdk="$new_stuff_arch_sdk"; } [ "$includelist" ] && { stuff="$(echo "$stuff" | sed 's| |\n|g' | tr -s '\n' | sort -u | sed 's|^| |g') "; stuff_arch="$(echo "$stuff_arch" | sed 's| |\n|g' | tr -s '\n' | sort -u | sed 's|^| |g') "; stuff_sdk="$(echo "$stuff_sdk" | sed 's| |\n|g' | tr -s '\n' | sort -u | sed 's|^| |g') "; stuff_arch_sdk="$(echo "$stuff_arch_sdk" | sed 's| |\n|g' | tr -s '\n' | sort -u | sed 's|^| |g') "; } [ "$stuff" ] || [ "$stuff_arch" ] || [ "$stuff_sdk" ] || [ "$stuff_arch_sdk" ] || abort "Nothing left to install after config"; } microg_cleanup() { if echo "$stuff" | grep -q "MicroG"; then ui_print " "; ui_print "Doing MicroG preparations..."; if [ "$bootmode" != "true" ]; then # Kanged from NanoDroid # Thanks Setialpha cleanup_folders="BlankStore GmsCore GmsCore_update GmsCoreSetupPrebuilt GoogleServicesFramework GsfProxy Phonesky PlayStore PrebuiltGmsCorePi PrebuiltGmsCorePix PrebuiltGmsCore Vending"; cleanup_packages="com.android.vending com.google.android.feedback com.google.android.gms com.google.android.gsf com.google.android.gsf.login com.mgoogle.android.gms"; for app in $cleanup_folders; do for file in /data/dalvik-cache/*/system"@priv-app@$app"[@\.]*@classes.* /data/dalvik-cache/*/system"@app@$app"[@\.]*@classes.*; do [ -e "$file" ] && { log "PREPPER: Removing $file"; rm -rf "$file"; } done; done; if [ ! -f "$root/system/etc/.mmg" ]; then log "Doing the clean install treatment"; for app in $cleanup_packages; do for file in "/data/data/$app" "/data/user/*/$app" "/data/user_de/*/$app" "/data/app/$app"-* "/mnt/asec/$app"-* "/data/media/0/Android/data/$app"; do [ -e "$file" ] && { log "PREPPER: Removing $file"; rm -rf "$file"; } done; done; for file in /data/system/users/*/runtime-permissions.xml; do [ -e "$file" ] && { log "PREPPER: Removing $file"; rm -rf "$file"; } done; if [ -f /data/system/packages.list ]; then for app in $cleanup_packages; do if grep -q "$app" "/data/system/packages.list"; then log "PREPPER: de-registering app: $app"; sed -i "s/.*${app}.*//g" /data/system/packages.list; fi; done; else log "PREPPER: This is a clean flash"; fi; if [ "$(which sqlite3)" ]; then find /data/system* -type f -name "accounts*db" 2>/dev/null | while read -r database; do log "PREPPER: deleting Google Accounts from $database"; sqlite3 "$database" "DELETE FROM accounts WHERE type='com.google';"; done else log "PREPPER: sqlite3 not found"; fi; fi; touch "$root/system/etc/.mmg"; fi; fi; } addon_install() { [ "$magisk" = "no" ] || return 0; log " "; log "POST-INSTALL: Installing addon.d script"; addond="/system/addon.d/10-$modname.sh"; mkdir -p "$(dirname "$root/$addond")"; touch "$root/$addond"; perm 0 0 0755 0644 "$(dirname "$root/$addond")"; chcon -hR 'u:object_r:system_file:s0' "$(dirname "$root/$addond")"; cat << EOF > "$root/$addond"; #!/sbin/sh # # MinMicroG addon.d save_files() { cat <> "$root/$addond"; log() { echo "$1"; } abort() { log " "; log "!!! ERROR: $1"; exit 1; } log " "; log "=== MinMicroG addon.d script ==="; [ -e "/system/system/build.prop" ] && sysroot="system"; [ -e "/system_root/system/build.prop" ] && sysroot="system_root"; [ -e "/mnt/system/system/build.prop" ] && sysroot="mnt/system"; [ -f "/$sysroot/system/build.prop" ] || abort "could not find a ROM in /$sysroot"; sdk="$(grep ro.build.version.sdk "/$sysroot/system/build.prop" | head -n1 | cut -d= -f2)"; [ "$sdk" ] && [ "$sdk" -gt "0" ] || abort "could not find SDK"; backupdir="/data/media/0/MinMicroG/backups"; [ "$C" ] && tmpdir="$C" || tmpdir="/tmp/backupdir"; move() { sourceobject="$1"; destobject="$2"; if [ "$sdk" -lt 21 ]; then [ "$(basename "$(dirname "$sourceobject")").apk" = "$(basename "$sourceobject")" ] && { sourceobject="$(dirname "$(dirname "$sourceobject")")/$(basename "$sourceobject")"; destobject="$(dirname "$(dirname "$destobject")")/$(basename "$destobject")"; } fi; [ "$(basename "$(dirname "$sourceobject")").apk" = "$(basename "$sourceobject")" ] && { sourceobject="$(dirname "$sourceobject")"; destobject="$(dirname "$destobject")"; } [ -e "$sourceobject" ] || return 0; mkdir -p "$(dirname "$destobject")"; cp -rf "$sourceobject" "$(dirname "$destobject")/" || { log "ERROR: Could not move ($sourceobject to $destobject)"; return 1; } [ -e "$destobject" ] && log "MOVER: Object moved ($sourceobject to $destobject)" || { log "ERROR: Could not move ($sourceobject to $destobject)"; return 1; } rm -rf "$sourceobject" || { log "ERROR: Could not remove ($sourceobject)"; return 1; } [ -e "$sourceobject" ] && { log "ERROR: Could not remove ($sourceobject)"; return 1; } || log "MOVER: Object removed ($sourceobject)"; } perm_r() { uid="$1"; gid="$2"; dmod="$3"; fmod="$4"; dir="$5"; [ -d "$dir" ] || return 0; chown -R $uid:$gid "$dir" || chown -R $uid.$gid "$dir"; find "$dir" -type d -exec chmod $dmod {} +; find "$dir" -type f -exec chmod $fmod {} +; } case "$1" in backup) log " "; log "Backing up..."; save_files | while read object dummy; do [ "$object" ] || continue; move "/$sysroot/$object" "$tmpdir/$object"; done; ;; restore) log " "; log "Restoring..."; save_files | while read object dummy; do [ "$object" ] || continue; move "$tmpdir/$object" "/$sysroot/$object"; done; ;; post-restore) log " "; log "Debloating..."; mount /data; delete_files | while read object dummy; do [ "$object" ] || continue; move "/$sysroot/$object" "$backupdir/$object"; done; [ -d "$backupdir" ] && { perm_r 1023 1023 775 664 "$backupdir"; chcon -hR "u:object_r:media_rw_data_file:s0" "$backupdir"; } ;; esac; EOF } initscript_install() { log " "; log "POST-INSTALL: Installing init script"; if [ "$magisk" = "yes" ]; then init="/service.sh"; touch "$root/$init"; chmod 0777 "$root/$init"; elif [ "$magisk" = "no" ]; then init="/system/etc/init.d/10-$modname"; mkdir -p "$(dirname "$root/$init")"; touch "$root/$init"; perm 0 0 0755 0777 "$(dirname "$root/$init")"; chcon -hR 'u:object_r:system_file:s0' "$(dirname "$root/$init")"; fi; cat << 'EOF' > "$root/$init"; #!/system/bin/sh # MinMicroG bootup script # Wait for bootup while true; do [ "$(getprop sys.boot_completed)" = "1" ] && break; sleep 5; done; # Fix GMS permission troubles apk="/system/priv-app/MicroGGMSCore/MicroGGMSCore.apk"; [ -f "$apk" ] && pm install -r "$apk"; # Grant permissions npem; EOF }