Skip to content

[pull] main from MetaMask:main#405

Merged
pull[bot] merged 6 commits into
Reality2byte:mainfrom
MetaMask:main
Dec 12, 2025
Merged

[pull] main from MetaMask:main#405
pull[bot] merged 6 commits into
Reality2byte:mainfrom
MetaMask:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Dec 12, 2025

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

juanmigdr and others added 6 commits December 12, 2025 08:37
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**
After a thorough profiling investigation, one of the issues I found is
that we are making O(n) API calls to the `bulk-scan` endpoint when NFT
auto-detection was being triggered, I have modified the code so that we
make 1 single API call per 250 urls.

<img width="993" height="924" alt="image"
src="https://github.com/user-attachments/assets/c6fccc10-9571-4436-af9a-1e9425c0054e"
/>

Core changes: MetaMask/core#7411
<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: reduced number of calls to bulk-scan for NFT detection

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/ASSETS-2068

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**


https://github.com/user-attachments/assets/d0232dec-b144-4f27-b085-0de417a9af20

<img width="734" height="797" alt="image"
src="https://github.com/user-attachments/assets/c6fccc10-9571-4436-af9a-1e9425c0054e"
/>
<!-- [screenshots/recordings] -->

### **After**


https://github.com/user-attachments/assets/053bca9b-9ee8-439b-bec7-4381fc6bc0b3

<img width="734" height="797" alt="image"
src="https://github.com/user-attachments/assets/40bc3d12-71d1-4c52-96e7-5502459b279c"
/>

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Switch NFT detection controller init from `addNft` to bulk `addNfts`
and upgrade `@metamask/assets-controllers` to ^94.0.0.
> 
> - **Engine**:
> - Update
`app/core/Engine/controllers/nft-detection-controller-init.ts` to bind
`addNfts` instead of `addNft` when constructing
`NftDetectionController`.
> - Adjust tests in
`app/core/Engine/controllers/nft-detection-controller-init.test.ts` to
expect `addNfts`.
> - **Dependencies**:
> - Bump `@metamask/assets-controllers` to `^94.0.0` (with corresponding
lockfile updates).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8f4a004. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

The DeFi detail page (DeFiProtocolPositionDetails) was transitioning
into the viewport like a bottom sheet (sliding up from bottom) due to
the parent Stack.Navigator using mode={'modal'}.
This PR changes the transition to slide in from right to left (standard
push navigation) by adding a custom cardStyleInterpolator with
horizontal translation, matching the pattern used by other screens like
TrendingTokensFullView, ExploreSearchScreen, and PerpsScreenStack.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Changed DeFi protocol detail page to slide in from
right instead of from bottom

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-263

## **Manual testing steps**

```gherkin
Feature: DeFi Protocol Position Details Navigation

  Scenario: user opens DeFi protocol position details
    Given user is on the Wallet view with DeFi positions visible

    When user taps on a DeFi protocol position
    Then the DeFi Protocol Position Details screen slides in from right to left
    And user can swipe from left edge to go back (gesture navigation)
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**


https://github.com/user-attachments/assets/f1437617-fac2-4fbb-aa97-6c9a18a03272

<!-- [screenshots/recordings] -->

### **After**


https://github.com/user-attachments/assets/2521f279-8fd3-4bd1-a49a-c3270e511a70


<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Switches `DeFiProtocolPositionDetails` to a right-to-left slide
transition via custom `cardStyleInterpolator`, updating snapshots
accordingly.
> 
> - **Navigation**
>   - `app/components/Nav/Main/MainNavigator.js`
> - `DeFiProtocolPositionDetails`: enable `animationEnabled` and add
horizontal `cardStyleInterpolator` (slides in from right), with
`headerShown: true`.
> - **Tests**
> - `app/components/Nav/Main/__snapshots__/MainNavigator.test.tsx.snap`:
update snapshot to include new screen options.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
5a7a46f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

The NFT details pages (NftDetails and NftDetailsFullImage) were
transitioning into the viewport like a bottom sheet (sliding up from
bottom) due to the parent Stack.Navigator using mode={'modal'}.
This PR changes the transition to slide in from right to left (standard
push navigation) by adding a custom cardStyleInterpolator with
horizontal translation, matching the pattern used by other screens like
TrendingTokensFullView, ExploreSearchScreen, and PerpsScreenStack.

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Updated NFT details pages to slide in from right
instead of from bottom

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-271

## **Manual testing steps**

```gherkin
Feature: NFT Details Navigation

  Scenario: user opens NFT details
    Given user is on the Wallet view with NFTs visible

    When user taps on an NFT
    Then the NFT Details screen slides in from right to left
    And user can swipe from left edge to go back (gesture navigation)

  Scenario: user opens NFT full image
    Given user is viewing NFT details

    When user taps on the NFT image to view full screen
    Then the NFT Full Image screen slides in from right to left
    And user can swipe from left edge to go back (gesture navigation)
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**


