Android应用启动中的进程交互

关于进程

关于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;
    }

猜你喜欢

转载自blog.csdn.net/Android23333/article/details/115356021