Boot Android emulators slim: guest RAM, low-RAM mode, and the feature profile
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 38/100
- Issue type
- Feature
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- android, typescript
- Domain
- devtools, documentation, mobile-dev
Research direction
Read docs/internal/adr/0006-opt-in-slim-android-emulators.md and compare the iOS path in src/drivers/android/index.ts, src/core/config.ts, src/daemon/main.ts, and the listed tests. Run the focused Android driver/config tests first, then verify the emulator flags, featureProfile, hashes, advisories, documentation, and pnpm check; the slow real-emulator lane must also pass when an Android SDK is available.
Written by the indexing model from the issue text.
Description
Part of #159.
Scope
After this PR a slim Android device runs with the configured guest RAM and, unless turned off, as a low-RAM device. The mode rules are those of #172: android.defaultMode sets the default, --mode slim gets a slim device on any worker, and the lease reports mode: "slim". A --mode full lease gets a stock emulator on its own pool key, as on iOS. simlock doctor names an installed image that ignores the RAM size. No package is disabled yet; that is the next task.
{
"android": {
"defaultMode": "full", // default
"slim": {
"ramMb": 1536, // guest RAM in MiB for a slim device
"lowRam": true // boot the guest as a low-RAM device
}
}
}
A changed key applies at a device's next boot and rebuilds that device's clean baseline once. Nothing under android.slim is settable from a lease request, MCP, or HTTP.
Technical spec
Written before #172, which replaces slim.enabled, the full flag, and featureProfile. Revise this section against #172 before approval.
Modules touched
src/core/config.ts:android.slimblock besideandroid.emulator(#148) with the defaults above. Validators reject a non-booleanenabledorlowRamand aramMbthat is not a positive integer, naming the key. A gateway already warns about and ignores theandroidkey; only the docs list changes.src/contract/schemas.ts: the config block sosimlock configandconfig.getrender it.src/daemon/main.ts: threadconfig.android.slimintodiscoverAndroidDriverasslim, the wayconfig.ios.slimreaches the iOS driver.src/drivers/android/data.ts:AndroidDriverData.full?: true;isAndroidDriverDataaccepts data with or without it.src/drivers/android/index.ts:AndroidDriverOptions.slim(AndroidSlimOptions, optional; omitted equals disabled).reducesFeaturesisslim?.enabled === true.provisionstampsfull: trueinto driver data whenspec.fullis true, and nothing otherwise, so a normal spec's driver data stays byte-identical.- One function decides whether slim applies to a device: enabled and not
full. Every other site calls it (architecture rule 10). #startEmulatorappends-memory <ramMb>and, whenlowRam,-lowramafter theandroid.emulatorflags, on every boot of a device slim applies to, recovery included (ADR 0006 §2).#currentConfigHashgains the device's slim inputs (ramMb,lowRam) only when slim applies, and appends nothing otherwise, so a baseline captured before this change keeps its hash for slim off and for afulldevice (ADR 0006 §3).#configHashand#captureBaselinepass the device through.makeReadyreturnsfeatureProfileon every path, including the already-running path and arecoverboot:undefinedwhile slim is off,"full"for afulldevice,"reduced"otherwise (ADR 0006 §5).advisories()returns oneslim-image-ram-flooradvisory naming each installed image whose tag ends in_ps16kwhile slim is on andramMbis below 4096 (ADR 0006 §9). Read-only, same contract aslistCatalog.
docs/CONFIGURATION.md: the three keys in the table, their validation, the next-boot and baseline-rebuild rules, the gateway-ignored list, a slim section that no longer says iOS-only and says what to pair:capacity.config.ramBudget.androidBytesPerDeviceandandroid.emulator.gpu.docs/CLI.md:--full,featureProfile, and thedoctoradvisory text no longer say Android is ignored or absent.docs/HTTP-API.md: the same forfullandslim.docs/internal/KNOWN-PITFALLS.md: an Android slim section: a config change wipes each device once, low-RAM mode is app-visible, 16 KiB images gain nothing.e2e/slow-android-slim.test.ts: the real-emulator lane, gated likeslow-android-smoke.test.ts.
Contract and event changes
None beyond the config schema. No new operation, event, or lease-request field. lease.request must not gain slim.
Rules in play
docs/internal/adr/0006-opt-in-slim-android-emulators.md§1 to §5 and §9: the design this task builds.docs/internal/adr/0002-opt-in-slim-ios-simulators.md§6:fulland pool identity, reused unchanged.docs/internal/agent-rules/architecture.md: rule 2 (the core forwards the block unread), rule 10 (one "does slim apply" decision), rule 13 (the iOS-only claims in the docs become false).docs/internal/agent-rules/safety.md: rule 2 (a recovery boot keeps the flags and changes nothing else), rule 9 (config fails closed).docs/internal/agent-rules/testing.md.
Tests
- With
android.slimabsent, the emulator launch command is byte-for-byte what it was before this change andmakeReadyreports nofeatureProfile. - With slim enabled, a device's launch adds
-memory 1536 -lowramafter theandroid.emulatorflags andmakeReadyreportsfeatureProfile: "reduced". - With
lowRam: falsethe launch adds-memory 1536and not-lowram. - A
fullspec is stampedfull: trueinto driver data, its launch carries neither flag, andmakeReadyreportsfeatureProfile: "full". - A
recoverboot of a slim device carries the same launch flags as aprepareboot and runs no baseline logic. - The already-running path of
makeReadyreports the samefeatureProfileas a fresh boot. reducesFeaturesis true exactly whenandroid.slim.enabledis true.- Enabling slim, or changing
ramMborlowRam, changes the baseline hash of a non-full device and does not change it for afulldevice or with slim off. advisories()names each installed*_ps16kimage while slim is on andramMbis below 4096, and returns nothing while slim is off orramMbis 4096 or more.- A non-boolean
android.slim.enabled, a non-booleanandroid.slim.lowRam, or anandroid.slim.ramMbthat is not a positive integer is rejected at config load, naming the key. isAndroidDriverDataaccepts driver data with and withoutfull.simlock configrenders theandroid.slimblock with its defaults (e2e, fast lane).lease.requestcarrying aslimfield isBAD_REQUEST.- Slow lane, real emulator: a slim lease's guest reports
ro.config.low_ramastrueand aMemTotalnear 1536 MiB, its grant carriesfeatureProfile: "reduced", and a--fulllease of the same spec reports neither and carriesfeatureProfile: "full".
Done when
- Every test above passes and
pnpm checkis green. - With default config the emulator launch command is byte-for-byte what it was before.
simlock configshows the block.docs/CONFIGURATION.md,docs/CLI.md, anddocs/HTTP-API.mdsay what the Modules section lists, and no end-user doc says slim is iOS-only or that--fullis ignored on Android.- The slow lane passes on a machine with an Android SDK.
Out of scope
- Disabling packages,
android.slim.categories, thedevice.slimmedevent: the next task. - Guest settings of any kind.
- Any change to the capacity RAM budget.
- Headless, GPU, audio, boot animation: #148.
Depends on
- #148
- #172
Approval
- Approved for delivery
Written by an agent.
- Dominant language
- TypeScript
- Stars
- 15
- Forks
- 1
- Avg merge
- 16h 4m
- Merged PRs (30d)
- 104
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from callstackincubator/simlock
-
bug:new
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
callstackincubator/simlock#350 ·
Maintainers usually reply within 1 day
-
bug:new flaky-test
Difficulty 3/5 1-2 days Newbie friendliness 48/100
callstackincubator/simlock#354 ·
Maintainers usually reply within 1 day
-
task:draft
Difficulty 4/5 3-5 days Newbie friendliness 52/100
callstackincubator/simlock#349 ·
Maintainers usually reply within 1 day
-
task:draft
Difficulty 4/5 3-5 days Newbie friendliness 65/100
callstackincubator/simlock#348 ·
Maintainers usually reply within 1 day
-
`usage.get` and `simlock stats`: the figures from the event history, on a worker and a gatewayPossibly taken @V3RON claimed this today. Opentask:ready
callstackincubator/simlock#347 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in callstackincubator/simlock
Similar issues
-
Link Checker ReportOpenautomated issue report
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
databendlabs/databend-docs#3511 ·
-
area/dashboard kind/bug QA/dev-automation
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
rancher/dashboard#19379 · 2 comments ·
Maintainers usually reply within 5 days
-
perf(core): getComments() runs the approved count and the comment list as two sequential queriesOpenarea/core bot:bug bot:working
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
emdash-cms/emdash#3905 · 2 comments ·
Maintainers usually reply within 1 day
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficulty 1/5 Under an hour Newbie friendliness 90/100
lingdojo/kana-dojo#31728 · 1 comment · 5 reactions ·
Maintainers usually reply within 1 day
-
selective-claw: freshTailTurns=0 keeps ALL turns verbatim and summarizes none (slice(-0) === slice(0))Possibly taken @zjncs claimed this today. Opencomponent:tokenless
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
agentic-os-org/ANOLISA#6112 · 1 comment ·
Maintainers usually reply within 1 day