Android AMS啟動詳解
啟動
在Android系統(tǒng)啟動流程中中我們提到過,AMS是在system_service中啟動的,
//frameworks/base/services/java/corri/android/server/SystemServer.java //該方法主要啟動服務(wù) ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService。 //設(shè)置 ActivityManagerService,啟動傳感器服務(wù)。 startBootstrapServices(); // 啟動引導(dǎo)服務(wù) //該方法主要 //啟動服務(wù) BatteryService 用于統(tǒng)計電池電量,需要 LightService。 //啟動服務(wù) UsageStatsService,用于統(tǒng)計應(yīng)用使用情況。 //啟動服務(wù) WebViewUpdateService。 startCoreServices(); // 啟動核心服務(wù) //該方法主要啟動服務(wù) InputManagerService,WindowManagerService。 //等待 ServiceManager,SurfaceFlinger啟動完成,然后顯示啟動界面。 //啟動服務(wù) StatusBarManagerService, //準(zhǔn)備好 window, power, package, display 服務(wù): // - WindowManagerService.systemReady() // - PowerManagerService.systemReady() // - PackageManagerService.systemReady() // - DisplayManagerService.systemReady() startOtherServices(); // 啟動其他服務(wù)
在啟動核心服務(wù)功能中,會進(jìn)行AMS的啟動。
//frameworks/base/services/java/corri/android/server/SystemServer.java
private void startBootstrapServices() {
...
//這里會將ATMS注冊到ServiceManager中,然后調(diào)用ATMS的start方法。
ActivityTaskManagerService atm = mSystemServiceManager.startService(ActivityTaskManagerService.Lifecycle.class).getService();
//重點方法1。 注冊AMS服務(wù),并返回對應(yīng)的對象信息
mActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
//設(shè)置app安裝器
mActivityManagerService.setInstaller(installer);
...
//重點方法2。 向ServiceManager中注冊Binder服務(wù)
mActivityManagerService.setSystemProcess();
}
這里我們只截取了AMS的啟動代碼。
這里會通過startService方法來進(jìn)行AMS的注冊和啟動過程。我們看一下具體的ActivityManagerService中的startService方法
startService
//
public static ActivityManagerService startService(SystemServiceManager ssm, ActivityTaskManagerService atm) {
sAtm = atm;
//調(diào)用SM的startService方法。創(chuàng)建AMS實例,并啟動AMS
return ssm.startService(ActivityManagerService.Lifecycle.class).getService();
}
我們在ServiceManager的工作原理中講解過,systemServiceManager.startService方法會將對應(yīng)的服務(wù)注冊到ServiceManager中,然后再調(diào)用start方法。
//frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public SystemService startService(String className) {
final Class<SystemService> serviceClass;
serviceClass = (Class<SystemService>)Class.forName(className);
return startService(serviceClass);
}
@SuppressWarnings("unchecked")
public <T extends SystemService> T startService(Class<T> serviceClass) {
try {
final String name = serviceClass.getName();
final T service;
try {
//反射構(gòu)造函數(shù)
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
//創(chuàng)建服務(wù)
service = constructor.newInstance(mContext);
...
//啟動服務(wù)
startService(service);
return service;
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
}
}
public void startService(@NonNull final SystemService service) {
// Register it.
//注冊到ServiceManager列表中
mServices.add(service);
//調(diào)用服務(wù)對應(yīng)的onStart方法
service.onStart();
}
在啟動AMS的時候傳入的參數(shù)是:ActivityManagerService.Lifecycle.class。所以這里實際上會調(diào)用ActivityManagerService.Lifecycle 的構(gòu)造方法,然后調(diào)用它的onStart方法
public static final class Lifecycle extends SystemService {
private final ActivityTaskManagerService mService;
public Lifecycle(Context context) {
super(context);
//創(chuàng)建AMS對象
mService = new ActivityManagerService(context, sAtm);
}
@Override
public void onStart() {
//調(diào)用AMS的start方法
mService.start();
}
public ActivityManagerService getService() {
//返回了AMS實例
return mService;
}
}
在Lifecycle對象的創(chuàng)建過程中,會創(chuàng)建AMS對象,然后通過start()方法進(jìn)行了啟動。
AMS的創(chuàng)建
對于AMS對象的創(chuàng)建是通過構(gòu)造函數(shù)來創(chuàng)建的。
//構(gòu)造方法,
public ActivityManagerService(Context systemContext, ActivityTaskManagerService atm) {
//獲取系統(tǒng)的ActivityThread
mSystemThread = ActivityThread.currentActivityThread();
//創(chuàng)建一個ServiceThread用來處理AMS接收到的命令
mHandlerThread = new ServiceThread(TAG,THREAD_PRIORITY_FOREGROUND, false /*allowIo*/);
mHandlerThread.start();
mHandler = new MainHandler(mHandlerThread.getLooper());
mUiHandler = mInjector.getUiHandler(this);
//低內(nèi)存監(jiān)控
mLowMemDetector = new LowMemDetector(this);
//初始化廣播隊列。這里包含了前臺廣播,后臺廣播等
mFgBroadcastQueue = new BroadcastQueue(this, mHandler, "foreground", foreConstants, false);
mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", backConstants, true);
mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler, "offload", offloadConstants, true);
mBroadcastQueues[0] = mFgBroadcastQueue;
mBroadcastQueues[1] = mBgBroadcastQueue;
mBroadcastQueues[2] = mOffloadBroadcastQueue;
//用于保存注冊的Service
mServices = new ActiveServices(this);
//map,用于保存注冊的ContentProvider
mProviderMap = new ProviderMap(this);
mPackageWatchdog = PackageWatchdog.getInstance(mUiContext);
mAppErrors = new AppErrors(mUiContext, this, mPackageWatchdog);
//創(chuàng)建 /data/system目錄
final File systemDir = SystemServiceManager.ensureSystemDir();
//創(chuàng)建進(jìn)程統(tǒng)計服務(wù),保存在/data/system/proccstats目錄中。
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
//賦值A(chǔ)TM,并進(jìn)行初始化
mActivityTaskManager = atm;
mActivityTaskManager.initialize(mIntentFirewall, mPendingIntentController, DisplayThread.get().getLooper());
//CPU追蹤器進(jìn)程
mProcessCpuThread = new Thread("CpuTracker") {
@Override
public void run() {
...
}
};
}
在AMS的構(gòu)造函數(shù)中進(jìn)行了一些初始化的東西:比如說啟動CPU監(jiān)控、啟動進(jìn)程統(tǒng)計服務(wù)、啟動低內(nèi)存監(jiān)控、初始化Service和ContentProvider對應(yīng)的保存類等等。
start()
當(dāng)AMS類創(chuàng)建完成之后,會調(diào)用start()方法。
private void start() {
//移除所有的進(jìn)程組
removeAllProcessGroups();
//啟動CpuTracker線程
mProcessCpuThread.start();
//啟動電池統(tǒng)計服務(wù),能夠統(tǒng)計具體的應(yīng)用的電池消耗,從而來進(jìn)行一定的電量統(tǒng)計
mBatteryStatsService.publish();
//創(chuàng)建LocalService,并添加到LocalServices列表中
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
mActivityTaskManager.onActivityManagerInternalAdded();
mUgmInternal.onActivityManagerInternalAdded();
mPendingIntentController.onActivityManagerInternalAdded();
}
在start方法中,會將在構(gòu)造函數(shù)中創(chuàng)建的一些線程進(jìn)行啟動。
setSystemProcess
在創(chuàng)建并啟動完成之后,會通過setSystemProcess方法來向ServiceManager中注冊一些系統(tǒng)相關(guān)的服務(wù)。
public void setSystemProcess() {
try {
//注冊ActivityService服務(wù)
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
//注冊進(jìn)程狀態(tài)服務(wù)
ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
//注冊內(nèi)存Binder
ServiceManager.addService("meminfo", new MemBinder(this), /* allowIsolated= */ false,DUMP_FLAG_PRIORITY_HIGH);
//注冊圖像Binder
ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
//注冊SQLite DB binder
ServiceManager.addService("dbinfo", new DbBinder(this));
if (MONITOR_CPU_USAGE) {
//注冊CPU使用情況的Binder
ServiceManager.addService("cpuinfo", new CpuBinder(this),/* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
}
//注冊權(quán)限控制Binder
ServiceManager.addService("permission", new PermissionController(this));
//注冊進(jìn)程管理Binder
ServiceManager.addService("processinfo", new ProcessInfoService(this));
//獲取“android”應(yīng)用的ApplicationInfo,并裝載到mSystemThread
ApplicationInfo info = mContext.getPackageManager().getApplicationInfo("android", STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
mSystemThread.installSystemApplicationInfo(info, getClass().getClassLoader());
//創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息
synchronized (this) {
ProcessRecord app = mProcessList.newProcessRecordLocked(info, info.processName,...);
app.setPersistent(true);
app.pid = MY_PID;
app.getWindowProcessController().setPid(MY_PID);
app.maxAdj = ProcessList.SYSTEM_ADJ;
app.makeActive(mSystemThread.getApplicationThread(), mProcessStats);
mPidsSelfLocked.put(app);
mProcessList.updateLruProcessLocked(app, false, null);
updateOomAdjLocked(OomAdjuster.OOM_ADJ_REASON_NONE);
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
"Unable to find android system package", e);
}
}
在這個方法中會設(shè)置一些系統(tǒng)進(jìn)程,主要功能為:
- 注冊一些服務(wù):activity、procstats、meminfo、gfxinfo、dbinfo、cpuinfo、permission、processinfo等。
- 獲取包名為“android”的應(yīng)用的ApplicationInfo對象,并將該ApplicationInfo信息安裝設(shè)置到SystemThread(系統(tǒng)進(jìn)程主線程)。即可以理解,系統(tǒng)也是一個特殊的應(yīng)用。
- 創(chuàng)建ProcessRecord維護(hù)進(jìn)程的相關(guān)信息,這里MY_PID即為SystemServer進(jìn)程ID。
- 啟動 檢測應(yīng)用運行和交互。
后續(xù)
當(dāng)AMS創(chuàng)建并啟動之后,會有一系列的后續(xù)的工作需要處理。這些操作都是在**startOtherServices()**中去調(diào)用的
private void startOtherServices() {
//注冊系統(tǒng)的ContentProvider信息
mActivityManagerService.installSystemProviders();
mActivityManagerService.setWindowManager(wm);
mActivityManagerService.systemReady(() -> {
......//goingCallback
}, BOOT_TIMINGS_TRACE_LOG);
}
這里的主要功能是:
- 關(guān)鍵服務(wù)繼續(xù)進(jìn)行初始化
- 已經(jīng)啟動的進(jìn)程,如果沒有FLAG_PERSISTENT標(biāo)志位,則會被kill掉
- 運行g(shù)oingCallBack
- 啟動launcher的Activity,即桌面應(yīng)用。
這里繼續(xù)跟蹤一下goingCallBack的具體執(zhí)行內(nèi)容。
goingCallBack
mActivityManagerService.systemReady(() -> {
try {
//啟動NativeCrash的監(jiān)測
mActivityManagerService.startObservingNativeCrashes();
} catch (Throwable e) {
reportWtf("observing native crashes", e);
}
if (!mOnlyCore && mWebViewUpdateService != null) {
webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
//啟動WebView相關(guān)
mWebViewUpdateService.prepareWebViewInSystemServer();
}, WEBVIEW_PREPARATION);
}
try {
//啟動systemUI
startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
...
}
在這個里面會繼續(xù)進(jìn)行一些初始化的工作:
- 啟動NativeCrash監(jiān)測
- 啟動WebView相關(guān)服務(wù)
- 啟動SystemUI
startHomeOnAllDisplays
該功能主要是進(jìn)行桌面程序的啟動,和AMS的啟動流程關(guān)聯(lián)不大,在這里不再詳細(xì)進(jìn)行解析。
總結(jié):
- AMS是在SystemServer進(jìn)程中進(jìn)行創(chuàng)建并啟動的
- 在AMS的服務(wù)啟動過程中,通過構(gòu)造函數(shù)進(jìn)行了一些對象的創(chuàng)建和初始化工作(初Activity外其他3大組件的列表和調(diào)度對象的創(chuàng)建;內(nèi)存、電池、權(quán)限、CPU等的監(jiān)控等等相關(guān)對象的創(chuàng)建),并且通過start()方法啟動服務(wù)(移除進(jìn)程組、啟動CPU線程、權(quán)限注冊、電池服務(wù)等等)。
- AMS創(chuàng)建并將對應(yīng)服務(wù)啟動之后,會通過setSystemProcess方法,將framework-res.apk的信息加入到SystemServer進(jìn)程的LoadedApk中,并創(chuàng)建了SystemServer進(jìn)程的ProcessRecord,加入到了mPidsSelfLocked,交給AMS來統(tǒng)一管理
- AMS啟動之后的后續(xù)工作,主要調(diào)用systemReady()和傳入的goingCallBack來執(zhí)行。主要是各種服務(wù)或者進(jìn)程,等AMS啟動完成后需要進(jìn)一步完成的工作以及系統(tǒng)相關(guān)的初始化。
- 桌面應(yīng)用是在systemReady()方法中啟動,systemUI是在goingCallback中完成。
- 當(dāng)桌面應(yīng)用啟動完成以后,發(fā)送開機(jī)廣播ACTION_BOOT_COMPLETED。
以上就是Android AMS啟動詳解的詳細(xì)內(nèi)容,更多關(guān)于Android AMS啟動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解
這篇文章主要介紹了Android 啟動模式FLAG_ACTIVITY_CLEAR_TOP案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Android ListView下拉刷新上拉自動加載更多DEMO示例
這篇文章主要介紹了Android ListView下拉刷新上拉自動加載更多DEMO示例的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
android textview設(shè)置字體的行距和字間距
這篇文章主要介紹了android textview設(shè)置字體的行距和字間距的方法,非常簡單實用,有需要的小伙伴可以參考下2016-05-05
Android BroadcastReceiver接收收到短信的廣播
這篇文章主要為大家詳細(xì)介紹了Android BroadcastReceiver接收收到短信的廣播,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
Android ImageView隨手勢變化動態(tài)縮放圖片
這篇文章主要為大家詳細(xì)介紹了Android ImageView隨手勢變化動態(tài)縮放圖片的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05

