Android Framework實戰視訊--SystemServer啟動篇
線上學習課程,課程諮詢答疑和新課資訊:QQ交流群:422901085進行課程討論
轉自於:https://blog.csdn.net/learnframework/article/details/116310690
課程答疑和新課資訊:QQ交流群:422901085進行課程討論
FrameWork入門課視訊連結:https://edu.csdn.net/course/detail/30298
FrameWork實戰課1視訊連結:https://edu.csdn.net/course/detail/30275
專題部落格系列:
Android 8.1 zygote 啟動過程原始碼
Android Framework實戰視訊--Zygote的fork程序篇
Android Framework實戰視訊--SystemServer啟動篇
Android Framework實戰視訊--SystemServer啟動FallbackHome篇
Android Framework實戰視訊--FallbackHome程序啟動及Activity啟動篇
Android Framework實戰視訊--FallbackHome結束啟動Launcher篇
SystemServer啟動篇
上一講已經講了systemserver程序被fork出來了
程式碼在ZygoteInit的main方法中的:
Runnable r = forkSystemServer(abiList, socketName, zygoteServer);
進入forkSystemServer方法後已經分析到:
pid = Zygote.forkSystemServer
即在Zygote中又呼叫了forkSystemServer方法一直到native層才呼叫了真正的linux的 fork()
在Zygote.forkSystemServer返回後看程式碼如下:
if (pid == 0) { if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } zygoteServer.closeServerSocket(); return handleSystemServerProcess(parsedArgs); }
由於SystemServer是複製Zygote的程序,因此也會包含Zygote的zygoteServer,對於SystemServer沒有其他作用,需要先將其關閉;通過呼叫handleSystemServerProcess:
private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {
//省略。。
final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
//省略。。
if (parsedArgs.invokeWith != null) {
//省略。。
} else {
ClassLoader cl = null;
if (systemServerClasspath != null) {
//建立PathClassLoader
cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);
Thread.currentThread().setContextClassLoader(cl);
}
/*
* Pass the remaining arguments to SystemServer.
*/
return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}
/* should never reach here */
}
這裡建立PathClassLoader然後又呼叫ZygoteInit.zygoteInit
public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
//省略
RuntimeInit.commonInit();
//啟動一下binder執行緒池
ZygoteInit.nativeZygoteInit();
return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
這裡先呼叫ZygoteInit.nativeZygoteInit(),是一個native方法,實現在AndroidRuntime裡面,最後調到app_main.cpp的onZygoteInit,來啟動binder執行緒池:
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
proc->startThreadPool();
}
接下來呼叫RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
protected static Runnable applicationInit(int targetSdkVersion, String[] argv,
ClassLoader classLoader) {
//省略
return findStaticMain(args.startClass, args.startArgs, classLoader);
}
applicationInit主要就是實現尋找startClass中的main方法,然後構造一個Runable,對應的run方法就是呼叫main方法:
private static Runnable findStaticMain(String className, String[] argv,
ClassLoader classLoader) {
//省略
cl = Class.forName(className, true, classLoader);
//省略
m = cl.getMethod("main", new Class[] { String[].class });
//省略
return new MethodAndArgsCaller(m, argv);
}
其中MethodAndArgsCaller:
static class MethodAndArgsCaller implements Runnable {
//省略
public void run() {
//省略
mMethod.invoke(null, new Object[] { mArgs });
//省略
}
}
所以這裡就是關鍵確定startClass是誰
這裡又得回到開始ZygoteInit類的forkSystemServer:
有如下引數:
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"com.android.server.SystemServer",
};
其實這裡的statClass就是最後一個引數: "com.android.server.SystemServer"
以上過程完成了從Zygote經過RuntimeInit最後完成SystemServer的main方法的執行。下面重點分析SystemServer的main方法:
public static void main(String[] args) {
new SystemServer().run();
}
直接呼叫run方法:
private void run() {
//建立Looper物件
Looper.prepareMainLooper();
// 載入系統android_servers的庫
System.loadLibrary("android_servers");
//建立系統的Context
createSystemContext()
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
//省略。。
//啟動引導服務
startBootstrapServices();
//啟動核心服務
startCoreServices();
//啟動其他服務
startOtherServices();
//省略。。
Looper.loop();
}
run方法中內容也比較多,這裡分析幾個重要部分既可以:
Looper.prepareMainLooper();主要目的就是建立好Looper物件,因為system server的主執行緒和普通app主執行緒一樣是一個Loop管理的訊息迴圈
createSystemContext()表示建立一個systemContext,Context不僅僅在普通app中非常重要,在system server中也一樣,需要通過Context這個紐帶來,獲取一些程序的資訊環境。
mSystemServiceManager = new SystemServiceManager(mSystemContext);這裡建立了一個SystemServiceManager的類物件,而且放入了LocalServices中,其實這裡的SystemServiceManager和常見binder中的ServiceManager還是不一樣的,SystemServiceManager只是System Server中一個普通的類,他負責儲存了各個SystemService的全域性變數角色,本身不涉及跨程序,而ServiceManager可以與binder跨進除等是強關聯
再接下來就是重點中重點:
//啟動引導服務
startBootstrapServices();
//啟動核心服務
startCoreServices();
//啟動其他服務
startOtherServices();
system server把系統的所有服務分了3類進行啟動
第一個:startBootstrapServices();
這一部分看註釋可以大概得出,系統服務之間存在著非常複雜的依賴關係,所以需要把一些重要的系統服務進行第一位啟動
/**
* Starts the small tangle of critical services that are needed to get
* the system off the ground. These services have complex mutual dependencies
* which is why we initialize them all in one place here. Unless your service
* is also entwined in these dependencies, it should be initialized in one of
* the other functions.
*/
private void startBootstrapServices() {
//省略。。
Installer installer = mSystemServiceManager.startService(Installer.class);
//省略。。
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
//省略。。
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
//省略。。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
//省略。。
mActivityManagerService.initPowerManagement();
//省略。。
if (!SystemProperties.getBoolean("config.disable_noncore", false)) {
traceBeginAndSlog("StartRecoverySystemService");
mSystemServiceManager.startService(RecoverySystemService.class);
traceEnd();
}
//省略。。
mSystemServiceManager.startService(LightsService.class);
//省略。。
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
//省略。。
mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
//省略。。
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
//省略。。
OtaDexoptService.main(mSystemContext, mPackageManagerService);
//省略。。
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
//省略。。
mActivityManagerService.setSystemProcess();
//省略。。
mDisplayManagerService.setupSchedulerPolicies();
//省略。。
mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
//省略。。
startSensorService();
//省略。。
}, START_SENSOR_SERVICE);
}
這個裡面程式碼主要就是啟動一些服務,這些服務需要放在第一位進行啟動,因為很可能後面服務對這些都是有依賴關係。
這裡只對ActivityManagerService的啟動進行一個例子分析,其他的服務就大概思路一樣,不再單獨分析:
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
接下來分析 mSystemServiceManager.startService方法:
public <T extends SystemService> T startService(Class<T> serviceClass) {
//省略
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
//省略
startService(service);//呼叫自己的startService
return service;
//省略
}
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service);
//省略
service.onStart();
//省略
}
最後分析其實師呼叫了serviceClass的onStart方法,這裡的serviceClass是 ActivityManagerService.Lifecycle.class
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);
}
@Override
public void onStart() {
mService.start();
}
@Override
public void onCleanupUser(int userId) {
mService.mBatteryStatsService.onCleanupUser(userId);
}
public ActivityManagerService getService() {
return mService;
}
}
這裡看到構造時候 mService = new ActivityManagerService(context);把ActivityManagerService構造了,getService()也是直接返回的ActivityManagerService物件,onStart也是呼叫了ActivityManagerService的start方法
其他的另外兩個也是和第一個類是啟動服務,只是構造service方法上有細微差別,這裡就不挨個具體分析了
//啟動核心服務
startCoreServices();
//啟動其他服務
startOtherServices();
這裡最後一步的startOtherServices不僅僅只啟動了一些Service,在啟動完了各個Service後,它還會呼叫各個Service的systemReady方法:
// It is now time to start up the app processes...
vibrator.systemReady();
lockSettings.systemReady();
wm.systemReady();
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
mPackageManagerService.systemReady();
mDisplayManagerService.systemReady(safeMode, mOnlyCore);
mActivityManagerService.systemReady(..)
這裡只列出了主要的幾個systemReady方法