眾所周知摇零,Android 中的用戶進程是由 Zygote 孵化的。通知Zygote fork()進程是在 ActivityManagerService 中胃珍,同時 Zygote 與 ActivityManagerService是用過 socket 通信的耍休。
詳見Zygote進程及其孵化子進程
當子進程fork 后灶泵,會調(diào)用ActivityThread.main(String[ ]),這部分是在子進程补箍,即 app 進程運行的改执;
//android.app.ActivityThread
public static void main(String[] args){
...
//現(xiàn)在還不知道這個用戶進程的名字
Process.setArgVo("<pre-initialized>");
//這個就是傳說中的主線程了,開啟了一個 looper
Looper.prepareMainLooper();
//構(gòu)造函數(shù)比較簡單坑雅,只是單純的創(chuàng)造了mResourceManager=ResourceManager.getInstance()
ActivityThread thread = new ActivityThread();
//system=false
thread.attach(false);
if(sMainThreadHandler == null){
//這個就是 H 類辈挂,用以處理啟動 activity 等消息的 Handler
sMainThreadHandler = thread.getHandler();
}
Lopper.loop();
}
private void attach(boolean system){
//這東西是整個應(yīng)用的單例,并且是 static 的裹粤,經(jīng)常作為黑科技的 hook 點
sCurrentActivityThread = this;
mSystemThread = system;//這里是 false终蒂,表示是普通的進程
if(!system){
//與 AMS binder 通信,執(zhí)行system_server中 AMS 的attachApplication()
final IActivityManager mgr = ActivityManagerNative.getDefault();
//mAppThread 是 ApplicationThread 類遥诉,包含很多可以和mH 通訊的方法,是進行 Binder 通信的
mrg.attachApplication(mAppThread);
...
}else{
//系統(tǒng)應(yīng)用拇泣,不關(guān)心
...
}
}
轉(zhuǎn)到 AMS:
//AMS
public final void attachApplication(IApplicationThread thread){
//Binder.getCallingPid(),獲得調(diào)用該方法的進程 id,在本例中就是這個用戶 app
int callingPid = Binder.getCallingPid();
attachApplicationLocked(thread, callingPid);
}
private final boolean attachApplicationLocked(IApplicationThread thread, int pid){
// 獲取進程相關(guān)的信息
ProcessRecord app = mPidSelfLocked.get(pid);
...
//binder 通信矮锈,又回到了用戶 app
//通過AMS 獲得用戶進程相關(guān)信息霉翔,并且恰當?shù)姆祷亟o用戶進程
thread.bindApplication(...);
...
//這里會啟動 app 的 launcher Activity
if(mStackSupervisor.attachApplicationLocker(app)){
...
}
}
//bindApplication(...)@ActivityThread$ApplicationThread
public final void bindApplication(...N 多參數(shù),與當前進程相關(guān)){
//獲得該進程相關(guān)的 PackageInfo
IPackageManager pm = getPackageManager();
android.content.pm.PackageInfo pi = pm.getPackageInfo(appInfo.packageName,0,UserHandler,myUserId);
AppBindData data = new AppBindData();
{通過AMS返回的數(shù)據(jù)組裝用戶進程需要的 AppBindData}
..sendMessage(H.BINDER_APPLICATION,data);
}
mH分發(fā)苞笨,調(diào)用handleBinderApplication(AppBindData)@ActivityThread
``
private void handleBindApplication(AppBindData data){
// 終于正確設(shè)置了進程名
android.ddm.DdmHandleAppName.setAppName(data.processName,UserHandle.myUserId());
final ContextImpl appContext = ContextImpl.createAppContext(this,data.info);
...
ContextImpl instrContext = Context.createAppContext(this, pi);
//創(chuàng)建關(guān)鍵管家類 Instrumentation
java.lang.ClassLoader cl=instrContext.getClassLoader();
mInstrumentation = (Instrumentation)cl.loadClass(data.instrumentionName.getClassName()).newInstance();
mInstrumentation.init(...);
}
...
//里面通過反射創(chuàng)建 Application债朵,并且創(chuàng)建一個 ContextImpl 綁定到 app 上
Application app = data.info.makeApplication(data.restrictedBackupMpde,null)
...
//調(diào)用onCreate()@Application
mInstrumentation.callApplicationOnCreate(app);
//以上,在用戶進程完成了當前進程相關(guān)的信息的查詢以及綁定瀑凝,并且生成了上下文 Instrumentation與Application兩個重要的類序芦。
//接下里另外一條線進行 Launcher Activity的啟動了
//attachApplicationLocker(AppliationThread)@ActivityStackSupervisor
boolean attachApplication(ProcessRecord app){
ActivityRecord hr = stack.topRunningActivityLocaked(null);
//關(guān)鍵
realStartActivityLocked(hr, app, true, true);
}
final boolean readlStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig){
//只看關(guān)鍵一句
//app.thread是用戶進程 ApplicationThread binder對象
app.thread.scheduleLaunchActivity(...);
}
又回到了用戶進程,scheduleLanchActivity()@ActivityThread$ApplicationThread
public final void scheduleLaunchActivity(...){
ActivityClientRecord r = new ActivityClientRecord();
{組裝 ActivityClientRecord 信息}
sendMessage(H.LAUNCH_ACTIVITY,r);
}
H
{
handleLaunchaerActivity(ActivityClientRecord r,null);
}
//ActivityThread
private void handleLaunchActivity(ActivityClientRecord r,Intent customIntent){
// 生成 Activity 并且初始化
Activity a = performLaunchActivity(r, customIntent);
//調(diào)用onRestart() ,onStart()與 onResume()
handleResumeActivity(...);
}
private Activity performLaunchActivity(ActivityClientRecord r,Intent customIntent){
//反射生成 Activity
Activity activity=mInstrumentation.newActivity(clmcomponent.getClassName(),r.intent);
//單例,即App 的 Application
Application App=r.packageInfo.makeAppliction(falsemmInstrumentation)粤咪;
//實例化一個 ContextImpl
Context appContext = createBaseContextForActivity(r, activity);
//綁定到 activity谚中,也可以看到 Instrumentation 是共享的
//調(diào)用 attach(Context)@activity
activity.attach(appContext,this,getInstrumentation()...);
//onCreate()@Activity生命周期
mInstrumentation.callActivityOnCreate();
//onPostCreate()@Activity生命周期
//mInstrumentation.callActivityOnPostCreate();
}