Android persistent属性研究
4922 ワード
この間telephonyを研究していたとき、frameworkの下でtelephonyの初期化(PhoneFactory.javaのmakeDefaultPhones関数)の呼び出しは発見されなかった.その結果、グローバル検索の結果、アプリケーションPhoneApp(packages/apps/iPhone)で呼び出されたことがわかりました.しかし、アプリケーションPhoneAppはBroadcastに起動されていないし、他のサービスに呼び出されていないので、AndroidはどのようにPhoneAppを起動するのか、属性android:persistentを発見しました.
AndroidManifestでxml定義では、アプリケーションにはandroid:persistentという属性があり、文字通りアプリケーションは持続可能、すなわち常駐的なアプリケーションであると理解される.実はandroid:persistentで修飾されたアプリケーションがシステム起動後にAMで起動されるという理解です.
AMまずPM(PackageManagerService)でAndroid:persistentが設定されているアプリケーションを検索
Android:persistentによって修飾されたアプリケーションがこの時点で実行されていない場合、AMはstartProcessLockedを呼び出してappを起動し、startProcessLockedについては説明しないが、別の文章「How to start a new process for Android?」で詳しく紹介されています.
appの起動プロセスは、appが存在するpackageに対応するプロセスを起動することである.
面ではappが存在するpackageに対応するプロセスの起動が完了した後、appがどのようにcreateされたかを紹介します.
記事『How to start a new process for Android?』からでは、zygoteは新しいプロセスを作成する際にmainThread androidを起動することがわかります.app.Activity Threadなので、Activity Threadのmain関数からappのcreateプロセスを解析します.
mainでは次の操作があります.
thread.attach(false);
attachプロセス中、Activity Threadは対応するアプリケーションattachをAMに渡し、AMに渡して管理します.ここでは変数に注意する必要があります
final ApplicationThread mAppThread = new ApplicationThread();
mAppThreadはApplicationThreadオブジェクトであり、mAppThreadは現在のプロセスマスタースレッドのコアと見なすことができ、このプロセスと他のプロセス(主にAM)との間の通信を処理するとともに、attachApplicationによってmAppThreadのエージェントBinderをAMに渡す.
上のattachコードでは、IPC呼び出しAMのattachApplicationプロセスに沿ってさらに下を見ます.
この過程で、AMはIPC通信呼び出しmAppThreadのbindApplicationを呼び出す.
mAppThreadのbindApplicationは、Activity Thread自身がメンテナンスしているhandlerにメッセージメカニズムを介してBIND_を送信するAPPLICATIONメッセージ.Activity Thread自身がメンテナンスしているhandler対メッセージBIND_を見てみましょう.APPLICATIONの処理は最終的にhandleBindApplication関数に呼び出されます
handleBindApplication関数には
mInstrumentation.callApplicationOnCreate(app);
私たちは最終的に大きな周りを回った後、appのonCreate関数を呼び出してこのアプリケーションを起動しました.
AndroidManifestでxml定義では、アプリケーションにはandroid:persistentという属性があり、文字通りアプリケーションは持続可能、すなわち常駐的なアプリケーションであると理解される.実はandroid:persistentで修飾されたアプリケーションがシステム起動後にAMで起動されるという理解です.
AMまずPM(PackageManagerService)でAndroid:persistentが設定されているアプリケーションを検索
public void systemReady(final Runnable goingCallback) {
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
try {
List apps = AppGlobals.getPackageManager().
getPersistentApplications(STOCK_PM_FLAGS);
if (apps != null) {
int N = apps.size();
int i;
for (i=0; i
Android:persistentによって修飾されたアプリケーションがこの時点で実行されていない場合、AMはstartProcessLockedを呼び出してappを起動し、startProcessLockedについては説明しないが、別の文章「How to start a new process for Android?」で詳しく紹介されています.
appの起動プロセスは、appが存在するpackageに対応するプロセスを起動することである.
final ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);
if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}
if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ;
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application", app.processName);
}
return app;
}
面ではappが存在するpackageに対応するプロセスの起動が完了した後、appがどのようにcreateされたかを紹介します.
記事『How to start a new process for Android?』からでは、zygoteは新しいプロセスを作成する際にmainThread androidを起動することがわかります.app.Activity Threadなので、Activity Threadのmain関数からappのcreateプロセスを解析します.
mainでは次の操作があります.
thread.attach(false);
attachプロセス中、Activity Threadは対応するアプリケーションattachをAMに渡し、AMに渡して管理します.ここでは変数に注意する必要があります
final ApplicationThread mAppThread = new ApplicationThread();
mAppThreadはApplicationThreadオブジェクトであり、mAppThreadは現在のプロセスマスタースレッドのコアと見なすことができ、このプロセスと他のプロセス(主にAM)との間の通信を処理するとともに、attachApplicationによってmAppThreadのエージェントBinderをAMに渡す.
private final void attach(boolean system) {
sThreadLocal.set(this);
mSystemThread = system;
if (!system) {
ViewRoot.addFirstDrawHandler(new Runnable() {
public void run() {
ensureJitEnabled();
}
});
Android.ddm.DdmHandleAppName.setAppName("");
RuntimeInit.setApplicationObject(mAppThread.asBinder());
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
}
}
}
上のattachコードでは、IPC呼び出しAMのattachApplicationプロセスに沿ってさらに下を見ます.
この過程で、AMはIPC通信呼び出しmAppThreadのbindApplicationを呼び出す.
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
thread.bindApplication(processName, app.instrumentationInfo != null
? app.instrumentationInfo : app.info, providers,
app.instrumentationClass, app.instrumentationProfileFile,
app.instrumentationArguments, app.instrumentationWatcher, testMode,
isRestrictedBackupMode || !normalMode,
mConfiguration, getCommonServicesLocked());
updateLruProcessLocked(app, false, true);
app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
}
mAppThreadのbindApplicationは、Activity Thread自身がメンテナンスしているhandlerにメッセージメカニズムを介してBIND_を送信するAPPLICATIONメッセージ.Activity Thread自身がメンテナンスしているhandler対メッセージBIND_を見てみましょう.APPLICATIONの処理は最終的にhandleBindApplication関数に呼び出されます
handleBindApplication関数には
mInstrumentation.callApplicationOnCreate(app);
私たちは最終的に大きな周りを回った後、appのonCreate関数を呼び出してこのアプリケーションを起動しました.