1.0x10000100 的由来
桌面启动时会有如下log
START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100
其中flg=0x10000100,是怎么来的呢?
我们知道startActivity 的时候 intent addFlags 可以添加Intent 类中的flag, 那么我们去Intent类里去搜一下, 显然没有搜到, 我们知道, 多个flag 都是通过 ' | ' 运算符组合的, 而这个flg是 0x10000000 | 0x00000100 运算得到的, 所我们找到这两个Flag就行了, 果然找到了:
public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
public static final int FLAG_DIRECT_BOOT_AUTO = 0x00000100;
public static final int FLAG_DEBUG_TRIAGED_MISSING = FLAG_DIRECT_BOOT_AUTO;
因此这个flg 应该是FLAG_ACTIVITY_NEW_TASK | FLAG_DIRECT_BOOT_AUTO 或者 FLAG_ACTIVITY_NEW_TASK | FLAG_DEBUG_TRIAGED_MISSING 的组合
2.HomeLauncher 的启动
一切都是从SystemServer开始的
frameworks/base/services/java/com/android/server/SystemServer.java
main(String[] args)
+ new SystemServer().run();
+ startBootstrapServices(t);
+ startCoreServices(t);
+ startOtherServices(t);
+ mActivityManagerService.systemReady(() -> {
......// callback参数会里启动system ui, 有须要的可关注下
startSystemUi(context, windowManagerF);
......
)
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
+ // goingCallback 回调, 这里会启动systemui
| if (goingCallback != null) goingCallback.run();
+ // start user
| mSystemServiceManager.startUser(t, currentUserId);
+ // 启动persistent利用
| startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE);
+ // 启动所有屏的 Home,
| mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
| // mAtmInternal为ActivityTaskManagerInternal类型,其最终实现在
| // ActivityTaskManagerService.java
+ // final class LocalService extends ActivityTaskManagerInternal
+ mRootWindowContainer.startHomeOnDisplay(...) / ActivityTaskManagerService.java
+ startHomeOnTaskDisplayArea(...) / RootWindowContainer.java
+ if (taskDisplayArea == getDefaultTaskDisplayArea()) {
//mService 是ActivityTaskManagerService
1---------- | homeIntent = mService.getHomeIntent();
| // 失去默认屏home intent的activity
| aInfo = resolveHomeActivity(userId, homeIntent);
| } else if (shouldPlaceSecondaryHomeOnDisplayArea(taskDisplayArea)) {
| // 失去第二个屏home intent的activity
| Pair<ActivityInfo, Intent> info = resolveSecondaryHomeActivity(userId, taskDisplayArea);
| } | homeIntent.setComponent(new ComponentName(aInfo.applicationInfo.packageName, aInfo.name));
2---------- | homeIntent.setFlags(homeIntent.getFlags() | FLAG_ACTIVITY_NEW_TASK); +
+ mService.getActivityStartController().startHomeActivity(...)
+
| ActivityStartController.java
| void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason,
| TaskDisplayArea taskDisplayArea) {...
| // 多屏相干, 启动到哪个屏设置
| final int displayId = taskDisplayArea.getDisplayId();
| options.setLaunchDisplayId(displayId);
| options.setLaunchTaskDisplayArea(taskDisplayArea.mRemoteToken
| .toWindowContainerToken());
| ......
|
| mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)
| .setOutActivity(tmpOutRecord)
| .setCallingUid(0)
| .setActivityInfo(aInfo)
| .setActivityOptions(options.toBundle())
+ .execute();
+ frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java
+ ActivityStarter.execute()
| res = executeRequest(mRequest);
+ ActivityStarter.executeRequest()
| mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, request.voiceInteractor, startFlags, true /* doResume */, checkedOptions,
inTask, inTaskFragment, restrictedBgActivity, intentGrants);
以上源码基于Android 13
以下log基于Android 11
ygoteProcess: java.lang.RuntimeException: callstack:
ZygoteProcess: at android.os.ZygoteProcess.startViaZygote(ZygoteProcess.java:346)
ZygoteProcess: at android.os.ZygoteProcess.start(ZygoteProcess.java:208)
ZygoteProcess: at android.os.Process.start(Process.java:462)
ZygoteProcess: at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:4007)
ZygoteProcess: at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3829)
ZygoteProcess: at com.android.server.am.ActivityManagerService.startProcessLocked(ActivityManagerService.java:3715)
ZygoteProcess: at com.android.server.am.ActivityStackSupervisor.startSpecificActivityLocked(ActivityStackSupervisor.java:1599)
ZygoteProcess: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2755)
ZygoteProcess: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2268)
ZygoteProcess: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2102)
Launcher: java.lang.RuntimeException: callstack:
Launcher: at com.android.launcher3.Launcher.onCreate(Launcher.java:354)
Launcher: at android.app.Activity.performCreate(Activity.java:7082)
Launcher: at android.app.Activity.performCreate(Activity.java:7073)
Launcher: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
Launcher: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2737)
Launcher: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2862)
Launcher: at android.app.ActivityThread.-wrap11(Unknown Source:0)
Launcher: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1595)
Launcher: at android.os.Handler.dispatchMessage(Handler.java:106)
Launcher: at android.os.Looper.loop(Looper.java:164)
// ActivityThread.main()函数, 通过AMS startActivity()章节剖析可晓得其通过zyogote fork后会调用该函数
Launcher: at android.app.ActivityThread.main(ActivityThread.java:6524)
Launcher: at java.lang.reflect.Method.invoke(Native Method)
Launcher: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
Launcher: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
注释1处:
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
Intent getHomeIntent() { Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
return intent;
}
从注释1,2处可以看到 flag 是 FLAG_ACTIVITY_NEW_TASK | FLAG_DEBUG_TRIAGED_MISSING 的组合