Repository navigation
Android: run without Google Play services; UnifiedPush delivery - #6103
Conversation
De-Googled Android (GrapheneOS, CalyxOS, /e/OS, LineageOS without GApps) is supported implicitly, with no build mode: - GoogleServices proxies every Play services / Play Core / Firebase call behind isPlayServicesAvailable or isPlayStoreInstalled. Location, Google sign-in, in-app review, Nearby, Wear OS and Play Integrity now fall back or report unsupported instead of hanging or prompting for Play services. - scripts/check-android-gms-isolation.py (own workflow) holds the port to that: only the allow-listed, guarded proxies may name a Google Play type. - Framework location fallback for background updates and geofences (FrameworkLocationReceiver); fixes the inverted GNSS register/unregister. - registerPush reports pushRegistrationError when no transport exists. - UnifiedPush transport for PushClient apps (android.unifiedPush.vapidKey or android.messagingService=unifiedpush): endpoints are Web Push subscriptions sent as cn1-web- keys, so the push server needs no change. The activity tries FCM, then HMS, then UnifiedPush. - Builder: <queries> for Play services and the Play Store, the startup FCM fetch guarded, hints declared in the catalog. - The JDK 21 Android leg runs the device suite on an AOSP image without Google apps. - Developer guide chapter with the feature matrix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Outdated or updating Play services counts as present (no regression on Google devices). - <queries> names com.huawei.hwid when Push Kit is bundled. - UnifiedPush endpoint rotation and unregistration persist while the app is not running. - GMS gate also catches wildcard imports and qualified-name string prefixes. - Docs note the framework location fallback on Google devices without Play location. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cloudflare Preview
|
|
Compared 227 screenshots: 227 matched. |
|
Compared 191 screenshots: 191 matched. Native Android coverage
✅ Native Android screenshot tests passed. Native Android coverage
Benchmark ResultsDetailed Performance Metrics
|
✅ Continuous Quality ReportTest & Coverage
Static Analysis
Generated automatically by the PR CI workflow. |
- Exclude the unifiedpush package from the NetBeans/Ant port compile too (nbproject/project.properties), as build.xml and the Maven pom do. - Move the guide's build hint example into a docs/demos snippet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Flutter vs Codename OneSame application, built both ways: Flutter's AOT compile of the gallery, and the identical Dart source transpiled to Java on Codename One. Lower is better for every metric, so a ratio above 1.00x means Codename One is ahead by that factor. android9 interleaved rounds; host load 0.61, 1.7, 1.28
Compute -- the VM workloads (
Gate: within tolerance against
javascript9 interleaved rounds; host load 2.14, 1.27, 0.53
Compute -- the VM workloads (
Gate: within tolerance against
linux9 interleaved rounds; host load 0.27, 2.79, 2.24
Compute -- the VM workloads (
Gate: within tolerance against
windows9 interleaved rounds
Compute -- the VM workloads (
Gate: within tolerance against
Codename One wins 18 of 18 measured metrics across 4 platform(s). |
|
Developer Guide build artifacts are available for download from this workflow run:
Developer Guide quality checks: |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The AOSP default image uses 3-button navigation, which draws a grey bar over the bottom 48px of every capture (and insets bottom sheets by its height), so 104 screenshots differed from the Google-image references while the app rendered identically. Switch the emulator to gesture navigation before the suite, as the google_apis image is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
✅ ByteCodeTranslator Quality ReportTest & Coverage
Benchmark Results
Static Analysis
Generated automatically by the PR CI workflow. |
Codename One apps now run on Android devices with no Google Play services: GrapheneOS, CalyxOS, /e/OS and LineageOS without Google apps. There's no build mode; the same APK checks at run time.
Changes
GoogleServicesproxy. Every call into Play services, Play Core or Firebase goes through it, and it answers whether Play services is actually usable on the device. An outdated or updating Play services still counts as present, so nothing changes on Google devices.registerPushreports an error instead of never answering.PushClientapps. Turned on by theandroid.unifiedPush.vapidKeyhint, or forced withandroid.messagingService=unifiedpush. A UnifiedPush endpoint is a Web Push subscription, sent as acn1-web-device key, so the push server needs no change. The activity tries FCM, then Huawei Push Kit, then UnifiedPush.<queries>entries for Play services, the Play Store and HMS Core.scripts/check-android-gms-isolation.py, in its own workflow. Only the allow-listed proxies may name a Google Play type, and wildcard imports and string prefixes are caught too.defaultimage, which has no Google apps.No IAP changes.
Verification
🤖 Generated with Claude Code