Activity 및 구성요소의 실행 상태를 관리하는 시스템 프로세스--ActivityManagerService

AMS 시작 프로세스

AMS는 Activity 및 기타 구성 요소의 실행 상태를 관리하기 위해 Android에서 제공하는 시스템 프로세스로, apk 작성에 가장 많이 사용되는 시스템 서비스로 SystemServer에서 ServiceManager. 그것과 WMS는 모두 "실명" 바인더 서버입니다.

WMS와 마찬가지로 AMS도 systemServer. 시스템이 루프에서 고객 요청을 처리하기 시작하면 스레드가 생성됩니다. ServiceManagerAMS는 "활동", "meminfo", "cpuinfo" 등과 같은 다양한 서비스를 등록한다는 점을 언급할 가치가 있습니다 Binder Server. 그러나 첫 번째 "활동"만이 AMS의 "주요 사업"이며 다음에 의해 구현됩니다 Activity ManagerService. 나머지 서비스의 기능은 다른 클래스에서 제공됩니다.

먼저 AMS의 시작 과정을 살펴보겠습니다. 다음과 같이:

 /*frameworks/base/services/java/com/android/server/SystemServer.java*/
    public void run(){ 
        ...
        Slog.i(TAG, "Activity Manager");
        context = ActivityManagerService.main(factoryTest); //启动AMS
        ...
        ActivityManagerService.setSystemProcess(); //向ServiceManager注册AMS
    }

ActivityManagerService는 AMS를 쉽게 시작할 수 있는 정적 주요 기능을 제공합니다. 그런 다음 setSystemProcess를 호출하여 이 중요한 시스템 서비스를 ServiceManager에 등록해야 합니다. WMS와 마찬가지로 "실명" 바인더 서버임을 알 수 있습니다.

    /*frameworks/base/services/java/com/android/server/am/ActivityManagerService.java*/
    public static final Context main(int factoryTest) {
        AThread thr = new AThread(); //创建AMS线程
        thr.start(); //启动AMS线程
        synchronized (thr) {
            while (thr.mService == null) {
                /*注意,这段代码是运行在SystemServer所在线程中的。
                所以通过mService是否为空来判断AMS成功启动与否:如果是的话就可以返回SystemServer 继续执行,否则就一直等待。
                Android在处理“系统级进程”出错时的普遍态度是“既然系统都出错 了,任何补救都是无力回天的”,所以它的异常处理部分经常是空的
                 */
                try {
                    thr.wait();
                } catch (InterruptedException e) {
                }
            }
        }
        …
        m.mMainStack=new ActivityStack(m,context,true); //创建一个ActivityStack对象,这是AMS的核心,很多工作都是围绕它展开的
        ...
        return context;
    }

SystemServer가 위치한 스레드의 경우 계속 실행하려면 AThread(위에서 언급한 변수 thr)가 성공적으로 시작될 때까지 기다려야 합니다. 따라서 thr.start() 이후 thr.wait()를 통해 대기합니다. 그럼 언제 일어나요? 대답은 AThread 안에 있습니다:

 public void run() {
        …
        synchronized (this) {
            mService = m;
            mLooper = Looper.myLooper();
            notifyAll();
        }
    }

위의 informAll은 Thr 개체가 있는 대기 대기열의 모든 대상을 깨울 것입니다. 여기에는 당연히 SystemServer가 속한 스레드가 포함됩니다. 그 이유는 SystemServer의 후속 작업이 AMS에 달려 있기 때문에 AMS가 준비되지 않은 상태에서 성급하게 복귀하면 시스템 다운타임이 발생할 가능성이 있기 때문입니다.
AMS를 ServiceManager에 등록하는 방법은 매우 간단하며, 주의할 점은 자체 Server뿐만 아니라 프로세스 관리와 관련된 일련의 서비스도 등록한다는 점입니다. 다음과 같이:

    public static void setSystemProcess() {
        try {
            ActivityManagerService m = mSelf;
            ServiceManager.addService("activity", m, true);//AMS的主业ServiceManager.addService("meminfo", new
            MemBinder(m));//内存使用情况…//其他服务省略
        }
    }

핵심 수업

ActivityStack 및 ActivityTask인 ActivityStack은 Activity의 기록기이자 관리자이며 AMS가 시스템 운영을 관리할 수 있는 기반을 제공합니다. AMS 스레드를 생성하면 ActivityStack이 생성됩니다. ActivityTask는 Android 애플리케이션의 훌륭한 도구입니다.

Android AMS 소스코드 판독 분석(1)

Android AMS 소스코드 분석 및 판독(2)

Android AMS 소스코드 분석 및 판독(3)

추천

출처blog.csdn.net/jxq1994/article/details/132631200