zoukankan      html  css  js  c++  java
  • 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方法来创建对应的应用程序进程


        
  • 相关阅读:
    POJ3690:Constellations——题解
    BZOJ1857:[SCOI2010]传送带——题解
    CF578C:Weakness and Poorness——题解
    程序员教我的那些事
    程序员教我的那些事
    手把手教你利用Jenkins持续集成iOS项目
    手把手教你利用Jenkins持续集成iOS项目
    手把手教你利用Jenkins持续集成iOS项目
    华为招聘-​分布式并行计算解决方案测试工程师
    华为招聘-​分布式并行计算解决方案测试工程师
  • 原文地址:https://www.cnblogs.com/liunx1109/p/11104216.html
Copyright © 2011-2022 走看看