AMSの起動プロセス
AMS は Android が提供する、Activity やその他のコンポーネントの実行状況を管理するシステムプロセスで、apk を作成する際に最も頻繁に使用されるシステムサービスで、起動SystemServer
とServiceManager
。それと WMS はどちらも「実名」バインダー サーバーです。
WMS と同様に、AMS も でホストされますsystemServer
。システムが顧客リクエストのループ処理を開始すると、スレッドが作成されます。ServiceManager
AMS は「アクティビティ」、「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 アプリケーションの優れたツールです。