Android应用启动中的进程交互

应用启动中的进程交互

关于进程


关于Android中的进程,有必要知道:java

  • 每一个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。

截屏2020-10-16下午4.45.57.png

进程启动概览

Android应用程序启动过程源代码分析 这篇文章详细描述了这个过程。
下面涉及到的源码为Android7.0。AOSP git分支:nougat-release


截屏2020-10-16下午5.03.37.pngandroid

1.Activity.startActivity

隐式启动

咱们以应用A隐式启动应用B的Activity为例,介绍应用启动过程当中的进程交互。
咱们有两个App,这样应用A就能够经过Intent("com.a.appb.start.main")启动应用BActivity了。git

//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;
    }
复制代码
相关文章
相关标签/搜索