https://github.com/user-attachments/assets/80629490-2cff-4080-8feb-35d2929dfafa


### **After**


https://github.com/user-attachments/assets/8a635fac-4e98-42fe-b251-5b2880072c6b

## **Pre-merge author checklist**

- [x] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Switch NFT details screens to a right-to-left push animation with a
custom cardStyleInterpolator.
> 
> - **Navigation (MainNavigator.js)**:
> - Add `options` to `NftDetails` and `NftDetailsFullImage` to enable
horizontal slide transition (`animationEnabled: true` + custom
`cardStyleInterpolator`).
> - **Tests**:
> - Update snapshot to reflect new `options` on `NftDetails` and
`NftDetailsFullImage`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
d47ecf9. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

When selecting "Deposit" from the Trade Menu, the Deposit page was
sliding in from the bottom (default modal behavior). Per design
requirements, it should slide in from the right, consistent with other
navigation flows.
Applied the same cardStyleInterpolator pattern already used by:

- Settings (Routes.SETTINGS_VIEW)
- TrendingTokensFullView
- ExploreSearchScreen
- SitesFullView
- Perps

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry: Updated Deposit page transition to slide in from the
right instead of bottom

## **Related issues**

Fixes: https://consensyssoftware.atlassian.net/browse/MDP-235

## **Manual testing steps**

```gherkin
Feature: Deposit page navigation transition

  Scenario: user opens Deposit page from Trade Menu
    Given the user is on the Wallet home screen
    And the user has Deposit enabled

    When user taps on the Trade/Fund action button
    And user selects "Deposit" from the menu
    Then the Deposit page slides in from the right side of the screen
    And user can swipe from left edge to go back
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**


https://github.com/user-attachments/assets/fba1e102-92cc-4cf5-8bb5-d94bedbb48a4


<!-- [screenshots/recordings] -->

### **After**


https://github.com/user-attachments/assets/d18e1e5b-5b89-451d-87d5-b18446180cc9


<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Configures `StakeScreens` to hide the header and use a right-to-left
slide transition; updates snapshot accordingly.
> 
> - **Navigation**:
> - **`MainNavigator.js`**: Add custom options to `Stack.Screen` for
`StakeScreens`:
>     - `headerShown: false`
> - Enable right-to-left slide via `animationEnabled: true` and custom
`cardStyleInterpolator`.
> - **Tests**:
> - Update snapshot `MainNavigator.test.tsx.snap` to reflect new
`StakeScreens` options.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
f185550. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been
completely filled out, and PR status checks have passed at least once.
-->

## **Description**

Fix perps performance e2e tests. Tasks done:

- Updated tests according UI changes
- Remove dead code
- Unified numeric keyboard component for different flows
- Added a patch in appwright to set geoLocation in BrowserStack and
avoid perps blocks -> from main finally

<!--
Write a short description of the changes included in this pull request,
also include relevant motivation and context. Have in mind the following
questions:
1. What is the reason for the change?
2. What is the improvement/solution?
-->

## **Changelog**

<!--
If this PR is not End-User-Facing and should not show up in the
CHANGELOG, you can choose to either:
1. Write `CHANGELOG entry: null`
2. Label with `no-changelog`

If this PR is End-User-Facing, please write a short User-Facing
description in the past tense like:
`CHANGELOG entry: Added a new tab for users to see their NFTs`
`CHANGELOG entry: Fixed a bug that was causing some NFTs to flicker`

(This helps the Release Engineer do their job more quickly and
accurately)
-->

CHANGELOG entry:

## **Related issues**

Fixes:

## **Manual testing steps**

```gherkin
Feature: my feature name

  Scenario: user [verb for user action]
    Given [describe expected initial app state]

    When user [verb for user action]
    Then [describe expected outcome]
