Android6.0 AMS起動Activity(5)新プロセスでActivityを起動
4240 ワード
前にActivityの起動プロセスを分析したところ、同じアプリケーションのActivityは一般的に同じプロセスで起動されていることがわかりました.実際には、ActivityもServiceのように新しいプロセスで起動することができ、1つのアプリケーションがいくつかのプロセスを越えることができます.本稿では、新しいプロセスでActivityを起動する方法とプロセスを分析します.
Androidシステムでは、各アプリケーションはいくつかのActivityとServiceで構成されており、一般的には独立したプロセスで動作し、Activityは同じプロセスで動作する可能性があり、異なるプロセスで動作する可能性があります.AndroidアプリケーションがLauncherデスクトップでActivityを起動するにはプロセスを起動する必要があり、プロセス内部でActivityプロセスを起動する必要があることも説明しました.では、同じAndroidアプリケーションが新しいプロセスで新しいActivityを起動する方法を見てみましょう.
これを行うには簡単ですAndroidManifestでxmlでは、プライマリActivityと起動するActivityのandroid:processプロパティを別に設定します.
同じアプリケーションのActivityコンポーネントは同じプロセスで実行されますが、Activityがandroid:processというプロパティを構成している場合は、独自のプロセスで実行されます.Android:processプロパティの値が「:」で始まると、このプロセスがプライベートであることを示します.Android:processプロパティの値が小文字で始まると、他のアプリケーションコンポーネントもこのプロセスで実行できるグローバルプロセスであることを示します.
したがって、ここでは「:」で始まり、プライベートプロセスが作成されたことを示します.実際、ここでは前の「:」を使わなくてもいいですが、この属性文字列内に少なくとも1つの「.」があることを保証しなければなりません.文字.
AndroidManifest.xmlはapkのインストール時にPKMSでPackageParserのparseBaseApplicationを呼び出して解析します.具体的なコードは、後続のブログ(PKMSインストールapk専門)で再分析します.
このようにprocessNameが異なると、AMSがActivityを起動したときにプロセスが開きます.Activityを再起動すると、processNameが異なるため、プロセスのないprocessNameがこのnameであることがわかります.だからもう一つのプロセスを始めます.具体的なコードは私たちの前のブログでも分析しました.Activity StackSupervisorのstartSpecificActivity Locked関数で、このprocessNameのプロセスがないことを発見した後です.mServicesが呼び出されます.startProcessLocked関数は、プロセスの開始を再開し、新しいProcessRecordを作成してプロセスの情報を保存します.
前にActivityの起動プロセスを分析したところ、同じアプリケーションのActivityは一般的に同じプロセスで起動されていることがわかりました.実際には、ActivityもServiceのように新しいプロセスで起動することができ、1つのアプリケーションがいくつかのプロセスを越えることができます.本稿では、新しいプロセスでActivityを起動する方法とプロセスを分析します.
Androidシステムでは、各アプリケーションはいくつかのActivityとServiceで構成されており、一般的には独立したプロセスで動作し、Activityは同じプロセスで動作する可能性があり、異なるプロセスで動作する可能性があります.AndroidアプリケーションがLauncherデスクトップでActivityを起動するにはプロセスを起動する必要があり、プロセス内部でActivityプロセスを起動する必要があることも説明しました.では、同じAndroidアプリケーションが新しいプロセスで新しいActivityを起動する方法を見てみましょう.
これを行うには簡単ですAndroidManifestでxmlでは、プライマリActivityと起動するActivityのandroid:processプロパティを別に設定します.
android:process=":com.example.process.main"
同じアプリケーションのActivityコンポーネントは同じプロセスで実行されますが、Activityがandroid:processというプロパティを構成している場合は、独自のプロセスで実行されます.Android:processプロパティの値が「:」で始まると、このプロセスがプライベートであることを示します.Android:processプロパティの値が小文字で始まると、他のアプリケーションコンポーネントもこのプロセスで実行できるグローバルプロセスであることを示します.
したがって、ここでは「:」で始まり、プライベートプロセスが作成されたことを示します.実際、ここでは前の「:」を使わなくてもいいですが、この属性文字列内に少なくとも1つの「.」があることを保証しなければなりません.文字.
AndroidManifest.xmlはapkのインストール時にPKMSでPackageParserのparseBaseApplicationを呼び出して解析します.具体的なコードは、後続のブログ(PKMSインストールapk専門)で再分析します.
このようにprocessNameが異なると、AMSがActivityを起動したときにプロセスが開きます.Activityを再起動すると、processNameが異なるため、プロセスのないprocessNameがこのnameであることがわかります.だからもう一つのプロセスを始めます.具体的なコードは私たちの前のブログでも分析しました.Activity StackSupervisorのstartSpecificActivity Locked関数で、このprocessNameのプロセスがないことを発見した後です.mServicesが呼び出されます.startProcessLocked関数は、プロセスの開始を再開し、新しいProcessRecordを作成してプロセスの情報を保存します.
void startSpecificActivityLocked(ActivityRecord r,
boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
ProcessRecord app = mService.getProcessRecordLocked(r.processName,
r.info.applicationInfo.uid, true);
r.task.stack.setLaunchTime(r);
if (app != null && app.thread != null) {
try {
if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
|| !"android".equals(r.info.packageName)) {
// Don't add this if it is a platform component that is marked
// to run in multiple processes, because this is actually
// part of the framework so doesn't make sense to track as a
// separate apk in the process.
app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
mService.mProcessStats);
}
realStartActivityLocked(r, app, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
// If a dead object exception was thrown -- fall through to
// restart the application.
}
mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
"activity", r.intent.getComponent(), false, false, true);
}