基于Android U
Zygote的Java框架层中,会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程。要启动一个应用程序,首先要保证这个应用程序所需要的应用程序进程已经存在。在启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程创建需要的应用程序进程。这里以Service的启动过程为例,来分析AMS与应用程序进程的关系。Service在启动过程中会调用ActivieService的bringUpServiceInnerLocked()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| frameworks/base/services/core/java/com/android/server/am/ActiveServices.java private String bringUpServiceInnerLocked(ServiceRecord r, int intentFlags, boolean execInFg, boolean whileRestarting, boolean permissionsReviewRequired, boolean packageFrozen, boolean enqueueOomAdj) throws TransactionTooLargeException { ... final String procName = r.processName; ... ProcessRecord app;
if (!isolated) { app = mAm.getProcessRecordLocked(procName, r.appInfo.uid); ... if (app != null) { final IApplicationThread thread = app.getThread(); final int pid = app.getPid(); final UidRecord uidRecord = app.getUidRecord(); if (thread != null) { try { ... realStartServiceLocked(r, app, thread, pid, uidRecord, execInFg, enqueueOomAdj); return null; } catch (TransactionTooLargeException e) { throw e; } catch (RemoteException e) { Slog.w(TAG, "Exception when starting service " + r.shortInstanceName, e); } finally { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } } } } else { ... }
if (app == null && !permissionsReviewRequired && !packageFrozen) { if (r.isSdkSandbox) { ... } else { app = mAm.startProcessLocked(procName, r.appInfo, true, intentFlags, hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, false, isolated); } ... } ... return null; }
|
注释1处得到ServiceRecord的processName值并赋给procName,其中processName用来描述Service想要在哪个进程中运行,默认是当前进程,我们也可以在AndroidManifest.xml文件中设置android:process属性来新开启一个进程运行Service。
在注释2处将procName和Service的uid传入到AMS的getProcessRecordLocked()方法中,查询是否存在一个与Service对应的ProcessRecord类型的对象app,ProcessRecord主要用来描述运行的应用程序进程的信息。
在注释5处判断Service对应的app为null则说明用来运行Service的应用程序进程不存在,则调用注释6处的AMS的startProcessLocked()方法来创建对应的应用程序进程。
这里只讨论没有设置android:process属性,即应用程序进程存在的情况。在注释3处判断如果用来运行Service的应用程序进程存在,则调用注释4处的realStartServiceLocked()方法来启动Service。
总结
- 启动应用程序时AMS会检查这个应用程序需要的应用程序进程是否存在。
- 如果需要的应用程序进程不存在,AMS就会请求Zygote进程创建需要的应用程序进程。