先上一张流程图,稳住军心,对着流程图分析更加有信心
一、什么是SystemServer
源码位置:
frameworks/base/services/java/com/android/server/SystemServer.java
System Server是android 基本服务的提供者,是android系统运行的最基本需求,所有service运行在一个叫system_server的进程中,system_server进程是android java虚拟机跑的第一个进程,从Zygote 创建而来,是andorid系统最重要的java虚拟机。可以说,整个android系统的业务都是围绕system server而展开,所以,当system_server死掉了,手机必须重启。从Zygote创建system_server进程时,便实例化了该类。源码层不做分析,可参考https://blog.csdn.net/qq_25806863/article/details/70820063
二、SystemServer类启动服务
1、找到SystemServer的入口函数main(),代码如下:
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
2、进入run()方法,代码如下:
private void run() {
...
// Start services.
try {
//--------1、启动引导服务
startBootstrapServices();
//--------2、启动核心服务
startCoreServices();
//--------3、启动其他服务
startOtherServices();
} catch (Throwable ex) {
...
} finally {
traceEnd();
}
...
}
启动服务分为三大类服务引导服务、核心服务、其他服务
3、如上面的流程图、PMS属于引导服务,进入startBootstrapServices()方法,代码如下:
private void startBootstrapServices() {
....
// ------------1、启动ActivityManagerService
traceBeginAndSlog("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
...
mActivityManagerService.setSystemProcess();
// ------------2、启动PackageManagerService
traceBeginAndSlog("StartPackageManagerService");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceEnd();
...
}
最终会调用PackageManagerService.main() 方法实例化PMS
4、进入main方法,代码如下:
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
PackageManagerServiceCompilerMapping.checkProperties();
//-----------1、初始化PMS
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore);
m.enableSystemUserPackages();
//------------2、注册到ServerManager
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
注释1初始化PMS的启动阶段。如上面的流程图,注释2处就会把初始化的PMS注册到ServerManager。key是"package",value就是PMS对象
5、AMS注册过程
回到第3步,注释1处调用mActivityManagerService.setSystemProcess(),进入方法,代码如下:
public void setSystemProcess() {
//-----------------1、当前AMS服务
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
//-----------------2、其他相关服务
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,
DUMP_FLAG_PRIORITY_HIGH);
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
ServiceManager.addService("cpuinfo", new CpuBinder(this),
/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
}
ServiceManager.addService("permission", new PermissionController(this));
ServiceManager.addService("processinfo", new ProcessInfoService(this));
...
}
注释1处就会把初始化的PMS注册到ServerManager。key是 Context.ACTIVITY_SERVICE,value就是AMS对象