ActivityManagerService 시작 프로세스 간략 분석

4133 단어 Framework
Activity Manager 서비스(AMS)는 안드로이드의 핵심 서비스로 주로 시스템의 4대 구성 요소의 시작, 전환, 응용 프로세스의 관리와 스케줄링 등을 책임진다.다음은 주로 Activity Manager Service의 시작 절차를 살펴보고 AMS는 SystemServer입니다.java가 시작되면 zygote 프로세스가 SyetemServer를 호출합니다.java의run 방법으로 관련 서비스를 시작합니다.
1. SystemServer.java
frameworks/base/services/java/com/android/server/SystemServer.java
/**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }

1. 런 방법
private void run() { 
   try {
        ...
         // Initialize the system context.
     createSystemContext();

     //   ,     SystemService     
      mSystemServiceManager = new SystemServiceManager(mSystemContext);
     //               。
     LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    } finally {
     Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }

   // Start services.
  try {
      Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");
     startBootstrapServices(); //      
     startCoreServices(); //      
     startOtherServices(); //      
    } catch (Throwable ex) {
     Slog.e("System", "******************************************");
     Slog.e("System", "************ Failure starting system services", ex);
     throw ex;
    } finally {
     Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
    }
...
}

Activity Manager Service는 부트 서비스에 속하며 다음 startBootstrap Services() 방법을 보겠습니다.
2、startBootstrapServices()
이 방법에는 주로 Activity Manager Service, PowerManager Service, Lights Service, Display Manager Service 등 서비스가 켜져 있다. Activity Manager Service는 다른 서비스와 달리 System Service를 직접 계승한다. Activity Manager Service에는 내부 클래스인 Lifecycle가 정의되어 있는데 이 클래스는 System Service를 계승한다.SystemService Manager는 Lifecycle을 통해 Activity Manager Service를 엽니다.관련 코드는 다음과 같습니다.
private void startBootstrapServices() {
     Installer installer = mSystemServiceManager.startService(Installer.class);
      ...
     mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);

    ...

 }

3、SystemServiceManager.startService(Class serviceClass)
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
반사 메커니즘을 통해 서비스 대상을 얻고 서비스에 대응하는 start 방법을 호출합니다.
public  T startService(Class serviceClass) {
        try {
            final String name = serviceClass.getName();
            ....
            final T service;
            try {
                Constructor constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
            } catch (InstantiationException ex) {
               ...
            }

            // Register it.
            mServices.add(service);

            // Start it.
            try {
                service.onStart();
            } catch (RuntimeException ex) {
                ...
           }
    }

4、Lifecycle.start()
SystemService Manager는 start Service를 통해Activity Manager 서비스의 내부 클래스인 Lifecycle 대상을 가져오고,Lifecycle을 통해Activity Manager 서비스 대상을 열고 가져오면Activity Manager 서비스가 만들어지고 켜집니다.
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public static final class Lifecycle extends SystemService {
        private final ActivityManagerService mService;

        public Lifecycle(Context context) {
            super(context);

            /// M: Add BootEvent for profiling
            BootEvent.setEnabled(true);

            mService = new ActivityManagerService(context);
        }

        @Override
        public void onStart() {
            mService.start(); //  ActivityManagerService
        }

        public ActivityManagerService getService() {
            return mService;
        }
    }

좋은 웹페이지 즐겨찾기