1 前言

 

2 源码分析

2.1 ActivityManagerInternal 初始化流程

(1)请求启动应用进程的入口

/frameworks/base/services/core/java/com/android/server/wm/ActivityStackSupervisor.java

void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {final WindowProcessController wpc = mService.getProcessController(r.processName, r.info.applicationInfo.uid);...    //判断应用进程是否已创建,即 IApplicationThread 是否为空if (wpc != null && wpc.hasThread()) {try {            //启动 ActivityrealStartActivityLocked(r, wpc, andResume, checkConfig);return;}}try {...//应用进程不存在,通知创建应用进程,mService 为 ATMS;mService.mAmInternal 为 ActivityManagerInternal final Message msg = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mService.mAmInternal, r.processName,r.info.applicationInfo, knownToBeDead, "activity", r.intent.getComponent());mService.mH.sendMessage(msg);}...}

ActivityStackSupervisor 对象在 ATMS 的 initialize() 方法中创建,并将 ATMS 对象注入到 ActivityStackSupervisor 中。 

PooledLambda.obtainMessage() 获取一个 Message,并为其指定 Callback,即执行 mService.mAmInternal 对象的 ActivityManagerInternal::startProcess 函数,函数入参为 r.processName、r.info.applicationInfo 等5个参数。由此可知,ActivityManagerInternal 的 startProcess() 方法是请求启动应用进程的起点。

ActivityManagerInternal 是抽象类,其实现类是 AMS 的内部类 LocalService。接下来将分析 ActivityManagerInternal 的创建流程和 ATMS 获取起对象的流程。

(2)ActivityManagerInternal 的创建

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

private void start() {...LocalServices.addService(ActivityManagerInternal.class, new LocalService());    //调用 ATMS 的 onActivityManagerInternalAdded 方法进一步初始化mActivityTaskManager.onActivityManagerInternalAdded();...}

start() 方法被 AMS.Lifecycle 的 onStart() 方法调用,onStart() 方法又被 SystemServiceManager 的 startService() 方法调用。 

(3)ATMS 获取 ActivityManagerInternal

/frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public void onActivityManagerInternalAdded() {synchronized (mGlobalLock) {mAmInternal = LocalServices.getService(ActivityManagerInternal.class);...}}

(4)LocalServices

public final class LocalServices {    ...    private static final ArrayMap, Object> sLocalServiceObjects = new ArrayMap, Object>();    public static  T getService(Class type) {        synchronized (sLocalServiceObjects) {            return (T) sLocalServiceObjects.get(type);        }    }    public static  void addService(Class type, T service) {        synchronized (sLocalServiceObjects) {            ...            sLocalServiceObjects.put(type, service);        }    }...}

2.2 AMS 到 ZygoteState

(1)startProcess

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.LocalService.java

public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead, String hostingType, ComponentName hostingName) {try {...synchronized (ActivityManagerService.this) {startProcessLocked(processName, info, knownToBeDead, 0 , new HostingRecord(hostingType, hostingName), false, false, true);}}...}

(2)startProcessLocked

/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord, boolean allowWhileBooting, boolean isolated, boolean keepIfLarge) {    //mProcessList 在定义时就被初始化,即:final ProcessList mProcessList = new ProcessList()return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingRecord, allowWhileBooting, isolated, 0, keepIfLarge, null, null, null, null);}

(3)startProcessLocked

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java

final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {...ProcessRecord app;if (!isolated) {app = getProcessRecordLocked(processName, info.uid, keepIfLarge);...}...if (app == null) {...} else {app.addPackage(info.packageName, info.longVersionCode, mService.mProcessStats);...}...final boolean success = startProcessLocked(app, hostingRecord, abiOverride);...return success ? app : null;}

(4)startProcessLocked

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java

final boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, String abiOverride) {return startProcessLocked(app, hostingRecord, false, false, false, abiOverride);}

(5)startProcessLocked

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java

boolean startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, boolean disableHiddenApiChecks, boolean disableTestApiChecks, boolean mountExtStorageFull, String abiOverride) {...try {...final String entryPoint = "android.app.ActivityThread";return startProcessLocked(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith, startTime);}...}

(6)startProcessLocked

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java

boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal, String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) {...final long startSeq = app.startSeq = ++mProcStartSeqCounter;...mPendingStarts.put(startSeq, app);if (mService.mConstants.FLAG_PROCESS_START_ASYNC) {...mService.mProcStartHandler.post(() -> {try {final Process.ProcessStartResult startResult = startProcess(app.hostingRecord,entryPoint, app, app.startUid, gids, runtimeFlags, mountExternal,app.seInfo, requiredAbi, instructionSet, invokeWith, app.startTime);synchronized (mService) {handleProcessStartedLocked(app, startResult, startSeq);}}...});return true;} else {try {final Process.ProcessStartResult startResult = startProcess(hostingRecord, entryPoint, app, uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith, startTime);handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper, startSeq, false);}...return app.pid > 0;}}

(7)startProcess

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java

private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,String seInfo, String requiredAbi, String instructionSet, String invokeWith, long startTime) {try {...else {startResult = Process.start(entryPoint, app.processName, uid, uid, gids, runtimeFlags, mountExternal,app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, app.info.packageName, app.mDisabledCompatChanges, new String[]{PROC_START_SEQ_IDENT + app.startSeq});}...return startResult;}...}

 

(8)ProcessStartResult

/frameworks/base/core/java/android/os/Process.java

public static ProcessStartResult start(final String processClass, final String niceName, int uid, int gid, @Nullable int[] gids,int runtimeFlags, int mountExternal, int targetSdkVersion, String seInfo, String abi, String instructionSet,String appDataDir, String invokeWith, String packageName, long[] disabledCompatChanges, String[] zygoteArgs) {return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids, runtimeFlags, mountExternal, targetSdkVersion, seInfo, abi, instructionSet, appDataDir, invokeWith, packageName, true, disabledCompatChanges, zygoteArgs);}

(9)ProcessStartResult

/frameworks/base/core/java/android/os/Process.java

z

(10)ProcessStartResult

/frameworks/base/core/java/android/os/Process.java

z

 (11)ProcessStartResult

/frameworks/base/core/java/android/os/Process.java

z

2.3 ZygoteInit 到 ActivityThread

 

更多相关文章

  1. Android(安卓)Property System
  2. android studio接入facebook登录和分享
  3. Android(安卓)几种图像特效处理的集锦
  4. Android(安卓)选择文件并加载数据到界面
  5. Android中几种图片特效的处理的实现方法
  6. Android实现自动轮播图效果
  7. Android(安卓)ListView长按弹出CheckBox,实现全选,反选,批量删除功
  8. 【Android小经验】 ListView列中的一个ITEM值
  9. Android(安卓)去掉title bar的3个方法

随机推荐

  1. 对linux字符设备的理解(整体架构)
  2. 【嵌入式Linux学习七步曲之第五篇 Linux
  3. 如何查看最近安装的rpms?
  4. Uncompressing Linux... done, booting t
  5. 小米随身WiFi,Linux下AP热点驱动(开源)
  6. 走近Linux世界:Linux与Windows特性比较
  7. linux系统时间和硬件时钟问题(date和hwcl
  8. Linux 下串口编程之三 termios结构体介绍
  9. Linux上配置使用iSCSI详细说明
  10. pc与arm板间的文件传送