This review is scoped to this repository, not to every Android 17 platform change:
tools/must keep collecting memory evidence on Android 17 devices, including cases where the target process has already exited.demo/memory-labmust build and run as an API 37 target.docs/must distinguish offline parser compatibility from device-side Android 17 evidence.
| Area | Status | Evidence |
|---|---|---|
| Android 17 SDK | compileSdk = 37, targetSdk = 37 |
demo/memory-lab/app/build.gradle.kts |
| AGP/Gradle | AGP 9.2.0, Gradle 9.4.1; above the Android 17 setup minimum AGP 8.9.0-rc01 |
demo/memory-lab/build.gradle.kts, gradle-wrapper.properties |
| 16 KB page size | Existing non-legacy JNI packaging and 16 KB ELF alignment remain required | app/build.gradle.kts, CMakeLists.txt |
| Android 17 memory-limiter evidence | Live dump and demo capture now archive raw exit-info, memory-limiter status, package UID, process list, and device metadata |
tools/live_dumper.py, scripts/capture_memory_lab.sh |
| Large-screen target behavior | Demo has no orientation, aspect ratio, or resize opt-out restrictions and uses a scrollable root | AndroidManifest.xml, activity_main.xml |
Device-side validation is still required on an Android 17 device with SDK 37 platform/build tools installed locally.
Android 17 maps to API 37. The demo must review compileSdk and targetSdk separately:
android {
compileSdk = 37
defaultConfig {
targetSdk = 37
}
}compileSdk allows access to API 37. targetSdk opts the demo into Android 17 target-only behavior changes.
Before building, verify the local environment:
java -version
ls "$ANDROID_HOME/platforms/android-37"
ls "$ANDROID_HOME/build-tools" | grep '^37'Android 17 setup also requires a compatible Android Studio/SDK setup and Build Tools 37.x. AGP 9.2.0 is already above the published minimum AGP 8.9.0-rc01, so this repo does not need an AGP bump only for API 37.
Android 17 introduces app memory limits as an all-app behavior on Android 17 devices. This is not gated only by targetSdk = 37, and the limits are only imposed on a subset of devices.
Evidence priority for this repository:
exit_info.txtcontains anApplicationExitInfodescription withMemoryLimiter:AnonSwap; the exit reason is expected to beREASON_OTHER.memory_limiter_status.txtshows device-level memory-limiter status and configured limits.meminfo.txt,proc_meminfo.txt,zram_swap.txt,smaps.txt, andshowmap.txtexplain the memory shape before or around the event.
am memory-limiter status is a global capability/configuration signal. It does not prove the current package was killed by the limiter. Treat exit-info as the stronger source.
Trigger-based profiling can use TRIGGER_TYPE_ANOMALY to collect heap dumps before the system kills a process for anomalous memory usage. Do not treat TRIGGER_TYPE_OOM as the primary Android 17 memory-limiter signal unless separate evidence shows an actual Java or native OOM path.
The live dumper now creates the dump directory and archives Android 17 evidence before requiring a running PID. This matters because a memory-limiter investigation often starts after the target process has already exited.
Expected artifacts:
build_fingerprint.txt,android_release.txt,android_sdk.txt,page_size.txtpackage_uid.txt,processes.txt,activity_processes.txtexit_info.txtorexit_info.errmemory_limiter_status.txtormemory_limiter_status.err- If the process is running:
showmap.txt,smaps.txt,meminfo.txt,gfxinfo.txt,proc_meminfo.txt,zram_swap.txt,dmabuf_debug.txt, and optionalheap.hprof
If the process is not running, the dump is still useful for exit diagnostics but is not a full panorama sample.
For apps targeting API 37, Android 17 removes the developer opt-out from orientation and resizability behavior on large-screen devices. The demo currently has no manifest orientation, resize, or aspect-ratio restrictions, and its main content is scrollable.
Validation still needs a real Android 17 large-screen or resizable environment:
- Rotate the device and resize the window when possible.
- Confirm all scenario buttons remain reachable.
- Confirm status text and bottom actions are not clipped after recreation.
-
compileSdk = 37 -
targetSdk = 37 - Android SDK Platform 37 is installed
- Build Tools 37.x is installed and used for
zipalign - APK builds with JDK 17 and AGP
9.2.0 - APK passes
zipalign -c -P 16 - Capture records Android release/sdk, build fingerprint, and page size
- Capture records
exit-infoandam memory-limiter status - If
MemoryLimiter:AnonSwapis present, conclusions citeexit-info, not only memory totals - Missing
smaps,showmap, ordmabufis reported as unavailable, not as zero
cd demo/memory-lab
./gradlew :app:assembleDebug
APK=app/build/outputs/apk/debug/app-debug.apk
BUILD_TOOLS_37="$(ls -d "$ANDROID_HOME"/build-tools/37* | tail -n 1)"
"$BUILD_TOOLS_37/zipalign" -c -P 16 -v 4 "$APK"
adb install -r "$APK"
adb shell am force-stop com.androidperformance.memorylab
adb shell monkey -p com.androidperformance.memorylab 1
# After triggering scenarios in the app:
./scripts/capture_memory_lab.sh com.androidperformance.memorylab ./captures/android17
cd ../..
python3 analyze.py panorama -d demo/memory-lab/captures/android17 --markdown -o demo/memory-lab/captures/android17/report.mdIf the process was killed before capture:
python3 analyze.py live --package com.androidperformance.memorylab --dump-only -o ./dumpsUse the resulting exit_info.txt, memory_limiter_status.txt, processes.txt, and meta.txt as the first-pass evidence.
- Android 17 SDK setup: https://developer.android.com/about/versions/17/setup-sdk
- Android 17 behavior changes for all apps: https://developer.android.com/about/versions/17/behavior-changes-all
- Manage your app's memory: https://developer.android.com/topic/performance/memory
- Android 17 resizability and orientation changes: https://developer.android.com/blog/posts/prepare-your-app-for-the-resizability-and-orientation-changes-in-android-17