关于进程
关于Android中的进程,有必要知道:
- 每个App都运行在单独的应用进程中
- 除了应用进程,系统还有Init进程,Zygote进程,SystemServer进程,这些系统进程都是在Android系统启动时产生的。
- Init进程是Android系统的第一个进程。Init进程创建了Zygote进程,
- Zygote进程通过fork()方式创建其他进程,包括SystemServer进程和应用进程。
- SytemServer进程,即系统服务进程,我们App能拥有framework的能力都是它提供的。比如Activity的启动就是通过系统服务进程中的ActivityManagerService。
- apk(dex)文件的运行环境是DalvikVM,也称之为ART(Android Runtime) 。Zygote进程创建了最初的VM。每个进程中都有一个VM。Zygote fork的应用进程自然也拥有自己的VM。
进程启动概览
下面涉及到的源码为Android7.0。AOSP git分支:nougat-release
1.Activity.startActivity
隐式启动
我们以应用A隐式启动应用B的Activity为例,介绍应用启动过程中的进程交互。
我们有两个App,这样应用A就可以通过Intent(“com.a.appb.start.main”)启动应用BActivity了。
//App A
class AppAActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app_a)
btnStartAppB.setOnClickListener {
startActivity(Intent("com.a.appb.start.main"))
}
}
}
//App B
class AppBActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app_b)
}
}
//AndroidMainfest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<activity android:name=".AppBActivity">
...
<intent-filter>
<action android:name="com.a.appb.start.main"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
...
</manifest>
调用过程
Activity.startActivity(Intent)
Activity.startActivity(Intent,Options)
Activity.startActivityForResult(Intent,RequestCode)
Activity.startActivityForResult(Intent,RequestCode,Options)
Instrumentation.execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options)
ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
ActivityManagerService.startActivity(IBinder whoThread, String callingPackage,
Intent intent, String resolvedType, Bundle bOptions)
2.AMS.startActivity
ActivityManagerService.startActivity(whoThread,callingPackage,...)
ActivityManagerService.startActivityAsUser(IApplicationThread,callingPackage,...)
ActivityStarter.startActivityMayWait(IApplicationThread,callingUid,callingPackage,...)
ActivityStarter.startActivityLocked(IApplicationThread,intent,ephemeralIntent,...)
ActivityStarter.startActivityUnchecked(ActivityRecord,sourceRecord,...)
ActivityStackSupervisor.resumeFocusedStackTopActivityLocked()
ActivityStack.resumeTopActivityUncheckedLocked(ActivityRecord prev,...)
ActivityStack.resumeTopActivityInnerLocked(ActivityRecord prev,...)
ActivityStackSupervisor.startSpecificActivityLocked(ActivityRecord r,boolean andResume,...)
ActivityManagerService.startProcessLocked( processName,ApplicationInfo, ...)
3.AMS.startProcess
ActivityManagerService.startProcessLocked( processName,ApplicationInfo, ...)
Process.start(final String processClass, final String niceName,…)
Process.startViaZygote(String processClass,String niceName,…)
Process.zygoteSendArgsAndGetResult( ZygoteState, args)
ZygoteInit.runSelectLoop(String abiList)//Zygote被创建后启动循环等待创建进程的请求
ZygoteConnection.runOnce()
Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, …)
Zygote.nativeForkAndSpecialize(
uid, gid, gids, debugFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
instructionSet, appDataDir)
com_android_internal_os_Zygote.com_android_internal_os_Zygote_nativeForkAndSpecialize(…)
com_android_internal_os_Zygote.ForkAndSpecializeCommon(…)
com_android_internal_os_Zygote.fork(…)
4.Zygote.fork
5.ActivityThread.main
ActivityManagerService.startProcessLocked( processName,ApplicationInfo, ...)
Process.start(final String processClass, final String niceName,…)
Process.startViaZygote(String processClass,String niceName,…)
Process.zygoteSendArgsAndGetResult( ZygoteState, args)
ZygoteInit.runSelectLoop(String abiList)//Zygote被创建后启动循环等待创建进程的请求
ZygoteConnection.runOnce()
Zygote.handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);
RuntimeInit.zygoteInit(targetSdkVersion, remainingArgs,…);
RuntimeInit.applicationInit(targetSdkVersion, argv, …)
RuntimeInit.invokeStaticMain(args.startClass, args.startArgs, …)
android.app.ActivityThread.main()
ActivityThread.attach(system:false)
ActivityManagerService.attachApplication(ApplicationThread)
ActivityManagerService.attachApplicationLocked(thread,callingPid)
6.AMS.attachApplication
ActivityManagerService.attachApplicationLocked(thread,callingPid)
ApplicationThread.bindApplication(processName,ApplicationInfo,…)
ActivityThead.handleBindApplication(AppBindData)
LoadedApk.makeApplication(forceDefaultAppClass,instrumentation)
ActivityStackSupervisor.attachApplocationLocked(app)
ActivityStackSupervisor.realStartActivityLocked(ActivityRecord,ProcessRecord,...)
ApplicationThread.scheduleLauchActivity(intent,token,...)
7.ApplicationThread.scheduleLauchActivity
ApplicationThread.scheduleLauchActivity(intent,token,...)
H.sendMessage(H.LAUNCH_ACTIVITY, r)
ActivityThread.handleLaunchActivity(ActivityClientRecord,...)
何时加载Application
public Application makeApplication(boolean forceDefaultAppClass,
Instrumentation instrumentation) {
.....
Application app = null;
String appClass = mApplicationInfo.className;
java.lang.ClassLoader cl = getClassLoader();
initializeJavaContextClassLoader();
ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
appContext.setOuterContext(app);
mActivityThread.mAllApplications.add(app);
mApplication = app;
instrumentation.callApplicationOnCreate(app);
....
return app;
}