主要流程
-
Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程。
-
SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等。
-
Launcher桌面程序:就是我们平时看到的桌面程序,它其实也是一个android应用程序,只不过这个应用程序是系统默认第一个启动的应用程序.SystemService进程启动后,由Zygote进程创建。
Zygote是怎么启动的?
- init进程fork出zygote进程
- 启动虚拟机,注册jni函数(为切换java做准备)
- 预加载系统资源
- 启动SystemServer
- 进入Socket Loop
SystemServer是怎么启动的?
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java:
private static boolean startSystemServer(String abiList, String socketName)
throws MethodAndArgsCaller, RuntimeException {
String args[] = {
"com.android.server.SystemServer",//启动类 SystemServer
};
pid = Zygote.forkSystemServer(...);
ZygoteConnection.Arguments parsedArgs = null;
handleSystemServerProcess(parsedArgs);
return true;
}
private static void handleSystemServerProcess(...) {
...
RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
commonInit();//常规初始化
nativeZygoteInit();//启用binder机制,启用binder线程
applicationInit(targetSdkVersion, argv, classLoader);//调用java类SystemServer的入口函数
}
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
throws ZygoteInit.MethodAndArgsCaller {
invokeStaticMain(args.startClass, args.startArgs, classLoader);
}
/frameworks/base/services/java/com/android/server/SystemServer.java
private static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr
public static void main(String[] args) {
new SystemServer().run();
}
public SystemServer() {
// Check for factory test mode.
mFactoryTestMode = FactoryTest.getMode();
}
private void run() {
Looper.prepareMainLooper();
// 加载“android_servers.so”库,该库包含源码在frameworks/base/services/目录下
// Initialize native services.
System.loadLibrary("android_servers");
//初始化系统Context
createSystemContext();
//Start services.
//启动各种系统服务
startBootstrapServices();//启动引导服务
startCoreServices();//启动核心服务
startOtherServices();
Looper.loop();
}
系统服务怎么发布的,让应用程序可见?
/frameworks/base/services/core/java/com/android/server/SystemService.java
protected final void publishBinderService(String name, IBinder service) {
publishBinderService(name, service, false);
}
//用同名的publishBinderService,多了一个参数
protected final void publishBinderService(String name, IBinder service,
boolean allowIsolated) {
ServiceManager.addService(name, service, allowIsolated);
}
- 最后还是将系统服务的Binder注册到ServiceManager 来实现的,SystemService只是做简单的封装。
系统服务跑在什么线程?
- 工作线程
- binder线程
系统服务如何解决相互依赖的?
- 分批启动(上层Service先启动)
- 分阶段启动(告诉已经启动的Service到了什么阶段可以做哪些初始化)
Launcher 启动
ActivityManagerService.java
public void systemReady(...) {
startHomeActivityLocked(currentUserId, "systemReady");
}
packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java
public void startLoader(Context context, boolean isLaunching) {
...
//LoaderTask初始化
mLoaderTask = new LoaderTask(context, isLaunching);
sWorker.post(mLoaderTask);
...
}
PackageManager.java
public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
@ResolveInfoFlags int flags, @UserIdInt int userId);