From 86e4378ce1a5ed03546c3e312d9ebfdf8aa79d2c Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 21 Nov 2025 11:02:13 +0100 Subject: [PATCH] update --- CHANGELOG | 7 +-- README.md | 136 +++++++++++++++++++++++++++++------------ androidacy-config.json | 4 +- customize.sh | 131 ++++++++++++++++++++++++++------------- icon/MicroG.png | Bin 7464 -> 0 bytes module.prop | 18 +++--- update.json | 8 +-- 7 files changed, 206 insertions(+), 98 deletions(-) delete mode 100644 icon/MicroG.png diff --git a/CHANGELOG b/CHANGELOG index 2543ef1..450a443 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,3 @@ -Please note that microg_installer_revived is in reduced maintenance / no support mode. See README for more information. - -- Support microG v0.3.4 -- fix Play Store mkdir path (thanks to @MugoSquero), may fix #171 +v5.1.2 +- Support microG v0.3.10 +- Code Clean-up diff --git a/README.md b/README.md index 21a0fa5..d6aed2a 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,126 @@ -# MicroG Installer Script +[![Telegram](https://img.shields.io/badge/Telegram-microGRevivedAgain-blue?logo=telegram)](https://t.me/microGRevivedAgain) +[![Website](https://img.shields.io/badge/Website-spacealtctrl.net-blue?logo=firefoxbrowser&logoColor=white)](https://spacealtctrl.net) -## Install instructions +# microG Installer Revived… again -See [Wiki](https://lab.c95.org/c2c/microg-installer/wiki) +A **Magisk / KernelSU module** that converts your installed microG GmsCore from a user app into a **system-level app** to improve **Play Integrity behavior** and testing on custom or rooted devices. + +**Forked from nift4's microG Installer Revived** — updated to support **microG 0.3.10.250932**. + +> **Note:** This module does not bundle or install microG. It promotes your already-installed microG to the system layer with proper privileges. Think of it as a **converter**, not a traditional installer. --- -## This project is in reduced maintenance / no support mode and I will only release updates for my personal usage from now on. There are too many issues with KernelSU, stock ROMs and everything too far from my personal usecase, and I'd rather use my free time with other projects, so I am not really able (or motivated) to support most cases anymore. If you can, use recovery-based installers, those will always be more reliable and universal. +## ⚠ Personal Project Notice -# microG Installer Revived +This is a personal side project maintained for testing and research. Current support focuses on **microG 0.3.10.250932**. -This is a Magisk module - originally based on Hieu Van's microG Installer - that installs microG GmsCore, GsfProxy and Companion (or Play Store if you want so) to `/system/priv-app`. +If you want to participate in testing or share results, join the Telegram testing group: -Currently, GmsCore 0.3.4 (including Companion, previously known as FakeStore) and earlier are supported. GsfProxy 0.1.0 and MapsV1 0.1.0 are bundled in the module. +[https://t.me/microGRevivedAgainResults](https://t.me/microGRevivedAgainResults) -**Note**: Install this module before installing any GMS-dependent apps, as well as do not disable it after installing such apps, unless you know what you're doing. +--- -There are two copies of this online: The [Magisk alt module repo](https://github.com/Magisk-Modules-Alt-Repo/microG_Installer) and the [personal](https://github.com/nift4/microg_installer) one. The personal one contains the latest development version and is used for pull requests and issues and the Magisk alt repo one is the stable code only. +## Overview + +This module allows your **user-installed microG apps** to operate at the system level by promoting them into `/system/priv-app/` using Magisk/KernelSU overlay mechanisms. By doing so, microG: + +- Gains system-level privileges required for testing Play Integrity +- Is treated by Android as a system component without modifying `/system` permanently +- Allows apps to interact with microG in a closer-to-native environment +- Leaves your original user-installed apps untouched; the system prioritizes the overlayed copies + +This approach provides a safe, reversible way to **evaluate Play Integrity responses** and improve compatibility in rooted or custom ROM environments. + +--- + +## Features + +- Detects installed microG GmsCore and Companion apps +- Converts them into **system-level apps** using overlay mechanisms +- Grants necessary **system permissions** and enables features like **signature spoofing** +- Reversible: removing the module restores the system to its original state +- Tested with latest microG releases while remaining compatible with prior 0.3.5+ versions (untested) + +--- + +## Supported Versions + +| Component | Version Tested | +|--------------------|--------------------| +| microG GmsCore | 0.3.10.250932 | +| microG Companion | 0.3.10.840226 | +| Older microG | 0.3.5+ (untested) | + +--- + +## Requirements + +**Do NOT install** if Google Play Services are present. + +1. **Signature spoofing support** – check using the Signature Spoofing Checker + - If unsupported, see [FakeGApps](https://github.com/whew-inc/FakeGApps/releases) + +2. **Pre-installed microG apps** – both GmsCore and Companion must be installed as **user apps** before flashing the module + +--- ## Installation -**Again, if you have Google services currently installed, DO NOT INSTALL THIS MODULE.** -- Choose an solution for [Signature spoofing](https://github.com/microg/android_packages_apps_GmsCore/wiki/Signature-Spoofing) (Note: If your ROM does not support signature spoofing, I recommened [whew-inc's FakeGApps fork](https://github.com/whew-inc/FakeGApps/releases)) -- Install microG 0.3.2 and Companion (or real Play Store) as normal user app -- Install the module to convert them to system apps with all bells and whistles (like Maps V1, GsfProxy, etc) -## How do I get the real Play Store? +1. Verify signature spoofing is enabled +2. Install **microG GmsCore 0.3.10.250932** as a user app +3. Install **microG Companion / Play Store variant** as a user app +4. Flash this module via Magisk or KernelSU +5. Reboot +6. Grant necessary permissions in microG Settings -First, if you experience an bootloop, use [Magisk Safe Mode](https://topjohnwu.github.io/Magisk/faq.html#q-i-installed-a-module-and-it-bootlooped-my-device-help) to disable the module and use an older Play Store APK, then post a bug report. This module needs to be updated for new Play Store versions every while. If it boots, but Play Store is broken, it's probably a microG issue. Feel free to report issues in the bugtracker here though. +> The module automatically detects and converts your user-installed apps to system-level versions during boot. -Get an Play Store APK (I suggest unpatched Play Store from APKMirror) - please note that the file has to be a non-bundle APK, which means APKM files are not supported. Then, just install it before flashing the module! If you now install, update or reflash microG Installer Revived there will be an message "Installing real Play Store". This indicates it worked. Now grant all permissions. You can now install updates for the Play Store like for every app. +--- -Note: previously, this module told you to put it into `/data/adb/Phonesky.apk`. This is no longer needed and the module will ignore that file. +## Updating microG -## Can I update to new versions without waiting for module updates? +For updates **within the 0.3.10.x series**, simply install the new APK — no need to reflash the module. -**Yes**, just download the new APK (in the normal variant, not -hw or -lh) from microG GitHub, download page or microG F-Droid repo (all those use the exact same APK files!) and install it as you always would **without reflashing the module**. If you use Companion, update it this way too. Please note that some F-Droid clients report signature compatibility issues, which however appears to be a problem with interactions between the microG repo, clients and signature spoofing. In this case, download the APKs using a web browser and install them normally. +Sources: +- [microG GitHub Releases](https://github.com/microg/GmsCore/releases) +- [microG F-Droid Repository](https://microg.org/download.html) -## Common issues +--- -- black screen / bootloop: don't use Magisk Delta's SuList -- app misbehaves/crashes with missing microg overlay (eg. chromium based browsers): disable KSU Unmount modules from its app profile -- can grant SMS permission but can't grant background location: go to App Info > Permissions > Location > (press "Location access" in the warning dialog), then go back to self test and try to grant background location again - it should now work -- real Play Store error DF-DFERH-01: make sure you have Device Registration enabled in microG settings, and make sure Internet access is enabled for Play Store and microG (some custom ROMs have a toggle in App info) +## Notes for Play Store Users -## Build +- Install the Play Store APK (standard APK, not bundle) **before flashing** +- Module should detect and convert it automatically +- Contact the maintainer if detection fails -### Linux, BSD, macOS, Android -Requires wget. +--- - wget -O META-INF/com/google/android/update-binary https://raw.githubusercontent.com/topjohnwu/Magisk/master/scripts/module_installer.sh && zip microG_Installer_Revived.zip -9r * -x update.json +## Testing & Feedback + +This module is intended for **testing and improving Play Integrity results**. Testers are encouraged to report: + +- System-level behavior of apps interacting with microG +- Boot and overlay behavior on different ROMs and kernels +- Any permission, integration, or compatibility anomalies + +**Recommendation:** use secondary devices or emulators and back up important data before testing. -### Other -Download [this](https://raw.githubusercontent.com/topjohnwu/Magisk/master/scripts/module_installer.sh) and put it into `META-INF/com/google/android/update-binary`. And ZIP it. - -### About microGOverlay.apk -This APK file is an simple overlay containing configuration for UnifiedNlp. The source can not be checked in into this git repository because of compatibility reasons with module repositories, so I posted the trivial source code on [an extra branch](https://github.com/nift4/microg_installer_revived/tree/overlay). You can use any signing keystore to sign the overlay, but it needs to be signed. +--- ## Credits -- **microG project** for their awesome work -- **Hieu Van** for the [original microG Installer](https://github.com/nift4/microg_installer_revived/tree/23de13101d8dd5807f713d0cace4a565478c6cfd) -- **Fs00** for many bug fixes -- **chris42** and **FriendlyNeighborhoodShane** for privapp permission files -- **felinira**, **akaessens** and **soracqt** for contributing through pull requests +- **microG Project** – microG GmsCore and Companion +- **nift4** – original microG Installer Revived +- **Hieu Van** – original microG Installer +- **Contributors** – Fs00, chris42, FriendlyNeighborhoodShane, and others + +--- + +## Links + +- [Report Issues](https://github.com/spacealtctrl/microg_installer_revived_again/issues) +- [Original Project](https://github.com/nift4/microg_installer_revived) +- [microG Project](https://microg.org) +- **Telegram Testing Group:** [https://t.me/microGRevivedAgainResults](https://t.me/microGRevivedAgainResults) diff --git a/androidacy-config.json b/androidacy-config.json index 6cc18a8..d64697c 100644 --- a/androidacy-config.json +++ b/androidacy-config.json @@ -2,8 +2,8 @@ "allow_experiments": true, "allow_api_functions": true, "author": { - "name": "nift4", - "email": "nift4@protonmail.com" + "name": "spacealtctrl", + "email": "spacealtctrl@protonmail.com" }, "verify_signatures": true } diff --git a/customize.sh b/customize.sh index b08f19c..6771ecf 100644 --- a/customize.sh +++ b/customize.sh @@ -1,3 +1,4 @@ + if [ -n "$MMM_EXT_SUPPORT" ]; then ui_print "#!useExt" mmm_exec() { @@ -6,79 +7,117 @@ if [ -n "$MMM_EXT_SUPPORT" ]; then else mmm_exec() { true; } fi + if ! $BOOTMODE; then abort "- ERROR: Installation via recovery is NOT supported." fi -mmm_exec setSupportLink "https://github.com/nift4/microg_installer_revived/issues" -MAX_VER="240913008" -MAX_VERN="0.3.4.240913" +mmm_exec setSupportLink "https://github.com/spacealtctrl/microg_installer_revived_again/issues" + +MAX_VER="250932020" +MAX_VERN="0.3.10.250932" if [ -f /data/adb/Phonesky.apk ]; then - ui_print "- INFO: Phonesky.apk is found in /data/adb, but this module no longer uses this file." - ui_print "- INFO: It won't break anything, but having that there won't make you use real Play Store anymore." + ui_print "- INFO: Legacy Phonesky.apk found in /data/adb" + ui_print " (This file is no longer used by the module)" fi mmm_exec showLoading -ui_print "Collecting information about com.google.android.gms" -# check microG +ui_print " " +ui_print "===================================" +ui_print " microG Installer Revived.... again" +ui_print " v5.1.3" +ui_print "===================================" +ui_print " " + +ui_print "→ Checking com.google.android.gms..." DUMP_GMS="$(pm dump com.google.android.gms)" if [[ $? -gt 0 ]]; then - ui_print "- WARNING: pm dump may have failed?" + ui_print " ⚠ WARNING: pm dump may have failed" fi -ui_print "Checking if com.google.android.gms is installed" + if (echo "$DUMP_GMS" | grep "Unable to find package: com.google.android.gms") >/dev/null; then - abort "- ERROR: You do not have official microG installed." + abort "✗ ERROR: microG GmsCore is not installed" fi -ui_print "Collecting file path of com.google.android.gms" -GMS_PATH="$(realpath $(echo "$DUMP_GMS" | grep path: | head -n1 | cut -d: -f2))" -ui_print "Checking if file path of com.google.android.gms is on /data" -if [[ "$GMS_PATH" = "${GMS_PATH#/data/}" ]]; then - abort "- ERROR: expected microG install path to be on /data, but it's $GMS_PATH" -fi -ui_print "Checking if file path of com.google.android.gms exists" -if ! [[ -f "$GMS_PATH" ]]; then - abort "- ERROR: expected microG install path to exist: $GMS_PATH" -fi -ui_print "Checking if com.google.android.gms is microG" + if ! (echo "$DUMP_GMS" | grep "android.permission.FAKE_PACKAGE_SIGNATURE") >/dev/null; then - abort "- ERROR: You appear to have Google Play Services installed instead of microG." + abort "✗ ERROR: Google Play Services detected (microG required)" fi -ui_print "Checking if com.google.android.gms is a supported version" + +GMS_PATH="$(realpath $(echo "$DUMP_GMS" | grep path: | head -n1 | cut -d: -f2))" +ui_print " ✓ Found at: $GMS_PATH" + +if [[ "$GMS_PATH" = "${GMS_PATH#/data/}" ]]; then + abort "✗ ERROR: microG must be installed on /data, found at $GMS_PATH" +fi + +if ! [[ -f "$GMS_PATH" ]]; then + abort "✗ ERROR: microG APK not found at $GMS_PATH" +fi + GMS_VER="$(echo "$DUMP_GMS" | grep versionCode | head -n1 | cut -d" " -f5 | cut -d= -f2)" GMS_VERN="$(echo "$DUMP_GMS" | grep versionName | head -n1 | cut -d" " -f5 | cut -d= -f2)" +ui_print " ✓ Version: $GMS_VERN (code: $GMS_VER)" + if [[ "$GMS_VER" -gt "$MAX_VER" ]]; then - abort "- ERROR: You have microG version $GMS_VERN ($GMS_VER) but the maximum supported version is $MAX_VERN ($MAX_VER)." + abort "✗ ERROR: microG $GMS_VERN exceeds max supported $MAX_VERN" fi -# check Vending -ui_print "Collecting information about com.android.vending" + +ui_print " " +ui_print "→ Checking com.android.vending..." DUMP_VD="$(pm dump com.android.vending)" if [[ $? -gt 0 ]]; then - ui_print "- WARNING: pm dump may have failed?" + ui_print " ⚠ WARNING: pm dump may have failed" fi -ui_print "Checking if com.android.vending is installed" + if (echo "$DUMP_VD" | grep "Unable to find package: com.android.vending") >/dev/null; then - abort "- ERROR: You do not have microG Companion or Play Store installed." + abort "✗ ERROR: Play Store or microG Companion not installed" fi -ui_print "Collecting file path of com.android.vending" + VD_PATH="$(realpath $(echo "$DUMP_VD" | grep path: | head -n1 | cut -d: -f2))" -ui_print "Checking if file path of com.android.vending is on /data" +ui_print " ✓ Found at: $VD_PATH" + if [[ "$VD_PATH" = "${VD_PATH#/data/}" ]]; then - abort "- ERROR: expected microG Companion / Play Store install path to be on /data, but it's $VD_PATH" + abort "✗ ERROR: Vending must be installed on /data, found at $VD_PATH" fi -ui_print "Checking if file path of com.android.vending exists" + if ! [[ -f "$VD_PATH" ]]; then - abort "- ERROR: expected microG Companion / Play Store install path to exist: $VD_PATH" + abort "✗ ERROR: Vending APK not found at $VD_PATH" fi -# Do install tasks -ui_print "- Installing microG GmsCore" -if [ ! -d "/my_bigball/priv-app/GmsCore" ]; then - mkdir -p "$MODPATH/system/product/priv-app/GmsCore" - cp "$GMS_PATH" "$MODPATH/system/product/priv-app/GmsCore/GmsCore.apk" + +VD_VER="$(echo "$DUMP_VD" | grep versionCode | head -n1 | cut -d" " -f5 | cut -d= -f2)" +VD_VERN="$(echo "$DUMP_VD" | grep versionName | head -n1 | cut -d" " -f5 | cut -d= -f2)" + +if (echo "$DUMP_VD" | grep "android.permission.FAKE_PACKAGE_SIGNATURE") >/dev/null; then + ui_print " ✓ Type: microG Companion" + VENDING_TYPE="microG Companion" else - mkdir -p "$MODPATH/system/priv-app/microG" - cp "$GMS_PATH" "$MODPATH/system/priv-app/microG/microG.apk" + ui_print " ✓ Type: Play Store" + VENDING_TYPE="Play Store" fi + +ui_print " ✓ Version: $VD_VERN (code: $VD_VER)" + +ui_print " " +ui_print "===================================" +ui_print " Installing to System Partition" +ui_print "===================================" +ui_print " " + +if [ ! -d "/my_bigball/priv-app/GmsCore" ]; then + ui_print "→ Installing microG GmsCore..." + ui_print " Destination: /system/product/priv-app/GmsCore/" + mkdir -p "$MODPATH/system/product/priv-app/GmsCore" || abort "✗ ERROR: Failed to create directory" + cp "$GMS_PATH" "$MODPATH/system/product/priv-app/GmsCore/GmsCore.apk" || abort "✗ ERROR: Failed to copy GmsCore.apk" + ui_print " ✓ GmsCore.apk installed successfully" +else + ui_print "→ Installing microG GmsCore..." + ui_print " Destination: /system/priv-app/microG/" + mkdir -p "$MODPATH/system/priv-app/microG" || abort "✗ ERROR: Failed to create directory" + cp "$GMS_PATH" "$MODPATH/system/priv-app/microG/microG.apk" || abort "✗ ERROR: Failed to copy microG.apk" + ui_print " ✓ microG.apk installed successfully" +fi + if (echo "$DUMP_VD" | grep "android.permission.FAKE_PACKAGE_SIGNATURE") >/dev/null; then ui_print "- Installing microG Companion" pm grant com.android.vending android.permission.FAKE_PACKAGE_SIGNATURE 2>/dev/null @@ -93,4 +132,14 @@ else mkdir -p "$MODPATH/system/priv-app/Phonesky" cp "$VD_PATH" "$MODPATH/system/priv-app/Phonesky/Phonesky.apk" fi + +ui_print " " +ui_print "===================================" +ui_print " Installation Complete!" +ui_print "===================================" +ui_print " " +ui_print "Your apps have been moved to /system" +ui_print "Reboot to apply changes" +ui_print " " + mmm_exec hideLoading diff --git a/icon/MicroG.png b/icon/MicroG.png deleted file mode 100644 index 44de4831bafc1a1151c9ffd1db5de707f52655ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7464 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