• 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方法来创建对应的应用程序进程


        
  • 相关阅读:
    Android自己定义组件系列【2】——Scroller类
    ostringstream的使用方法
    什么是Spring?Spring是什么?
    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
    伤不起的戴尔台式机XPS8700脆弱的蓝牙
    cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
    SSL工作原理
    AfxMessageBox和MessageBox差别
    oninput,onpropertychange,onchange的使用方法和差别
    Bootstrap网站模板
  • 原文地址:https://www.cnblogs.com/liunx1109/p/11104216.html
Copyright © 2020-2023  润新知