```

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [ ] I’ve followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [ ] I've completed the PR template to the best of my ability
- [ ] I’ve included tests if applicable
- [ ] I’ve documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [ ] I’ve applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.


<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Updates perps performance tests to new UI, adds open/close position
flow, refactors numeric input via shared AmountScreen, and sets
BrowserStack geoLocation to FR.
> 
> - **Tests (performance)**:
> - Add `appwright/tests/performance/login/perps-add-funds.spec.js` (add
funds flow + quote timings).
> - Add
`appwright/tests/performance/login/perps-position-management.spec.js`
(select market, set leverage, place order, close position with retry,
per-device account selection).
>   - Remove outdated `perps-onboarding.spec.js`.
> - **Screen Objects (Perps)**:
> - New: `PerpsMarketDetailsView`, `PerpsOrderView` (leverage, keypad,
place order), `PerpsPositionDetailsView` (close with retry, state
check), `PerpsPositionsView`, `PerpsClosePositionView`.
> - Update `PerpsDepositScreen`: new getters (`backButton`,
`addFundsButton`, `totalText`), visibility checks, `tapBackButton`,
`isAddFundsVisible`, `isTotalVisible`.
> - Update `PerpsMarketListView`: header expect, `selectMarket(symbol)`.
> - Update `PerpsTabView`: new tab id, add `startTrading` action, expect
usage.
> - **Utilities/Infra**:
> - Add `selectAccountDevice` in `Flows.js` (map device to account);
adjust flows usage.
>   - Remove `TimerHelper.withTimer` helper.
>   - Set BrowserStack `geoLocation: 'FR'`.
> - `BridgeScreen.enterSourceTokenAmount` now delegates to
`AmountScreen`.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
eb2abeb. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
…B) (#23869)

## **Description**

This PR optimizes Android E2E builds to prevent "Gradle Daemon
disappeared unexpectedly" crashes on the LG runner (16 vCPUs, 48GB RAM).

### Root Cause Analysis

The "Daemon disappeared" symptom is consistent with **process
termination under memory pressure** (e.g., OS OOM kill). On **lg
(48GB)**, the previous GitHub Actions Gradle config (`-Xmx16g`,
`workers.max=6`, `daemon=true`) could overlap with Node/Metro memory
usage and native compilation spikes.

### Solution: Optimized Gradle Memory Settings

Following [Gradle 8.10.2 Performance Best
Practices](https://docs.gradle.org/8.10.2/userguide/performance.html),
we tuned `gradle.properties.github` for the 48GB runner.

#### Improved Gradle Logging for E2E

- E2E builds now run Gradle with **`--stacktrace --info`** via
`scripts/build.sh` to provide more actionable logs when the build fails.
- Android CI uses **JDK 17** via `setup-e2e-env` defaults:
[setup-e2e-env
action](https://github.com/MetaMask/github-tools/blob/v1/.github/actions/setup-e2e-env/action.yml)

#### JVM Memory Changes

| Setting | Before | After | Reason |
|---------|--------|-------|--------|
| **Heap (`-Xmx`)** | 16GB | **12GB** | Leave room for Node.js/Metro |
| **Initial Heap (`-Xms`)** | (none) | **4GB** | Set JVM initial heap to
reduce early heap resizing: [Java launcher
docs](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html)
|
| **MaxGCPauseMillis** | (none) | **500ms** | Tune G1 pause-time goal
for CI throughput: [G1 GC tuning
guide](https://docs.oracle.com/en/java/javase/17/gctuning/garbage-first-g1-garbage-collector1.html)
|
| **ExitOnOutOfMemoryError** | (none) | **enabled** | Fail fast on JVM
OOM: [Java launcher
docs](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html)
|
| **file.encoding** | (none) | **UTF-8** | Pin JVM default charset (JDK
17 default can depend on OS/locale):
[Charset.defaultCharset()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/charset/Charset.html#defaultCharset())
|
| **OptimizeStringConcat** | enabled | **removed** | Remove non-standard
`-XX` tuning flag from baseline config (prefer defaults): [Java launcher
docs](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html)
|

#### Gradle Settings Changes

| Setting | Before | After | Reason |
|---------|--------|-------|--------|
| **Workers** | 6 | **2** | Prevent memory contention |
| **Daemon** | true | **false** | Disable persistent daemon between CI
builds: [Gradle
Daemon](https://docs.gradle.org/8.10.2/userguide/gradle_daemon.html#sec:disabling_the_daemon)
|
| **configureondemand** | true | **removed** | Not recommended for
modern Gradle + Android builds: [Gradle performance
guide](https://docs.gradle.org/8.10.2/userguide/performance.html);
[Android/AGP
compatibility](https://stackoverflow.com/questions/49990933/configuration-on-demand-is-not-supported-by-the-current-version-of-the-android-g)
|

#### Unchanged Settings (kept as-is)

| Setting | Value | Why Kept |
|---------|-------|----------|
| `parallel` | true | [Recommended for multi-project
builds](https://docs.gradle.org/8.10.2/userguide/performance.html#parallel_execution)
|
| `caching` | true | [Recommended build cache
usage](https://docs.gradle.org/8.10.2/userguide/build_cache.html) |
| `vfs.watch` | false | Already disabled in baseline config; we keep it
disabled for CI |
| `MaxMetaspaceSize` | 1g | Kept from baseline config |
| `UseG1GC` | enabled | Kept from baseline config |
| `G1HeapRegionSize` | 16m | Kept from baseline config |
| `UseStringDeduplication` | enabled | Kept from baseline config |

### Memory Budget (48GB Runner)

> Note: rough budgeting (actual usage varies by task and input changes)

```
┌─────────────────────────────────────────────────────────┐
│  Component              │  Allocation                   │
├─────────────────────────┼───────────────────────────────┤
│  Gradle Heap            │  12GB                         │
│  Gradle Metaspace       │  1GB                          │
│  Node.js (Metro)        │  8GB (--max-old-space-size)   │
│  OS + System + native   │  remainder                    │
└─────────────────────────┴───────────────────────────────┘
```

### Additional Optimizations

- **Skip AAB bundle for E2E** - E2E tests only use APK files.
- **Removed AAB references** from the E2E build workflow.
- **Runner moved from xl → lg** for this workflow after tuning: lg
(48GB) is sufficient.

### Documentation References

**Gradle 8.10.2:**
- [Performance
Guide](https://docs.gradle.org/8.10.2/userguide/performance.html)
- [Gradle
Daemon](https://docs.gradle.org/8.10.2/userguide/gradle_daemon.html)
- [Build
Cache](https://docs.gradle.org/8.10.2/userguide/build_cache.html)

**Java 17:**
- [Java launcher docs (heap, -X/-XX, OOM
behavior)](https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html)
-
[Charset.defaultCharset()](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/nio/charset/Charset.html#defaultCharset())
- [G1 GC tuning
guide](https://docs.oracle.com/en/java/javase/17/gctuning/garbage-first-g1-garbage-collector1.html)

### Official Runner Specs
([source](https://cirrus-runners.app/setup/#__tabbed_3_2))

| Runner | vCPUs | RAM | Disk |
|--------|-------|-----|------|
| **lg** | 16 | 48 GB | 200 GB |
| xl | 32 | 96 GB | 400 GB |

## **Changelog**

CHANGELOG entry: null

## **Related issues**

Fixes:
[INFRA-3174](https://consensyssoftware.atlassian.net/browse/INFRA-3174)

## **Manual testing steps**

```gherkin
Feature: Android E2E Build Optimization

  Scenario: Build completes without daemon disappearance
    Given the PR uses tuned Gradle memory settings
    And Gradle runs with --stacktrace --info for E2E

    When the Android E2E build workflow runs
    Then the build completes without the "Daemon disappeared" failure
    And APK artifacts are uploaded successfully
```

## **Screenshots/Recordings**

### **Before**

Build failing with:
```
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)
```

### **After**

Build results will be visible in PR checks after workflow runs.

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.

## **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.

[INFRA-3174]:
https://consensyssoftware.atlassian.net/browse/INFRA-3174?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
@pull pull Bot locked and limited conversation to collaborators Dec 12, 2025
@pull pull Bot added the ⤵️ pull label Dec 12, 2025
@pull pull Bot merged commit 28a08fe into Reality2byte:main Dec 12, 2025
1 of 11 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants