Androidカーネル解剖-AMS(Activity Manager Service)
zz:http://www.myexception.cn/android/1792465.html
androidカーネルプロファイリング学習ノート:AMS(Activity Management Service)内部原理と動作メカニズム
一、ActivityManagerServiceが提供する主な機能:(1)各アプリケーションを統一的にスケジューリングするActivity(2)メモリ管理
(3)プロセス管理
二、Activityを起動する方法は以下の通りである:(1)アプリケーションでstartActivityを呼び出し指定したActivityを起動する(2)ホームプログラムでアプリケーションアイコンをクリックし、新しいActivity(3)を起動して「Back」キーを押し、現在のActivityを終了し、前のActivity(4)に戻って「Home」キーを長押しし、現在実行中のプログラムのリストが表示され、その中から4つの起動方式を起動するマスター処理フローが1つ選択されると、最初の起動方式で実行され、後の3つの方式はフロントエンドメッセージ処理でそれぞれ異なるだけです.
三、プロセスデータ類ProcessRecord
このクラスのソースコードは~frameworksbaseservicesjavacomandroidserveramパスの下にあります.
一般的に、1つのAPKファイルが実行されると1つのプロセスに対応し、プロセスレコードは1つのプロセスの関連情報を記録するために使用され、主に含まれる変数は、(1)プロセスファイル情報:そのプロセスに対応するAPKファイルの内部情報、例えば
final ApplicationInfo info;//all about the first app in the process final String processName; //name of the process
final ArrayMap pkgList = new ArrayMap();//プロセス内のすべてのAPKファイルパッケージ名の保存
(2)プロセスのメモリ状態情報:Linuxシステムのout of memory(OOM)の場合の処理であり、メモリの緊張が発生すると、Linuxシステムはプロセスのメモリ状態情報に基づいて優先度の低いプロセスを殺し、含まれる変数は
int maxAdj; //Maximum OOM adjustment for this process int curRawAdj; //Current OOM unlimited adjustment for this process int setRawAdj; //Last set OOM unlimited adjustment for this process int curAdj; //Current OOM adjustment for this process int setAdj;//Last set OOM adjustment for this process変数におけるAdjの意味は調整値(adjustment)
(3)プロセスに含まれるActivity,Provider,Serviceなどは,以下のようになる.
final ArrayList activities = new ArrayList(); final ArraySet services = new ArraySet(); final ArraySet executingServices = new ArraySet(); final ArraySet connections = new ArraySet(); final ArraySet receivers = new ArraySet(); final ArrayMap pubProviders = new ArrayMap(); final ArrayList conProviders = new ArrayList();
四、Activity Recordデータ類(Android 2.3以前のバージョンはHistoryRecord類)
ActivityManagerServiceはActivityRecordデータクラスを使用して各Activityの情報を保存する、ActivityRecordクラスはIApplicationTokenに基づく.Stubクラスは、BinderでもあるのでIPCで呼び出すことができます.
主な変数は次のとおりです.
(1)環境情報:プロセス名、ファイルパス、データパス、アイコン、トピックなどのActivityの作業環境.
final String packageName;//the package implementing intent's component final String processName;//process where this component wants to run final String baseDir; //where activity source (resources etc) located final String resDir; //where public activity source (public resources etc) located final String dataDir; //where activity data should go int theme; //resource identifier of activity's theme. int realTheme; //actual theme resource we will use, never 0.
(2)運転状態データ情報:idle、stop、finishingなど、一般的にbooleanタイプであり、以下の通りである
boolean haveState; //have we gotten the last activity state? boolean stopped; //is activity pause finished? boolean delayedResume; //not yet resumed because of stopped app switches? boolean finishing; //activity in pending finish list? boolean configDestroy; //need to destroy due to config change?
五、TaskRecord類
Activity Managementサービスでは、タスクの概念を使用して、Activityの起動と終了の順序を確保します.TaskRecordのいくつかの重要な変数は以下の通りである:final int taskId;//各タスクの表示 Intent intent;//このタスクの作成時に対応するintent int numActivities;//このタスクのActivity数final ArrayList mActivities=new ArrayList()//タスク内のすべてのActivityを表示順にリストする
六、ActivityManagerServiceにおける重要なスケジューリング関連変数
(1)最近起動したActivityを記録し、RAM容量が小さい場合は記録の最大値が10個、そうでない場合は20個とし、それを超えるとAmsは最も早く記録したActivity static final int MAX_を破棄するRECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20; (2)Amsがアプリケーション起動(Launch)のActivityを通知すると、10 sを超えるとAmsはstatic final int PROC_を放棄するSTART_TIMEOUT = 10*1000; (3)Amsが顧客プロセスを開始すると、顧客プロセスは10 s以内にAms自身が開始したことを報告しなければならない.そうしないと、Amsは指定した顧客プロセスにstatic final int PROCが存在しないと判断する.START_TIMEOUT = 10*1000; (4)待機シーケンス:Ams内部の準備ができていない場合、顧客プロセスがActivityの起動を要求すると、その変数に一時的に保存され、final ArrayList mPendingActivity Launches=new ArrayList()(5)優先的に起動し、次に停止する.プロセスA 1は2つのActivityを含み、起動順序はA 1->A 2であり、ユーザがA 2の起動を要求すると、A 1が実行中である場合、AmsはまずA 1を一時停止し、その後A 2を起動し、A 2が起動してからA 1を停止する. private final ArrayList mRecentTasks = new ArrayList();
七、startActivity()のプロセスユーザーがアプリケーションアイコンをクリックすると、実行プログラムはそのアイコンのonClick()イベントでstartActivity()メソッドを呼び出し、このメソッドはstartActivity ForResult()を呼び出し、このメソッドの内部でInstrumentationオブジェクトのexecuteStartActivity()メソッドを呼び出します.各Activityの内部にはInstrumentationオブジェクトの参照があり、それは執事であり、Activity ThreadがActivityを作成または一時停止するのはそれによって実現されます.
フローチャートは次のとおりです.
フローチャートは次のとおりです.
androidカーネルプロファイリング学習ノート:AMS(Activity Management Service)内部原理と動作メカニズム
一、ActivityManagerServiceが提供する主な機能:(1)各アプリケーションを統一的にスケジューリングするActivity(2)メモリ管理
(3)プロセス管理
二、Activityを起動する方法は以下の通りである:(1)アプリケーションでstartActivityを呼び出し指定したActivityを起動する(2)ホームプログラムでアプリケーションアイコンをクリックし、新しいActivity(3)を起動して「Back」キーを押し、現在のActivityを終了し、前のActivity(4)に戻って「Home」キーを長押しし、現在実行中のプログラムのリストが表示され、その中から4つの起動方式を起動するマスター処理フローが1つ選択されると、最初の起動方式で実行され、後の3つの方式はフロントエンドメッセージ処理でそれぞれ異なるだけです.
三、プロセスデータ類ProcessRecord
このクラスのソースコードは~frameworksbaseservicesjavacomandroidserveramパスの下にあります.
一般的に、1つのAPKファイルが実行されると1つのプロセスに対応し、プロセスレコードは1つのプロセスの関連情報を記録するために使用され、主に含まれる変数は、(1)プロセスファイル情報:そのプロセスに対応するAPKファイルの内部情報、例えば
final ApplicationInfo info;//all about the first app in the process final String processName; //name of the process
final ArrayMap pkgList = new ArrayMap();//プロセス内のすべてのAPKファイルパッケージ名の保存
(2)プロセスのメモリ状態情報:Linuxシステムのout of memory(OOM)の場合の処理であり、メモリの緊張が発生すると、Linuxシステムはプロセスのメモリ状態情報に基づいて優先度の低いプロセスを殺し、含まれる変数は
int maxAdj; //Maximum OOM adjustment for this process int curRawAdj; //Current OOM unlimited adjustment for this process int setRawAdj; //Last set OOM unlimited adjustment for this process int curAdj; //Current OOM adjustment for this process int setAdj;//Last set OOM adjustment for this process変数におけるAdjの意味は調整値(adjustment)
(3)プロセスに含まれるActivity,Provider,Serviceなどは,以下のようになる.
final ArrayList activities = new ArrayList(); final ArraySet services = new ArraySet(); final ArraySet executingServices = new ArraySet(); final ArraySet connections = new ArraySet(); final ArraySet receivers = new ArraySet(); final ArrayMap pubProviders = new ArrayMap(); final ArrayList conProviders = new ArrayList();
四、Activity Recordデータ類(Android 2.3以前のバージョンはHistoryRecord類)
ActivityManagerServiceはActivityRecordデータクラスを使用して各Activityの情報を保存する、ActivityRecordクラスはIApplicationTokenに基づく.Stubクラスは、BinderでもあるのでIPCで呼び出すことができます.
主な変数は次のとおりです.
(1)環境情報:プロセス名、ファイルパス、データパス、アイコン、トピックなどのActivityの作業環境.
final String packageName;//the package implementing intent's component final String processName;//process where this component wants to run final String baseDir; //where activity source (resources etc) located final String resDir; //where public activity source (public resources etc) located final String dataDir; //where activity data should go int theme; //resource identifier of activity's theme. int realTheme; //actual theme resource we will use, never 0.
(2)運転状態データ情報:idle、stop、finishingなど、一般的にbooleanタイプであり、以下の通りである
boolean haveState; //have we gotten the last activity state? boolean stopped; //is activity pause finished? boolean delayedResume; //not yet resumed because of stopped app switches? boolean finishing; //activity in pending finish list? boolean configDestroy; //need to destroy due to config change?
五、TaskRecord類
Activity Managementサービスでは、タスクの概念を使用して、Activityの起動と終了の順序を確保します.TaskRecordのいくつかの重要な変数は以下の通りである:final int taskId;//各タスクの表示 Intent intent;//このタスクの作成時に対応するintent int numActivities;//このタスクのActivity数final ArrayList mActivities=new ArrayList()//タスク内のすべてのActivityを表示順にリストする
六、ActivityManagerServiceにおける重要なスケジューリング関連変数
(1)最近起動したActivityを記録し、RAM容量が小さい場合は記録の最大値が10個、そうでない場合は20個とし、それを超えるとAmsは最も早く記録したActivity static final int MAX_を破棄するRECENT_TASKS = ActivityManager.isLowRamDeviceStatic() ? 10 : 20; (2)Amsがアプリケーション起動(Launch)のActivityを通知すると、10 sを超えるとAmsはstatic final int PROC_を放棄するSTART_TIMEOUT = 10*1000; (3)Amsが顧客プロセスを開始すると、顧客プロセスは10 s以内にAms自身が開始したことを報告しなければならない.そうしないと、Amsは指定した顧客プロセスにstatic final int PROCが存在しないと判断する.START_TIMEOUT = 10*1000; (4)待機シーケンス:Ams内部の準備ができていない場合、顧客プロセスがActivityの起動を要求すると、その変数に一時的に保存され、final ArrayList mPendingActivity Launches=new ArrayList()(5)優先的に起動し、次に停止する.プロセスA 1は2つのActivityを含み、起動順序はA 1->A 2であり、ユーザがA 2の起動を要求すると、A 1が実行中である場合、AmsはまずA 1を一時停止し、その後A 2を起動し、A 2が起動してからA 1を停止する. private final ArrayList mRecentTasks = new ArrayList();
七、startActivity()のプロセスユーザーがアプリケーションアイコンをクリックすると、実行プログラムはそのアイコンのonClick()イベントでstartActivity()メソッドを呼び出し、このメソッドはstartActivity ForResult()を呼び出し、このメソッドの内部でInstrumentationオブジェクトのexecuteStartActivity()メソッドを呼び出します.各Activityの内部にはInstrumentationオブジェクトの参照があり、それは執事であり、Activity ThreadがActivityを作成または一時停止するのはそれによって実現されます.
フローチャートは次のとおりです.
フローチャートは次のとおりです.
:http://popohope.blog.chinaunix.net/uid-29043620-id-5194763.html( AMS )