網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Android?ActivityManagerService啟動(dòng)流程詳解_Android
作者:守住Android最后的光 ? 更新時(shí)間: 2023-05-16 編程語(yǔ)言概述
AMS是系統(tǒng)的引導(dǎo)服務(wù),應(yīng)用進(jìn)程的啟動(dòng)、切換和調(diào)度、四大組件的啟動(dòng)和管理都需要AMS的支持。從這里可以看出AMS的功能會(huì)十分的繁多,當(dāng)然它并不是一個(gè)類承擔(dān)這個(gè)重責(zé),它有一些關(guān)聯(lián)類。
AMS的啟動(dòng)流程
1:SystemServer#main -> 2:SystemServer#run -> 3:SystemServiceManager#startBootstrapServices
1:首先SystemServer進(jìn)程運(yùn)行main函數(shù), main函數(shù)內(nèi)部只調(diào)用了一個(gè)自己的run()方法.
public static void main(String[] args) {
new SystemServer().run();
}
2:SystemServer的run()方法注釋非常多,可以自己看一下.中文注釋沒(méi)有使用//了, 不然顏色比較難以看清
private void run() {
<--開(kāi)始!-->
// Prepare the main looper thread (this thread).
<--準(zhǔn)備主線程(該線程)-->
android.os.Process.setThreadPriority(
android.os.Process.THREAD_PRIORITY_FOREGROUND);
android.os.Process.setCanSelfBackground(false);
Looper.prepareMainLooper();
Looper.getMainLooper().setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
?
<--初始化native服務(wù)-->
System.loadLibrary("android_servers");
<--初始化系統(tǒng)上下文-->
createSystemContext();
<--創(chuàng)建system service manager!!!-->
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
?
?
<--打開(kāi)系統(tǒng)服務(wù)-->
<--啟動(dòng)引導(dǎo)服務(wù)-->
<--用SystemServiceManager啟動(dòng)了ActivityManagerService、PowerManagerService、 PackageManagerService等服務(wù)-->
startBootstrapServices();
<--核心服務(wù)-->
<--啟動(dòng)BatteryService、UsageStatsService和WebViewUpdateService-->
startCoreServices();
<--啟動(dòng)其他服務(wù)-->
<--啟動(dòng)了WMS,CameraService、AlarmManagerService、VrManagerService等服務(wù)-->
startOtherServices();
<--Loop forever-->
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
3:SystemServer的startBootstrapServices()方法
SystemServer.java
//啟動(dòng)AMS
private void startBootstrapServices() {
...
<--調(diào)用SystemServiceManager的startSErvice()方法, 傳入Lifecycle.class字節(jié)碼文件的參數(shù),
通過(guò)反射實(shí)例化Lifecycle對(duì)象,并啟動(dòng)AMS(通過(guò)這個(gè)參數(shù)"ActivityManagerService.Lifecycle.class"可以看出
Lifecycle是AMS的一個(gè)內(nèi)部類)-->
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
?
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
}
?
SystemServiceManager.java
public SystemService startService(String className) {
<--使用反射獲取.class文件-->
Class serviceClass = Class.forName(className);
return this.startService(serviceClass);
}
SystemServiceManager.java
public <T extends SystemService> T startService(Class<T> serviceClass) {
String name = serviceClass.getName();
SystemService service;
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
<--通過(guò)反射,調(diào)用constructor的newInstance方法來(lái)創(chuàng)建Lifecycle類型的service對(duì)象-->
service = (SystemService)constructor.newInstance(this.mContext);
<--把該服務(wù)加入到系統(tǒng)服務(wù)集合當(dāng)中, 該系統(tǒng)服務(wù)集合就是SystemServiceManager類的list類型的成員變量-->
this.mServices.add(service);
<--調(diào)用反射類的onStart()方法開(kāi)啟AMS服務(wù)(實(shí)際上Lifecycle內(nèi)部類雖然是靜態(tài)的,
但是顯示的擁有一個(gè)AMS的對(duì)象, 該方法就是利用這個(gè)AMS對(duì)象調(diào)用AMS的start()方法)-->
service.onStart();
<--返回該服務(wù)-->
return service;
}
?
19年的時(shí)候初入安卓系統(tǒng)開(kāi)發(fā)的崗位,對(duì)整個(gè)系統(tǒng)的認(rèn)識(shí)比較少。 現(xiàn)在看來(lái)AMS的啟動(dòng)過(guò)程相對(duì)來(lái)說(shuō)是比較簡(jiǎn)單的。 在系統(tǒng)開(kāi)機(jī)啟動(dòng)之后,system_server會(huì)執(zhí)行三大服務(wù)啟動(dòng)
startBootstrapServices() 啟動(dòng)引導(dǎo)服務(wù),在這里實(shí)際上已經(jīng)new了AMS,在new方法里,已經(jīng)初始化了AMS的大部分重要的屬性。AMS的Looper和各種handler也是在這里準(zhǔn)備好的。
private void startBootstrapServices() {
...
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
...
}
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
private static ActivityTaskManagerService sAtm;
public Lifecycle(Context var1) {
super(var1);
this.mService = new ActivityManagerService(var1, sAtm);
}
public static ActivityManagerService startService(SystemServiceManager var0, ActivityTaskManagerService var1) {
sAtm = var1;
return ((ActivityManagerService.Lifecycle)var0.startService(ActivityManagerService.Lifecycle.class)).getService();
}
在創(chuàng)建完AMS之后,system_server的run方法會(huì)執(zhí)行到startOtherServices(),在啟動(dòng)“其他服務(wù)”完畢之后,會(huì)調(diào)入到AMS的systemReady()方法,在這里會(huì)啟動(dòng)launcher。 可以說(shuō),在這個(gè)方法執(zhí)行完畢之后,系統(tǒng)就已經(jīng)啟動(dòng)完成了。如果我們先要在系統(tǒng)啟動(dòng)的過(guò)程中在java framework中加入自己的代碼,可以在systemReady()這個(gè)方法中,完成。(比如注冊(cè)自己的廣播接受器)
public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
if (bootingSystemUser) {
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
}
}
啟動(dòng)流程圖
原文鏈接:https://blog.csdn.net/Androidxiaofei/article/details/128851644
相關(guān)推薦
- 2022-12-27 Swift?Error重構(gòu)優(yōu)化詳解_Swift
- 2022-05-09 Docker?Overlay2磁盤空間占用過(guò)大清理的方法實(shí)現(xiàn)_docker
- 2023-07-26 TypeScript中的類型聲明declare
- 2022-08-15 常見(jiàn)哈希算法、Hmac算法和BouncyCastle
- 2022-12-23 一文帶你了解Android中的網(wǎng)絡(luò)請(qǐng)求_Android
- 2022-01-29 yii SearchModel關(guān)于關(guān)聯(lián)表字段的查詢方法
- 2022-02-18 cv2.error: OpenCV(4.5.4-dev) :-1: error: (-5:Bad a
- 2022-09-16 Kubernetes教程之Windows?HostProcess?運(yùn)行容器化負(fù)載_云其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支