Skip to content

os-image: android:15.0-gms — GMS + ARM translation for x86_64#124

Merged
CMGS merged 1 commit into
masterfrom
feat/android-gms-ndk
Jul 12, 2026
Merged

os-image: android:15.0-gms — GMS + ARM translation for x86_64#124
CMGS merged 1 commit into
masterfrom
feat/android-gms-ndk

Conversation

@CMGS

@CMGS CMGS commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

Adds an android:15.0-gms image 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.0

  • libndk_translation — Google ARM→x86 translator (ChromeOS prebuilt, same source + pin as waydroid_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 wires ro.dalvik.vm.native.bridge in both system and vendor build.prop.
  • GMS core (LiteGapps lite): GmsCore, Play Store, Google Services Framework, sync adapters. Chrome and other Google apps install natively through Play once signed in.
  • binfmt_misc in 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/amd64 only (translator + GMS are x86_64; the existing os-image/android/platforms already 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.so active, binfmt_misc registered arm64_dyn/arm64_exe.
  • GMS three-piece present: com.google.android.gms, com.android.vending (Play Store), com.google.android.gsf.
  • Meituan (arm64-v8a only): installs, launches, renders the privacy dialog → home — an ordinary arm64 app runs end to end.

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 JNIEnv pointing at translator trampolines, so a hook that rewrites/scans that memory faults at startup (observed: libowl.so hooking GetMethodID, libaff_biz.so in JNI_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 plain 15.0 image (native execution, no translation).

Licensing

libndk_translation and 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.

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.
@CMGS CMGS merged commit 72b095c into master Jul 12, 2026
4 checks passed
@CMGS CMGS deleted the feat/android-gms-ndk branch July 12, 2026 02:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant