ActivityManagerService启动过程

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。

Launcher启动过程

转载于:https://juejin.im/post/5c78c23bf265da2daf79ba59

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值