Skip to content

fix(android): drop x86 ABI from production AAB to satisfy Play 64-bit rule#30642

Merged
andrepimenta merged 3 commits into
mainfrom
fix/android-drop-x86-release-aab
May 27, 2026
Merged

fix(android): drop x86 ABI from production AAB to satisfy Play 64-bit rule#30642
andrepimenta merged 3 commits into
mainfrom
fix/android-drop-x86-release-aab

Conversation

@andrepimenta

@andrepimenta andrepimenta commented May 26, 2026

Copy link
Copy Markdown
Member

Description

After #30590 excluded x86_64 from the production AAB (to silence Play's 16 KB page-size warning), Play started rejecting the next release with:

This release is not compliant with the Google Play 64-bit requirement.
The following APKs or App Bundles are available to 64-bit devices, but they only have 32-bit native code: 5174

Play's 64-bit rule requires every 32-bit ABI shipped to be paired with its 64-bit equivalent:

32-bit ABI Required 64-bit pair Status before this PR
armeabi-v7a arm64-v8a paired
x86 x86_64 unpaired (x86_64 removed in #30590)

Shipping x86 without x86_64 is what triggered the rejection.

Fix

Drop x86 too, making production ARM-only (armeabi-v7a + arm64-v8a). This satisfies both:

  • 64-bit rulearmeabi-v7a is paired with arm64-v8a; no unpaired 32-bit ABI remains.
  • 16 KB rule — no x86_64 means no x86_64 libconceal.so / libsecp256k1.so warnings.

android/app/build.gradle's existing abiFilters(*reactNativeArchitectures()) plumbing automatically picks up the new list, so this is a one-file change.

User impact

Essentially zero. Real Android phones haven't shipped on x86 since ~2016 (the Asus Zenfone 2 era). Any modern Chromebook or emulator that could run x86 is also arm64-v8a or x86_64-capable, and Play picks one of those instead. android/gradle.properties.github.dual-versions (used for BrowserStack real-device runs) has been on armeabi-v7a,arm64-v8a all along, so this just brings the main release config in line with the proven-real-devices target set.

What's NOT changing

  • android/gradle.properties (default, local dev) — still ships all four ABIs for emulator support.
  • android/gradle.properties.github (CI E2E) — still uses x86_64.
  • android/gradle.properties.github.dual-versions — already armeabi-v7a,arm64-v8a.

Changelog

CHANGELOG entry: null

Related issues

Fixes: Google Play "This release is not compliant with the Google Play 64-bit requirement" rejection introduced by #30590.

Follow-up trackers for fixing the underlying 16 KB alignment so we can re-add x86_64 / x86 if ever needed:

Manual testing steps

Feature: Production AAB no longer contains x86 or x86_64 ABIs

  Scenario: A production release build is generated
    Given a clean checkout of this branch
    When the production AAB is built via the standard release workflow
      (cp android/gradle.properties.release android/gradle.properties
       before ./gradlew bundleProdRelease)
    Then `unzip -l app-prod-release.aab | grep '/lib/'` shows only
      `lib/arm64-v8a/` and `lib/armeabi-v7a/` entries
    And no `lib/x86/` or `lib/x86_64/` entries appear

  Scenario: Local dev on x86_64 emulator still works
    Given default android/gradle.properties (unchanged) is in use
    When `yarn android` is run
    Then x86_64 native libs are still produced and the app installs/runs

  Scenario: CI E2E on x86_64 emulator still works
    Given android/gradle.properties.github (unchanged) overlays for CI
    When `./gradlew assembleProdDebug` runs
    Then the resulting APK contains `lib/x86_64/` and Detox tests pass

  Scenario: Play Console upload succeeds
    Given a production AAB built from this branch
    When the AAB is uploaded to the Play Console
    Then the 64-bit compliance check passes
    And no 16 KB page-size warning appears for x86_64 .so files

Screenshots/Recordings

Before

Play Console:

Error: This release is not compliant with the Google Play 64-bit requirement.
The following APKs or App Bundles are available to 64-bit devices, but they only have 32-bit native code: 5174

After

64-bit compliance check passes; 16 KB warning for x86_64 .so files remains cleared.

Pre-merge author checklist

  • I've followed MetaMask Contributor Docs and MetaMask Mobile Coding Standards.
  • I've completed the PR template to the best of my ability
  • I've included tests if applicable — N/A (build-config change; verification is via the unzip -l check on the produced AAB and the Play Console upload)
  • I've documented my code using JSDoc format if applicable — N/A
  • I've applied the right labels on the PR — team-mobile-platform

Performance checks (if applicable)

  • I've tested on Android — gradle.properties.github.dual-versions has been on armeabi-v7a,arm64-v8a for BrowserStack real-device runs without issue.
  • I've tested with a power user scenario — N/A (no JS behavior change)
  • I've instrumented key operations with Sentry traces — N/A

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

Made with Cursor


Note

Low Risk
Single release Gradle property change; default and CI gradle files still ship x86/x86_64 for dev and emulators.

Overview
Production release builds now package only armeabi-v7a and arm64-v8a native ABIs by updating reactNativeArchitectures in android/gradle.properties.release (removing x86).

That pairs with the earlier removal of x86_64 so Play’s 64-bit rule is satisfied—x86 without x86_64 was causing rejection—while keeping the 16 KB page-size workaround (no bundled x86_64 .so from keychain/crypto AARs). Comments in the same file document why both Intel ABIs are omitted; ndk.abiFilters in app/build.gradle already reads this property, so no Gradle code changes.

Local dev (gradle.properties) and CI E2E (gradle.properties.github) are unchanged.

Reviewed by Cursor Bugbot for commit 626b4e5. Bugbot is set up for automated code reviews on this repo. Configure here.

… rule

PR #30590 excluded x86_64 from the production AAB to silence Play's
16 KB page-size warning. That left the release configured for three
ABIs: armeabi-v7a, arm64-v8a, and x86.

This now violates Play's 64-bit requirement, which mandates that every
32-bit ABI shipped must be paired with its 64-bit equivalent:

  - armeabi-v7a (32-bit ARM) <-> arm64-v8a (64-bit ARM)  -> paired
  - x86         (32-bit x86) <-> x86_64    (64-bit x86)  -> unpaired

Shipping x86 alone (without x86_64) trips the rule, and Play rejected
the bundle with: "This release is not compliant with the Google Play
64-bit requirement."

Drop x86 from gradle.properties.release so the production AAB ships
ARM-only (armeabi-v7a + arm64-v8a). This satisfies both:

  - 64-bit rule: armeabi-v7a is paired with arm64-v8a; no unpaired
    32-bit ABI remains.
  - 16 KB rule: no x86_64 means no x86_64 libconceal.so / libsecp256k1.so
    warnings.

User impact is essentially zero: x86 Android phones haven't shipped
since ~2016, and any modern Chromebook or emulator that could run x86
is also arm64- or x86_64-capable, so Play would pick one of those
instead. gradle.properties.github.dual-versions has already been using
armeabi-v7a,arm64-v8a as the production-equivalent target, so this
just brings the main release config in line.

Untouched:
- android/gradle.properties (default, local dev) still ships all four
  ABIs for emulator support.
- android/gradle.properties.github (CI E2E) still uses x86_64.
- android/app/build.gradle's abiFilters plumbing picks up the new
  list automatically.

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions github-actions Bot added the pr-not-ready-for-e2e Skip E2E and block merging. Remove this label once the PR is ready to run the E2E tests. label May 26, 2026
@metamaskbotv2 metamaskbotv2 Bot added the team-mobile-platform Mobile Platform team label May 26, 2026
@andrepimenta andrepimenta marked this pull request as ready for review May 26, 2026 15:19
@andrepimenta andrepimenta removed the pr-not-ready-for-e2e Skip E2E and block merging. Remove this label once the PR is ready to run the E2E tests. label May 26, 2026
@andrepimenta andrepimenta added the skip-sonar-cloud Only used for bypassing sonar cloud when failures are not relevant to the changes. label May 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

  • Selected E2E tags: None (no tests recommended)
  • Selected Performance tags: None (no tests recommended)
  • Risk Level: low
  • AI Confidence: 97%
click to see 🤖 AI reasoning details

E2E Test Selection:
The change is limited to android/gradle.properties.release, which is a build configuration file for Android release builds. The modification removes x86 from the reactNativeArchitectures property (changing from armeabi-v7a,arm64-v8a,x86 to armeabi-v7a,arm64-v8a), along with an updated comment explaining why both x86 and x86_64 are excluded.

This change:

  1. Only affects which CPU architectures are bundled in the Play Store release APK/AAB
  2. Has no impact on app logic, UI components, controllers, or runtime behavior
  3. Does not affect E2E test execution (Detox tests run on ARM-based devices/emulators, not x86)
  4. Does not affect any user-facing functionality
  5. Is a pure build/packaging configuration change

No E2E tests need to run to validate this change, as it has no bearing on app behavior or test infrastructure.

Performance Test Selection:
This is a build configuration change affecting only which CPU architectures are included in the release APK/AAB. It has no impact on app performance, rendering, data loading, or any runtime behavior. No performance tests are needed.

View GitHub Actions results

@sonarqubecloud

Copy link
Copy Markdown

@andrepimenta andrepimenta merged commit 045a378 into main May 27, 2026
132 of 139 checks passed
@andrepimenta andrepimenta deleted the fix/android-drop-x86-release-aab branch May 27, 2026 09:56
@github-actions github-actions Bot locked and limited conversation to collaborators May 27, 2026
@metamaskbotv2 metamaskbotv2 Bot added the release-7.80.0 Issue or pull request that will be included in release 7.80.0 label May 27, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

release-7.80.0 Issue or pull request that will be included in release 7.80.0 size-S skip-sonar-cloud Only used for bypassing sonar cloud when failures are not relevant to the changes. team-mobile-platform Mobile Platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants