アクティビティやコンポーネントの実行状態を管理するシステムプロセス --ActivityManagerService

AMSの起動プロセス

AMS は Android が提供する、Activity やその他のコンポーネントの実行状況を管理するシステムプロセスで、apk を作成する際に最も頻繁に使用されるシステムサービスで、起動SystemServerServiceManagerそれと WMS はどちらも「実名」バインダー サーバーです。

WMS と同様に、AMS も でホストされますsystemServerシステムが顧客リクエストのループ処理を開始すると、スレッドが作成されます。ServiceManagerAMS は「アクティビティ」、「meminfo」、「cpuinfo」などのさまざまなサービスを登録することに注意してください。Binder Serverただし、最初の「アクティビティ」のみが AMS の「主要な業務」であり、これは 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 を簡単に開始できる静的な main 関数を提供します。次に、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();
        }
    }

上記のnotifyAllは、オブジェクトが配置されている待機キュー上のすべてのターゲットを起動します。これには当然、SystemServerが属するスレッドも含まれます。これは、その後の SystemServer の動作が AMS に依存するため、AMS の準備ができていないときにむやみに復帰すると、システムダウンが発生する可能性があるためです。
ServiceManager への AMS の登録は非常に簡単ですが、注意すべき点は、自身の Server を登録するだけでなく、プロセス管理に関連する一連のサービスを登録することです。次のように:

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

コアクラス

ActivityStack と ActivityTask、ActivityStack はアクティビティのレコーダーおよびマネージャーであり、AMS がシステムの操作を管理するための基盤も提供します。AMS スレッドを作成すると、ActivityStack が作成されます。ActivityTask は、Android アプリケーションの優れたツールです。

Android AMS ソースコード読み取り解析 (1)

Android AMS ソースコードの解析と読み取り (2)

Android AMS ソースコードの解析と読み取り (3)

おすすめ

転載: blog.csdn.net/jxq1994/article/details/132631200