frameworks/base/services/core/java/com/android/server/
- am/ActivityManagerService.java
- SystemServiceManager.java
frameworks/base/services/java/com/android/server/
- SystemServer.java
1 创建ActivityManagerService对象,并注册
在分析phone进程开启过程中提到了ActivityManagerService,ActivityManagerService又是如何开启的?system_server进程启动后,进入SystemServer的main方法,调用startBootstrapServices。
1、在SystemServiceManager的startService中创建ActivityManagerService对象,并回调Lifecycle的onStart。
2、并在ActivityManagerService的setSystemProcess中往ServiceManager中注册"activity"服务。
frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
// Start services.
try {
startBootstrapServices();
startCoreServices();
startOtherServices();
}
}
private void startBootstrapServices() {
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
...
// Set up the Application instance for the system process and get started.
mActivityManagerService.setSystemProcess();
}
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public <T extends SystemService> T startService(Class<T> serviceClass) {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
service.onStart();
}
frameworks/base/services/core/java/com/android/server/ActivityManagerService.java
private void start() {
Process.removeAllProcessGroups();
mProcessCpuThread.start();
mBatteryStatsService.publish(mContext);
mAppOpsService.publish(mContext);
Slog.d("AppOps", "AppOpsService published");
LocalServices.addService(ActivityManagerInternal.class, new LocalService());
}
public static final class Lifecycle extends SystemService {
private final ActivityManagerService mService;
public Lifecycle(Context context) {
super(context);
mService = new ActivityManagerService(context);//创建ActivityManagerService对象
}
@Override
public void onStart() {
mService.start();
}
public ActivityManagerService getService() {
return mService;
}
}
public void setSystemProcess() {
ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);//注册”activity“服务
}
2 启动persistent进程、启动桌面
通过startOtherServices方法启动persistent进程、启动桌面
frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
mActivityManagerService.systemReady(new Runnable() {
@Override
public void run() {
}
}
}
frameworks/base/services/core/java/com/android/server/ActivityManagerService.java
public void systemReady(final Runnable goingCallback) {
synchronized (this) {
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
try {
List apps = AppGlobals.getPackageManager().
getPersistentApplications(STOCK_PM_FLAGS);
if (apps != null) {
int N = apps.size();
int i;
for (i=0; i<N; i++) {
ApplicationInfo info
= (ApplicationInfo)apps.get(i);
if (info != null &&
!info.packageName.equals("android")) {
addAppLocked(info, false, null /* ABI override */);
}
}
}
} catch (RemoteException ex) {
// pm is in same process, this will never happen.
}
}
// Start up initial activity.
mBooting = true;
startHomeActivityLocked(mCurrentUserId, "systemReady");
}
3 创建app进程函数
//app进程的创建全部走这个函数
private final void startProcessLocked(ProcessRecord app, String hostingType,
String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
if (entryPoint == null) entryPoint = "android.app.ActivityThread";
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +
app.processName);
checkTime(startTime, "startProcess: asking zygote to start proc");
Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,
app.info.dataDir, entryPointArgs);
checkTime(startTime, "startProcess: returned from zygote!");
}
总结
ActivityManagerService提供了启动launcher、启动persistent进程、通过startActivity\startService等方式创建应用进程的方法startProcessLocked。