os-image: android:15.0-gms — GMS + ARM translation for x86_64#124
Merged
Conversation
x86_64 Android 15 with Google Play services and libndk_translation so arm64-only APKs run on the host. The stock image ships native-bridge props but no translator library, so arm64 apps installed and then crashed on launch; this variant supplies the library and wires the bridge in both system and vendor build.prop. All payloads pinned by URL + checksum, verified at build time. Runs ordinary arm64 apps (verified: Meituan). Apps whose native layer hooks JNI or self-checks for tampering (WeChat, QQ, Alipay, most anti-cheat games) crash at startup — an x86 binary-translation limit; those need an arm64 host with the plain 15.0 image.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds an
android:15.0-gmsimage variant: x86_64 Android 15 with Google Play services and an ARM→x86 translator, so the host can run arm64-only APKs and log into Google Play.What it adds over
15.0libndk_translation— Google ARM→x86 translator (ChromeOS prebuilt, same source + pin aswaydroid_script). The stock redroid image ships the native-bridge props but no translator library, so arm64-only APKs install and then crash on launch; this variant supplies the library and wiresro.dalvik.vm.native.bridgein bothsystemandvendorbuild.prop.binfmt_miscin the initramfs for the translator to register its ARM exec handlers.All payloads are pinned by URL + checksum and re-verified at build time (
md5sum -c/sha256sum -c/test -f/grep -q), so the image is reproducible.linux/amd64only (translator + GMS are x86_64; the existingos-image/android/platformsalready constrains this).Verified on hardware
Built → exported →
cocoon image import→ booted 4C/4G →adb:sys.boot_completed=1, real-LAN DHCP,ro.dalvik.vm.native.bridge=libndk_translation.soactive,binfmt_miscregisteredarm64_dyn/arm64_exe.com.google.android.gms,com.android.vending(Play Store),com.google.android.gsf.Capability boundary (documented in the image README + docs)
Runs Google Play + ordinary arm64 apps. Does not run apps whose native layer hooks JNI or self-checks for tampering (WeChat, QQ, Alipay, banking, most anti-cheat games): under a native bridge the app sees a proxied
JNIEnvpointing at translator trampolines, so a hook that rewrites/scans that memory faults at startup (observed:libowl.sohookingGetMethodID,libaff_biz.soinJNI_OnLoad). This is a property of x86 binary translation — libndk, berberis, and houdini all hit it, and no freely redistributable translator both targets Android 15 and tolerates these apps. Hardened arm64 apps need an arm64 host running the plain15.0image (native execution, no translation).Licensing
libndk_translationand the GMS APKs are Google-proprietary (extracted from ChromeOS / LiteGapps). This variant is for evaluation; redistribution terms are Google's, not cocoon's. Noted in the image README.