launcher 启动流程:
https://blog.csdn.net/liangtianmeng/article/details/83063656
launcher 主界面启动堆栈:
"main" prio=5 tid=1 Runnable
| group="main" sCount=0 dsCount=0 flags=0 obj=0x780ce998 self=0x7131014c00
| sysTid=1483 nice=-10 cgrp=default sched=0/0 handle=0x71b6b2e548
| state=R schedstat=( 479263992 17764508 1009 ) utm=22 stm=25 core=0 HZ=100
| stack=0x7fe1a30000-0x7fe1a32000 stackSize=8MB
| held mutexes= "mutator lock"(shared held)
native: #00 pc 00000000003c5ec8 /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+220)
native: #01 pc 0000000000493530 /system/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char>>&, bool, BacktraceMap*, bool) const+352)
native: #02 pc 00000000004ad1a8 /system/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+844)
native: #03 pc 00000000004941dc /system/lib64/libart.so (art::Thread::RunCheckpointFunction()+204)
native: #04 pc 00000000001377ac /system/lib64/libart.so (art::ClassLinker::LinkFields(art::Thread*, art::Handle<art::mirror::Class>, bool, unsigned long*)+5852)
native: #05 pc 000000000012c734 /system/lib64/libart.so (art::ClassLinker::LinkInstanceFields(art::Thread*, art::Handle<art::mirror::Class>)+72)
native: #06 pc 0000000000121a9c /system/lib64/libart.so (art::ClassLinker::LinkClass(art::Thread*, char const*, art::Handle<art::mirror::Class>, art::Handle<art::mirror::ObjectArray<art::mirror::Class>>, art::MutableHandle<art::mirror::Class>*)+288)
native: #07 pc 000000000011d9c8 /system/lib64/libart.so (art::ClassLinker::DefineClass(art::Thread*, char const*, unsigned long, art::Handle<art::mirror::ClassLoader>, art::DexFile const&, art::DexFile::ClassDef const&)+916)
native: #08 pc 0000000000144e78 /system/lib64/libart.so (_ZN3art27VisitClassLoaderDexElementsIZNS_24VisitClassLoaderDexFilesIZNS_24VisitClassLoaderDexFilesIZNS_11ClassLinker38FindClassInBaseDexClassLoaderClassPathERNS_33ScopedObjectAccessAlreadyRunnableEPKcmNS_6HandleINS_6mirror11ClassLoaderEEEE4$_30EEvS5_SB_T_EUlPKNS_7DexFileEPPvE_SH_EET0_S5_SB_SD_SK_EUlNS_6ObjPtrINS9_6ObjectEEESI_E_SH_EESK_S5_SB_SD_SK_+640)
native: #09 pc 000000000011cfec /system/lib64/libart.so (art::ClassLinker::FindClassInBaseDexClassLoader(art::ScopedObjectAccessAlreadyRunnable&, art::Thread*, char const*, unsigned long, art::Handle<art::mirror::ClassLoader>, art::ObjPtr<art::mirror::Class>*)+604)
native: #10 pc 000000000011e4bc /system/lib64/libart.so (art::ClassLinker::FindClass(art::Thread*, char const*, art::Handle<art::mirror::ClassLoader>)+1060)
native: #11 pc 00000000001386d0 /system/lib64/libart.so (art::ClassLinker::DoResolveType(art::dex::TypeIndex, art::Handle<art::mirror::DexCache>, art::Handle<art::mirror::ClassLoader>)+188)
native: #12 pc 000000000012ce4c /system/lib64/libart.so (art::ClassLinker::ResolveType(art::dex::TypeIndex, art::ObjPtr<art::mirror::Class>)+308)
native: #13 pc 00000000001215f4 /system/lib64/libart.so (art::ClassLinker::LoadSuperAndInterfaces(art::Handle<art::mirror::Class>, art::DexFile const&)+156)
native: #14 pc 000000000011d940 /system/lib64/libart.so (art::ClassLinker::DefineClass(art::Thread*, char const*, unsigned long, art::Handle<art::mirror::ClassLoader>, art::DexFile const&, art::DexFile::ClassDef const&)+780)
native: #15 pc 0000000000144e78 /system/lib64/libart.so (_ZN3art27VisitClassLoaderDexElementsIZNS_24VisitClassLoaderDexFilesIZNS_24VisitClassLoaderDexFilesIZNS_11ClassLinker38FindClassInBaseDexClassLoaderClassPathERNS_33ScopedObjectAccessAlreadyRunnableEPKcmNS_6HandleINS_6mirror11ClassLoaderEEEE4$_30EEvS5_SB_T_EUlPKNS_7DexFileEPPvE_SH_EET0_S5_SB_SD_SK_EUlNS_6ObjPtrINS9_6ObjectEEESI_E_SH_EESK_S5_SB_SD_SK_+640)
native: #16 pc 000000000011cfec /system/lib64/libart.so (art::ClassLinker::FindClassInBaseDexClassLoader(art::ScopedObjectAccessAlreadyRunnable&, art::Thread*, char const*, unsigned long, art::Handle<art::mirror::ClassLoader>, art::ObjPtr<art::mirror::Class>*)+604)
native: #17 pc 00000000003e5958 /system/lib64/libart.so (art::VMClassLoader_findLoadedClass(_JNIEnv*, _jclass*, _jobject*, _jstring*)+668)
at java.lang.VMClassLoader.findLoadedClass(Native method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.view.LayoutInflater.createView(LayoutInflater.java:606)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
- locked <0x04082360> (a java.lang.Object[])
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.launcher3.Launcher.onCreate(Launcher.java:538)
at android.app.Activity.performCreate(Activity.java:8606)
at android.app.Activity.performCreate(Activity.java:8597)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1274)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2951)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3120)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1842)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6953)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:534)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
根据Android9.0 Google CDD文档, aes加密速率大于50MB/s时需要开启FBE(File-Based Encryption) ,否则无法通过CTS测试。同时,开启FBE确实会改变开机流程, USER_UNLOCKED流程从用户解锁前移到了用户解锁后,导致用户解锁时间增加。
动画播放完执行unlock 的代码:
ActivityManager: unlockUserCleared + token = null secret = null
com.android.server.am.UserController.maybeUnlockUser:1143
com.android.server.am.UserController.finishUserBoot:378
com.android.server.am.UserController.sendBootCompleted:1635 com.android.server.am.ActivityManagerService.finishBooting:8564 com.android.server.am.ActivityManagerService.bootAnimationComplete:8593
frameworks\base\services\core\java\com\android\server\am\UserController.java
private boolean unlockUserCleared(final int userId, byte[] token, byte[] secret,
IProgressListener listener) {
UserState uss;
if (!StorageManager.isUserKeyUnlocked(userId)) {
final UserInfo userInfo = getUserInfo(userId);
final IStorageManager storageManager = getStorageManager();
try {
// We always want to unlock user storage, even user is not started yet
storageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret);//token scret 均为null
} catch (RemoteException | RuntimeException e) {
Slog.w(TAG, "Failed to unlock: " + e.getMessage());
}
}
frameworks\base\services\core\java\com\android\server\StorageManagerService.java
@Override
public void unlockUserKey(int userId, int serialNumber, byte[] token, byte[] secret) {
enforcePermission(android.Manifest.permission.STORAGE_INTERNAL);
if (StorageManager.isFileEncryptedNativeOrEmulated()) {//FBE 基于文件加密,不允许secret 为空,否则下边跑出异常
// When a user has secure lock screen, require secret to actually unlock.
// This check is mostly in place for emulation mode.
if (mLockPatternUtils.isSecure(userId) && ArrayUtils.isEmpty(secret)) {
throw new IllegalStateException("Secret required to unlock secure user " + userId);
}
try {
mVold.unlockUserKey(userId, serialNumber, encodeBytes(token),
encodeBytes(secret));
} catch (Exception e) {
Slog.wtf(TAG, e);
return;
}
}
synchronized (mLock) {
mLocalUnlockedUsers = ArrayUtils.appendInt(mLocalUnlockedUsers, userId);//FDE 将用户加入解锁列表
}
}
launcher 启动
AMS 中systemready 启动
->startHomeActivityLocked(currentUserId, "systemReady");
ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.FallbackHome} from uid 0
启动fallbackHome
再到显示keyguard ,即 ->finishUserBoot 发送 ACTION_LOCKED_BOOT_COMPLETED ,打印
SystemServerTiming: finishUserBoot took too long. uptimeSeconds=210
解锁后,系统发送ACTION_USER_UNLOCKED,FallbackHome finish
public static final String ACTION_USER_UNLOCKED = "android.intent.action.USER_UNLOCKED";
ActivityManager: User 0 state changed from RUNNING_UNLOCKING to RUNNING_UNLOCKED
ActivityManager: startHomeActivityLocked ,reason= noMoreActivities resumeHomeStackTask:0:0
ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.Launcher} from uid 0
启动launcher 堆栈:
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityManagerService.startHomeActivityLocked(ActivityManagerService.java:5148)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeHomeStackTask(ActivityStackSupervisor.java:787)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInNextFocusableStack(ActivityStack.java:2834)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2409)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2344)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2289)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2273)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.finishCurrentActivityLocked(ActivityStack.java:3924)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1594)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityStack.activityPausedLocked(ActivityStack.java:1554)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:8853)
06-24 16:35:15.189 913 1445 E ActivityManager: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:224)
06-24 16:35:15.189 913 1445 E ActivityManager: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3692)
06-24 16:35:15.189 913 1445 E ActivityManager: at android.os.Binder.execTransact(Binder.java:756)
FDE
[ro.crypto.state]: [encrypted]
[ro.crypto.type]: [block]
[vold.decrypt]: [trigger_restart_framework]
FBE
[ro.crypto.state]: [encrypted]
[ro.crypto.type]: [file]
FBE launcher 是在解锁后启动
FDE launcher 是在解锁前启动