)
一、基础概念类1. AMS 是什么它的核心职责有哪些答AMS 是 Android 框架中最核心的系统服务之一运行在 system_server 进程中。主要职责包括Activity 生命周期管理启动、暂停、恢复、销毁任务栈管理Task、Back Stack 的维护进程管理应用进程的创建、回收、优先级调整组件调度Activity、Service、Broadcast、ContentProvider 的启动和绑定内存管理与 LMKLow Memory Killer协作进行 OOM 调整2. AMS、WMS、PMS 之间是什么关系答AMS负责组件生命周期和进程管理WMSWindow Manager Service负责窗口的层级、布局、显示PMSPackage Manager Service负责 APK 解析、权限管理、组件信息存储协作关系AMS 启动 Activity 时先通过 PMS 获取组件信息再通知 WMS 创建窗口和 Surface。二、Activity 启动流程高频3. 从点击桌面图标到 Activity 显示完整流程是怎样的答分为应用进程和系统进程两个视角系统进程system_server侧Launcher 通过 Binder 调用 AMS.startActivity()AMS 检查权限、Intent 解析通过 PMS判断目标进程是否存在不存在通过 Zygote fork 新进程存在直接调度通过 ApplicationThreadBinder通知应用进程应用进程侧ActivityThread 收到 scheduleLaunchActivity 消息通过 HandlerH处理执行 handleLaunchActivity()执行 performLaunchActivity()通过 Instrumentation 创建 Activity 实例调用 attach()创建 Window、PhoneWindow调用 onCreate()执行 handleResumeActivity()调用 onStart()、onResume()通过 WMS 添加窗口、执行 measure/layout/draw首次渲染上屏4. startActivity 为什么是异步的如果连续调用两次 startActivity执行顺序如何保证答异步原因AMS 需要跨进程通信、进程创建、窗口创建等重操作不能阻塞调用方顺序保证AMS 内部使用 ActivityStack 和双链表mHistory维护 ActivityRecord按调用顺序入栈保证先进先出5. 什么是 ActivityRecord、TaskRecord、ActivityStack答ActivityRecord对应一个 Activity 实例保存配置、状态、Intent 等信息TaskRecord对应一个任务栈管理一组相关的 ActivityRecord通常来自同一应用ActivityStack管理多个 TaskRecordAndroid 默认有 Home Stack、FullScreen Stack、Pinned Stack 等三、生命周期与状态管理6. onPause() 和 onStop() 的区别是什么什么场景下只执行 onPause 不执行 onStop答onPause()Activity 失去焦点但仍可见如对话框主题 Activity 弹出、分屏模式onStop()Activity 完全不可见只执行 onPause 的场景透明主题或对话框主题的 Activity 覆盖当前 Activity进入多窗口模式当前 Activity 被部分遮挡7. 为什么不能在 onPause/onStop 中执行耗时操作答onPause新 Activity 的 onCreate 会等待旧 Activity 的 onPause 执行完毕耗时操作会导致启动卡顿onStop虽然不会阻塞新 Activity 启动但系统可能在 onStop 后很快回收进程耗时操作有风险8. 系统在什么情况下会回收 Activity如何恢复答回收场景内存不足时系统按 LRU 和优先级回收后台进程进程内的 Activity 实例被销毁恢复机制回收前调用 onSaveInstanceState() 保存状态到 Bundle重建时通过 onCreate(savedInstanceState) / onRestoreInstanceState() 恢复AMS 通过 ActivityRecord 的 icicle 字段保存状态四、任务栈与启动模式9. 四种 LaunchMode 的区别和应用场景模式特点场景standard每次都新建实例普通页面singleTop栈顶复用否则新建通知跳转、搜索页singleTask栈内复用清空其上 Activity主页面、WebView 容器singleInstance单独任务栈全局唯一来电界面、闹钟10. singleTask 的 clearTop 效果是如何实现的答AMS 在 ActivityStack.finishActivityLocked() 中找到目标 Activity 后将其上的所有 Activity 执行 finish 操作然后执行 onNewIntent()。11. Intent.FLAG_ACTIVITY_NEW_TASK 的作用什么情况下必须加答作用为 Activity 创建新的 TaskRecord或复用已有必须加的场景从非 Activity Context如 Service、BroadcastReceiver启动 Activity 时Android 规定必须加此标志因为新 Activity 没有可依附的任务栈12. taskAffinity 是什么如何影响任务栈分配答定义标识 Activity 希望归属的任务栈名称默认是包名影响与 singleTask 配合Activity 会尝试进入 taskAffinity 指定的任务栈与 allowTaskReparenting 配合Activity 可以从启动它的任务栈迁移到 taskAffinity 指定的任务栈五、进程管理与优先级13. Android 进程优先级ADJ有哪些级别答从低到高越容易被杀NATIVE_ADJ (-1000)native 进程如 SurfaceFlingerSYSTEM_ADJ (-900)system_serverPERSISTENT_PROC_ADJ (-800)常驻进程如电话应用PERSISTENT_SERVICE_ADJ (-700)常驻服务FOREGROUND_APP_ADJ (0)前台 ActivityVISIBLE_APP_ADJ (1)可见但不可交互如后台弹窗、分屏PERCEPTIBLE_APP_ADJ (2)可感知进程如后台播放音乐、前台 ServiceBACKUP_APP_ADJ (3)执行备份的进程HEAVY_WEIGHT_APP_ADJ (4)重量级进程SERVICE_ADJ (5)启动过 Service 的进程HOME_APP_ADJ (6)Launcher 进程PREVIOUS_APP_ADJ (7)上一个前台应用SERVICE_B_ADJ (8)长时间未使用的 ServiceCACHED_APP_ADJ (9)缓存进程按 LRU 细分 9-1614. 什么是 OOM_ADJAMS 如何参与内存回收答OOM_ADJLinux 内核的 OOM Killer 机制数值越大越容易被杀AMS 的作用实时计算各进程的 ADJ 值updateOomAdjLocked()将 ADJ 值写入/proc/[pid]/oom_score_adjLMKLow Memory Killer根据水位线和 ADJ 值选择性杀进程15. 为什么按 Home 键后应用不会被立即杀死答按 Home 后应用变为PREVIOUS_APP_ADJ(7)或进入缓存队列优先级较高。系统优先回收 CACHED 和 SERVICE_B 等低优先级进程只有当内存严重不足时才会回收。六、常见问题与优化16. 什么是 ANRAMS 如何判定 ANR答定义Application Not Responding主线程 5 秒内未响应输入或广播AMS 判定机制Service ANR主线程 20 秒前台 Service/ 200 秒后台 Service未执行完 onCreate/onStartCommandBroadcast ANRonReceive 执行超过 10 秒前台广播/ 60 秒后台广播Input ANR5 秒内未处理输入事件ContentProvider ANR10 秒内未 publishAMS 实现通过 Handler 发送延时消息超时后未移除则触发 ANR收集堆栈写入/data/anr/traces.txt17. 冷启动、温启动、热启动的区别AMS 如何区分答冷启动进程不存在AMS 通过 Zygote fork 新进程耗时最长温启动进程存在但 Activity 被回收需重建 Activity 实例热启动进程和 Activity 都在内存只需从后台切换到前台onResumeAMS 判断检查 ProcessRecord 是否存在且非死亡状态检查 ActivityRecord 是否存在。18. 启动黑屏/白屏的原因是什么如何解决答原因AMS 启动 Activity 后WMS 创建窗口到首帧渲染之间存在时间差默认显示窗口背景色通常是黑/白解决给 Window 设置透明背景治标不治本会延长显示时间设置启动主题背景图windowBackground让用户感知快速启动优化 Application 和 Activity 的 onCreate 耗时尽快完成首帧渲染七、进阶与源码19. Instrumentation 在 AMS 中扮演什么角色答Instrumentation 是 AMS 与应用进程交互的钩子创建 ActivityInstrumentation.newActivity()生命周期回调Instrumentation.callActivityOnCreate/OnResume()启动 ActivityInstrumentation.execStartActivity()用途单元测试如 Espresso、插件化/热修复Hook Instrumentation 拦截启动20. Android 8.0/10/12 对 AMS 做了哪些重大重构答Android 8.0引入ActivityStarter类将启动逻辑从 AMS 中剥离职责更单一Android 10引入ActivityTaskManagerService (ATMS)将任务栈管理从 AMS 分离AMS 专注进程管理Android 12引入SplashScreen API规范启动画面解决黑屏问题21. 插件化/热修复中如何绕过 AMS 的校验答Hook Instrumentation拦截 execStartActivity替换 Intent 中的 ComponentName 为已注册 StubActivity通过 AMS 校验后再换回原目标Hook IActivityManager/ATMS直接拦截 AMS 的 Binder 调用修改参数Hook PMS修改查询到的组件信息较少使用八、场景题22. A 启动 BB 是透明主题生命周期如何执行答A.onPause()B.onCreate() → B.onStart() → B.onResume()A.onStop() 不执行因为 A 仍然可见23. 两个应用共享一个 singleTask Activity任务栈如何表现答如果 taskAffinity 相同会进入同一任务栈如果不同且配合 allowTaskReparentingActivity 可能在两个任务栈间迁移。24. 按 Home 键后杀进程再点击应用图标为什么有时不是恢复上次页面答取决于TaskRecord 是否被清除如果系统内存充足TaskRecord 保留恢复上次页面如果进程被杀但 TaskRecord 保留Android 8.0 特性AMS 会重建进程并恢复栈顶 Activity如果从 Launcher 冷启动且 TaskRecord 被清理则重新走 MainActivity