相信很多人读过Google Android 推广工程师的《Who lives and who dies? Process priorities on Android》,该篇仅仅详细介绍了进程级别,但是没有对android的进程进行详细的介绍,而且其他很多文章也都将重点放在了四大组件、UI等方面。因此,本文将先从进程的角度,将进程相关的知识点进行一个串烧,再从主线程入手,对线程进行详解。
1、进程
每个App在启动前必须先创建一个进程,该进程是由Zygote fork出来的,进程具有独立的资源空间,用于承载App上运行的各种Activity/Service等组件。大多数情况一个App就运行在一个进程中,除非在AndroidManifest.xml中配置Android:process属性,或通过native代码fork进程。
1.1 进程的创建
不论是startActivity(),还是startService()等接口启动的进程,最终都是调用了ActivityManagerService 的 startProcessLocked() 方法,进而调用 Process.start() 方法。在该方法中,主要做了两件事:
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
private final void startProcessLocked(ProcessRecord app,
String hostingType, String hostingNameStr) {
try {
int pid = Process.start("android.app.ActivityThread",
mSimpleProcessManagement ? app.processName : null, uid, uid,
gids, debugFlags, null);
if (pid == 0 || pid == MY_PID) {
} else if (pid > 0) {
app.pid = pid;
app.removed = false;
synchronized (mPidsSelfLocked) {
this.mPidsSelfLocked.put(pid, app);
......
}
} else {
......
}
} catch (RuntimeException e) {
......
}
}
......
}
(1)新建一个进程;
startViaZygote
zygoteSendArgsAndGetResult
这个方法的主要功能是通过socket通道向Zygote进程发送一个参数列表,然后进入阻塞等待状态,直到远端的socket服务端发送回来新创建的进程pid才返回。既然system_server进程通过socket向Zygote进程发送消息,这是便会唤醒Zygote进程,来响应socket客户端的请求(即system_server端),接下来的操作便是在Zygote进程中执行。
先执行 runSelectLoop。
public static void main(String argv[]) {
try {
runSelectLoop(abiList);
....
} catch (MethodAndArgsCaller caller) {
caller.run();
} catch (RuntimeException ex) {
closeServerSocket();
throw ex;
}
}
private static void runSelectLoop(String abiList) throws MethodAndArgsCaller {
...
ArrayList<ZygoteConnection> peers = new ArrayLis