Framework学习之AMS的学习

一、AMS的启动流程

  1.SystemServer.java里面启动main()函数

    public static void main(String[] args) {

       new SystemServer().run(); }

  2.SystemServer.java里面的run方法

   System.loadLibrary("android_servers");    //加载service动态链接库  

   startBootstrapServices();                                 //启动ActivityManagerService、PowerManagerService、PackageManagerService等引导服务
   startCoreServices();                                        //启动核心服务
   startOtherServices();                                      //启动其他的服务

 

  3.SystemServiceManager.java的startService

     public <T extends SystemService> T startService(Class<T> serviceClass) {

      ......

      Constructor<T> constructor = serviceClass.getConstructor(Context.class);//1

      service = constructor.newInstance(mContext);//2      constructor的newInstance方法来创建Lifecycle类型的service对象   

      mServices.add(service);//3                   service添加到ArrayList类型的mServices对象中来完成注册

      service.onStart();//4                        service(Lifecycle)的onStart方法来启动service,并返回该service

      .......}

    

     Lifecycle实际上是ActivityManagerService.java的一个内部类

      public static final class Lifecycle extends SystemService {

      private final ActivityManagerService mService;

      public Lifecycle(Context context) {

      super(context); mService = new ActivityManagerService(context);//1}

      @Override public void onStart() {

      mService.start();//2 }      

      public ActivityManagerService getService() {

      return mService;//3 } }

    当调用Lifecycle类型的service的onStart方法时,实际上是调用了注释2处AMS的start方法

    

  二、AMS与进程启动

    AMS在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求Zygote进程将需要的应用程序进程启动。Service的启动过程中会调用ActiveServices的bringUpServiceLocked方法

private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg,
            boolean whileRestarting, boolean permissionsReviewRequired)
            throws TransactionTooLargeException {
  ...
  final String procName = r.processName;//1
  ProcessRecord app;
  if (!isolated) {
            app = mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);//2
            if (DEBUG_MU) Slog.v(TAG_MU, "bringUpServiceLocked: appInfo.uid=" + r.appInfo.uid
                        + " app=" + app);
            if (app != null && app.thread != null) {//3
                try {
                    app.addPackage(r.appInfo.packageName, r.appInfo.versionCode,
                    mAm.mProcessStats);
                    realStartServiceLocked(r, app, execInFg);//4
                    return null;
                } catch (TransactionTooLargeException e) {
              ...
            }
        } else {
            app = r.isolatedProc;
        }
 if (app == null && !permissionsReviewRequired) {//5
            if ((app=mAm.startProcessLocked(procName, r.appInfo, true, intentFlags,
                    "service", r.name, false, isolated, false)) == null) {//6
              ...
            }
            if (isolated) {
                r.isolatedProc = app;
            }
        }
 ...     
}
   1.ServiceRecord的processName的值赋值给procName ,其中ServiceRecord用来描述Service的android:process属性
   2.将procName和Service的uid传入到AMS的getProcessRecordLocked方法中,来查询是否存在一个与Service对应的ProcessRecord类型的对象app,ProcessRecord主要用来记录运行的应用程序进程的信息
   5.判断Service对应的app为null则说明用来运行Service的应用程序进程不存在,
   6.AMS的startProcessLocked方法来创建对应的应用程序进程


    

 

posted on 2019-06-28 18:13  zhang11111wei  阅读(362)  评论(0编辑  收藏  举报

导航