Skip to content

Latest commit

 

History

History
132 lines (91 loc) · 6.04 KB

File metadata and controls

132 lines (91 loc) · 6.04 KB

Android 17 / API 37 适配 Review

这份 review 只覆盖本仓库真实会受影响的边界:

  • tools/ 要能在 Android 17 设备上保留内存证据,包括目标进程已经被杀掉的场景。
  • demo/memory-lab 要真正以 API 37 编译和运行。
  • docs/ 要区分离线解析兼容和 Android 17 设备侧证据。

当前结论

项目面 当前状态 证据
Android 17 SDK compileSdk = 37targetSdk = 37 demo/memory-lab/app/build.gradle.kts
AGP/Gradle AGP 9.2.0、Gradle 9.4.1,高于 Android 17 setup 要求的 AGP 8.9.0-rc01 下限 demo/memory-lab/build.gradle.ktsgradle-wrapper.properties
16 KB page size 继续保留 non-legacy JNI packaging 和 16 KB ELF alignment app/build.gradle.ktsCMakeLists.txt
Android 17 memory limiter 证据 一键采集和 demo 脚本都会归档 raw exit-info、memory-limiter status、package UID、进程列表和设备元信息 tools/live_dumper.pyscripts/capture_memory_lab.sh
大屏 target 行为 Demo 没有方向、宽高比、resize opt-out 限制,主界面是可滚动根布局 AndroidManifest.xmlactivity_main.xml

还缺的是 Android 17 真机或模拟环境的设备侧复验;本地构建和 zipalign 可以按第 6 节命令复跑。

1. 构建适配

Android 17 对应 API 37。Demo 要分开 review compileSdktargetSdk

android {
    compileSdk = 37

    defaultConfig {
        targetSdk = 37
    }
}

compileSdk 决定能否引用 API 37;targetSdk 才会让 Android 17 target-only 行为生效。

本地构建前先确认:

java -version
ls "$ANDROID_HOME/platforms/android-37"
ls "$ANDROID_HOME/build-tools" | grep '^37'

Android 17 setup 还要求兼容的 Android Studio/SDK 和 Build Tools 37.x。当前 AGP 9.2.0 已高于官方 AGP 8.9.0-rc01 下限,所以不需要只为 API 37 再升级 AGP。

2. App Memory Limits

Android 17 引入的 app memory limits 是 Android 17 设备上的 all-app 行为,不是只有 targetSdk = 37 才触发;并且该限制只会在部分设备上施加。

本仓库的证据优先级:

  1. exit_info.txtApplicationExitInfo 的 description 包含 MemoryLimiter:AnonSwap;对应 exit reason 预期是 REASON_OTHER
  2. memory_limiter_status.txt 说明设备级 memory-limiter 状态和当前限制配置。
  3. meminfo.txtproc_meminfo.txtzram_swap.txtsmaps.txtshowmap.txt 解释事件前后内存形态。

am memory-limiter status 是全局能力和配置证据,不能单独证明当前 package 被 limiter 杀掉。判断是否命中 limiter 时,以 exit-info 中的 MemoryLimiter:AnonSwap 为更强证据。

Trigger-based profiling 可以用 TRIGGER_TYPE_ANOMALY 在系统杀进程前抓 heap dump。不要把 TRIGGER_TYPE_OOM 写成 Android 17 memory limiter 的核心证据,除非另有 Java 或 native OOM 证据。

3. 采集行为

现在 live dumper 会先创建采集目录,并在依赖 PID 的采集前归档 Android 17 证据。这样当目标进程已经被 memory limiter 杀掉时,仍然能保留最近一次退出相关材料。

预期产物:

  • build_fingerprint.txtandroid_release.txtandroid_sdk.txtpage_size.txt
  • package_uid.txtprocesses.txtactivity_processes.txt
  • exit_info.txtexit_info.err
  • memory_limiter_status.txtmemory_limiter_status.err
  • 如果进程仍在运行:showmap.txtsmaps.txtmeminfo.txtgfxinfo.txtproc_meminfo.txtzram_swap.txtdmabuf_debug.txt,以及可选 heap.hprof

如果进程已经不在运行,这次 dump 仍适合做退出诊断,但不能当作完整 panorama 样本。

4. 大屏和可调整窗口

对 target API 37 的应用,Android 17 在大屏设备上移除了方向和可调整窗口行为的开发者 opt-out。当前 Demo manifest 没有限制方向、resize 或宽高比,主内容是 ScrollView。

仍需在真实 Android 17 大屏或可调整窗口环境复验:

  • 旋转设备,或在可用环境中调整窗口大小。
  • 确认所有场景按钮仍可触达。
  • 确认 Activity 重建后状态文本和底部操作没有被裁剪。

5. Android 17 Review 清单

  • compileSdk = 37
  • targetSdk = 37
  • 已安装 Android SDK Platform 37
  • 已安装 Build Tools 37.x,并用它跑 zipalign
  • APK 能用 JDK 17 和 AGP 9.2.0 构建
  • APK 通过 zipalign -c -P 16
  • 采集记录 Android release/sdk、build fingerprint、page size
  • 采集记录 exit-infoam memory-limiter status
  • 如果出现 MemoryLimiter:AnonSwap,结论引用 exit-info,而不是只看内存总量
  • 缺失 smapsshowmapdmabuf 时报告为 unavailable,不误写成 0

6. 复验命令

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

# 在 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.md

如果进程已经被杀掉:

python3 analyze.py live --package com.androidperformance.memorylab --dump-only -o ./dumps

先看输出目录中的 exit_info.txtmemory_limiter_status.txtprocesses.txtmeta.txt

参考