第十一节 Android 进程管理
(第1章 安卓逆向概论)
学习目标
学完本节,希望你能够:搞清 Android 进程咋管(Zygote、App、System Server);掌握进程生命周期和调度(前台、后台、服务、缓存);知道 OOM 和进程优先级、杀进程策略;会用 ps、top、dumpsys activity、/proc 看进程;能 Hook 进程管理做持久化或逆向(仅学习)。
一、Android 进程管理是咋回事?
在 Android 中,应用程序 通常不会直接创建进程 ,而是由 Zygote 负责孵化。
| 进程类型 | 作用 | 示例 |
|---|---|---|
| Zygote | 负责 Fork 其他进程 | /system/bin/app_process |
| System Server | 管理系统服务 | system_server 进程 |
| App 进程 | 运行应用 | com.example.app |
| Native 进程 | 运行 C/C++ 代码 | surfaceflinger, mediaserver |
二、关键进程是啥?
1. Zygote 进程
Zygote 是 Android 进程的起点,其主要作用是:
- 预加载类库 & 资源,减少应用启动时间。
- Fork 子进程,所有 App 进程均由 Zygote 复制而来。
查看 Zygote 进程
bash
adb shell ps -A | grep zygote
输出示例:
zygote64 1234 567 123456K fg 00000000 S zygote64
zygote 1235 567 123456K fg 00000000 S zygote
Zygote 如何 Fork 进程?
java
public static void main(String[] argv) {
ZygoteServer zygoteServer = new ZygoteServer();
while (true) {
ZygoteConnection connection = zygoteServer.acceptCommandPeer();
connection.runOnce();
}
}
逆向分析 Zygote
bash
strings /system/bin/app_process
2. System Server 进程
System Server 进程 负责管理 Android 系统服务,如 AMS(ActivityManagerService) , PMS(PackageManagerService)。
查看 System Server 进程
bash
adb shell ps -A | grep system_server
输出:
system 1356 567 456789K fg 00000000 S system_server
System Server 关键代码
java
public static void main(String[] args) {
SystemServer server = new SystemServer();
server.run();
}
分析 System Server 中的 AMS
bash
adb shell dumpsys activity
3. 应用进程
应用进程通常由 Zygote Fork,负责执行应用代码。
查看当前运行的 App 进程
bash
adb shell ps -A | grep com.example.app
查看应用进程详情
bash
adb shell dumpsys meminfo com.example.app
杀死应用进程
bash
adb shell am force-stop com.example.app
三、进程优先级和 OOM 咋管?
Android 采用 OOM(Out Of Memory)优先级管理机制 ,根据进程的重要性决定 是否杀死进程。
| 优先级 | 进程类型 | 是否可杀死 |
|---|---|---|
| 0(最高) | 前台进程(前台 Activity) | ❌ 不能杀死 |
| 1 | 可见进程(后台 Activity) | ❌ 通常保留 |
| 2 | 服务进程(后台 Service) | 低内存时杀死 |
| 3 | 后台进程(不可见 Activity) | 低内存时杀死 |
| 4(最低) | 缓存进程(长期未使用的 App) | 优先被杀死 |
查看进程 OOM 级别
bash
adb shell cat /proc/1234/oom_adj
输出:
0 # 前台进程,不会被杀死
6 # 后台进程,低内存时可能被杀死
15 # 缓存进程,优先被杀死
调整进程 OOM 级别
bash
adb shell echo -17 > /proc/1234/oom_adj
👉 可用于保护进程,防止被系统杀死(需 Root)。
四、进程管理 API 咋用?
1. ActivityManager
java
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo process : processes) {
Log.d("Process", "PID: " + process.pid + " Name: " + process.processName);
}
2. 监听进程状态
java
ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackgrounded() {
Log.d("Process", "App moved to background!");
}
});
3. 让进程持久运行
java
startForegroundService(new Intent(this, MyService.class));
五、逆向里咋 Hook 进程?
1. Hook Android 进程调度
bash
frida -U -n system_server -e "Interceptor.attach(Module.findExportByName(null, 'fork'), { onEnter: function(args) { console.log('fork called'); }})"
2. 绕过进程杀死
bash
adb shell setprop persist.sys.background_process_limit 0
3. 限制某进程 CPU 使用
bash
taskset -p 0x01 1234
动手练一练
- 检查 Android 设备上的进程
bash
adb shell ps -A
- 解析 Zygote 进程
bash
adb shell ps -A | grep zygote
- 获取 App 进程的内存信息
bash
adb shell dumpsys meminfo com.example.app
- 监听进程状态
java
ProcessLifecycleOwner.get().getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackgrounded() {
Log.d("Process", "App moved to background!");
}
});
本节小结
你只要记住这几条就行:Zygote 预加载并 Fork 出所有 App 进程,System Server 跑 AMS/PMS 等;进程有前台/可见/服务/后台/缓存等优先级,OOM 时按优先级杀;用 ps、dumpsys activity、/proc/pid 看进程,用 Frida 可 Hook fork 等(仅学习)。
本节思考与练习
- 概念:Zygote 和 System Server 各干啥?OOM 杀进程按啥顺序?
- 动手:用
adb shell ps -A和dumpsys activity看当前进程和前台 Activity。 - 动手:用
cat /proc/某pid/oom_adj看进程的 OOM 级别。
下一节预告 :下一节讲 Android 权限机制(第十二节),把普通/危险/特殊权限和运行时权限、SELinux 讲清楚。