文章目录
记录一下Android开机时ACTION_USER_UNLOCKED和ACTION_BOOT_COMPLETED啥时候发送的过程记录,主要是方便自己回顾。
Android P分析为例。
正文
本文跟《》存在大量重复,这就简单过一下。
ResumeActivityItem.java
execute()
@Override public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { // 看子类ActivityThread.java的实现 client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward, "RESUME_ACTIVITY"); }
ActivityThread.java
handleResumeActivity()
@Override public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward, String reason) { //略 //[重]就是调用onResume() final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); if (r == null) { return; } //略 r.nextIdle = mNewActivities; mNewActivities = r; //[重] 这个是表示onResume()进入idler状态啦 Looper.myQueue().addIdleHandler(new Idler()); }
performResumeActivity()不是这次的关心点,我们看addIdleHandler()。
这里添加了一个Idler对象,这部分看MessageQueue类。
反正就是MessageQueue总的next()会调用Idler对象,具体看《》
Idler
private class Idler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { ActivityClientRecord a = mNewActivities; boolean stopProfiling = false; if (mBoundApplication != null && mProfiler.profileFd != null && mProfiler.autoStopProfiler) { stopProfiling = true; } if (a != null) { mNewActivities = null; //获取ActivityManagerService IActivityManager am = ActivityManager.getService(); ActivityClientRecord prev; do { if (a.activity != null && !a.activity.mFinished) { try { //[重],看这里 am.activityIdle(a.token, a.createdConfig, stopProfiling); a.createdConfig = null; } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } } prev = a; a = a.nextIdle; prev.nextIdle = null; } while (a != null); } if (stopProfiling) { mProfiler.stopProfiling(); } ensureJitEnabled(); return false; } }
这里的am就是ActivityManagerService。
ActivityManagerService.java
activityIdle()
@Override public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) { final long origId = Binder.clearCallingIdentity(); synchronized (this) { ActivityStack stack = ActivityRecord.getStackLocked(token); //不为null, if (stack != null) { //关注这个activityIdleInternalLocked //mStackSupervisor是ActivityStackSupervisor对象 ActivityRecord r = mStackSupervisor.activityIdleInternalLocked(token, false /* fromTimeout */, false /* processPausingActivities */, config); //false if (stopProfiling) { if ((mProfileProc == r.app) && mProfilerInfo != null) { clearProfilerLocked(); } } } } Binder.restoreCallingIdentity(origId); }
ActivityStackSupervisor.java
activityIdleInternalLocked()
@GuardedBy("mService") final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, boolean processPausingActivities, Configuration config) { ActivityRecord r = ActivityRecord.forTokenLocked(token); //略 //r不为null if (r != null) { //移除IDLE_TIMEOUT_MSG mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); r.finishLaunchTickingLocked(); //略 //第一个为true,满足条件 //fromTimeout为false,没有超时 if (isFocusedStack(r.getStack()) || fromTimeout) { //true [重],这个检测是否开机成功 booting = checkFinishBootingLocked(); } } //true if (allResumedActivitiesIdle()) { if (r != null) { mService.scheduleAppGcsLocked(); } if (mLaunchingActivity.isHeld()) { //略 } //就是遍历Activity状态啥的,不是我们关系的 ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); } //略 mService.trimApplications(); //activityRemoved = false if (activityRemoved) { resumeFocusedStackTopActivityLocked(); } return r; }
重点关心
booting = checkFinishBootingLocked();
checkFinishBootingLocked()
@GuardedBy("mService") private boolean checkFinishBootingLocked() { final boolean booting = mService.mBooting; boolean enableScreen = false; mService.mBooting = false; //false if (!mService.mBooted) { mService.mBooted = true; enableScreen = true; } // booting = true, //enableScreen = true if (booting || enableScreen) { //进入这里,两个都是为true mService.postFinishBooting(booting, enableScreen); } return booting; }
void postFinishBooting(boolean finishBooting, boolean enableScreen) { mHandler.sendMessage(mHandler.obtainMessage(FINISH_BOOTING_MSG, finishBooting ? 1 : 0, enableScreen ? 1 : 0)); }
发送的消息是FINISH_BOOTING_MSG
finishBooting和enableScreen都为true,因此msg.arg1和msg.arg2都为1
handleMessage()
是在MainHandler类中
final class MainHandler extends Handler { //略 @Override public void handleMessage(Message msg) { switch (msg.what) { //略 case FINISH_BOOTING_MSG: { if (msg.arg1 != 0) {//为1 finishBooting(); } if (msg.arg2 != 0) {//为1 enableScreenAfterBoot(); } break; } //略 } } }
finishBooting()
第一次是mBootAnimationComplete为false,进入if语句后,仅mCallFinishBooting置为true,然后return。
final void finishBooting() {
synchronized (this) {
//mBootAnimationComplete此时为false
if (!mBootAnimationComplete) {
mCallFinishBooting = true;
return;
}
mCallFinishBooting = false;
}
//略
}
enableScreenAfterBoot()
void enableScreenAfterBoot() {
//调用的WindowManagerService.enableScreenAfterBoot()
mWindowManager.enableScreenAfterBoot();
synchronized (this) {
updateEventDispatchingLocked();
}
}
WindowManagerService.java
enableScreenAfterBoot()
public void enableScreenAfterBoot() {
synchronized(mWindowMap) {
//false
if (mSystemBooted) {
return;
}
//置为true,后面会用到
mSystemBooted = true;
//处理处理boot弹框提示[Android系统正在启动或者Android系统正在升级的dialog提示]
//里面的mShowingBootMessages条件不满足,这里不关心
hideBootMessagesLocked();
//发送超时30s处理
mH.sendEmptyMessageDelayed(H.BOOT_TIMEOUT, 30 * 1000);
}
//mPolicy是PhoneWindowManager对象,这里暂不关心
mPolicy.systemBooted();
//重点
performEnableScreen();
}
performEnableScreen()
private void performEnableScreen() {
synchronized(mWindowMap) {
//false
if (mDisplayEnabled) {
return;
}
//mSystemBooted为true, mShowingBootMessages=false
if (!mSystemBooted && !mShowingBootMessages) {
return;
}
//mShowingBootMessages设置成了false,关键判断canDismissBootAnimation()
//canDismissBootAnimation()返回false,因此这里直接return了
if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) {
return;
}
//略
}
//略
}
这个方法很重要,会反复进入,上面由于条件不支持,进入直接return了。
打印日志大致如下(部分):
WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :true WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :false WindowManagerService: performEnableScreen 7 mBootAnimationStopped :false WindowManagerService: performEnableScreen 8 mForceDisplayEnabled :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :false WindowManagerService: performEnableScreen 7 mBootAnimationStopped :true WindowManagerService: performEnableScreen 8 mForceDisplayEnabled :false WindowManagerService: ENABLE_SCREEN performEnableScreen WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :false WindowManagerService: performEnableScreen 7 mBootAnimationStopped :true WindowManagerService: performEnableScreen 8 mForceDisplayEnabled :false WindowManagerService: performEnableScreen ---------1---------- WindowManagerService: performEnableScreen 2 mDisplayEnabled :false WindowManagerService: performEnableScreen 3 mSystemBooted :true , mShowingBootMessages: false WindowManagerService: performEnableScreen 4 mPolicy.canDismissBootAnimation() :true WindowManagerService: performEnableScreen 5 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 6 checkWaitingForWindows() :false WindowManagerService: performEnableScreen 7 mBootAnimationStopped :true WindowManagerService: performEnableScreen 8 mForceDisplayEnabled :false WindowManagerService: performEnableScreen 9 : WindowManagerService: performEnableScreen 10 surfaceFlinger :android.os.BinderProxy@91905a0 WindowManagerService: performEnableScreen ******* TELLING SURFACE FLINGER WE ARE BOOTED! WindowManagerService: performEnableScreen ******************** ENABLING SCREEN!
经过多次的执行performEnableScreen(),最终结束开机动画
private void performEnableScreen() {
synchronized(mWindowMap) {
//false
if (mDisplayEnabled) {
return;
}
//mSystemBooted = true, mShowingBootMessages = false
if (!mSystemBooted && !mShowingBootMessages) {
return;
}
//mShowingBootMessages= false
//mPolicy.canDismissBootAnimation()一开始为false,后为true
//具体看PhoneWindowManager.java
if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) {
return;
}
// mForceDisplayEnabled默认为false,强制性显示屏幕意思,也就是开机超时
// 超时设置为30s,具体看enableScreenAfterBoot()
// checkWaitingForWindows()一开始为false,后面为true
if (!mForceDisplayEnabled
&& getDefaultDisplayContentLocked().checkWaitingForWindows()) {
return;
}
//第一次肯定为false
if (!mBootAnimationStopped) {
//退出开机动画
//service.bootanim.exit属性值为1,标志系统要结束开机动画了
SystemProperties.set("service.bootanim.exit", "1");
//置为true,
mBootAnimationStopped = true;
}
//mForceDisplayEnabled 为false,上面解释过了
//checkBootAnimationCompleteLocked()检查开机动画是否完成,退出需要时间和设置其他状态
if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {
return;
}
//BOLT_BOOTANIM = true
if (android.os.Bolt.BOLT_BOOTANIM) {
try {
//关闭开机动画,还可以用adb shell控制,之前有文章写过
SystemProperties.set("ctl.stop", "bootanim");
} catch (Exception e) {
Slog.e(android.os.Bolt.TAG, "Try 'setprop ctl.stop bootanim' failed. Check SELinux policy.");
}
} else {
//略,因为我这走上面,这里就懒得看了
}
mDisplayEnabled = true;
}
try {
//开机动画结束
//ActivityManagerService.java
mActivityManager.bootAnimationComplete();
} catch (RemoteException e) {
}
//PhoneWindowManager.java
mPolicy.enableScreenAfterBoot();
updateRotationUnchecked(false, false);
}
至此,开机动画退出了。但用户还没创建,我们这里关注
mActivityManager.bootAnimationComplete();
ActivityManagerService.java
bootAnimationComplete()
@Override
public void bootAnimationComplete() {
final boolean callFinishBooting;
synchronized (this) {
callFinishBooting = mCallFinishBooting;
mBootAnimationComplete = true;
}
//true
if (callFinishBooting) {
finishBooting();
}
}
finishBooting()
final void finishBooting() {
synchronized (this) {
//mBootAnimationComplete此时为true,不会return
if (!mBootAnimationComplete) {
mCallFinishBooting = true;
return;
}
mCallFinishBooting = false;
}
ArraySet<String> completedIsas = new ArraySet<String>();
//开机完成设置abis[arm64-v8a,armeabi-v7a,armeabi]
for (String abi : Build.SUPPORTED_ABIS) {
zygoteProcess.establishZygoteConnectionForAbi(abi);
final String instructionSet = VMRuntime.getInstructionSet(abi);
if (!completedIsas.contains(instructionSet)) {
try {
mInstaller.markBootComplete(VMRuntime.getInstructionSet(abi));
} catch (InstallerException e) {
Slog.w(TAG, "Unable to mark boot complete for abi: " + abi + " (" +
e.getMessage() +")");
}
completedIsas.add(instructionSet);
}
}
//注册应用重启广播
IntentFilter pkgFilter = new IntentFilter();
pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
pkgFilter.addDataScheme("package");
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String[] pkgs = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
if (pkgs != null) {
for (String pkg : pkgs) {
synchronized (ActivityManagerService.this) {
//强制性停止某个包名
if (forceStopPackageLocked(pkg, -1, false, false, false, false, false,
0, "query restart")) {
setResultCode(Activity.RESULT_OK);
return;
}
}
}
}
}
}, pkgFilter);
//注册ACTION_DELETE_DUMPHEAP广播
IntentFilter dumpheapFilter = new IntentFilter();
dumpheapFilter.addAction(DumpHeapActivity.ACTION_DELETE_DUMPHEAP);
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getBooleanExtra(DumpHeapActivity.EXTRA_DELAY_DELETE, false)) {
mHandler.sendEmptyMessageDelayed(POST_DUMP_HEAP_NOTIFICATION_MSG, 5*60*1000);
} else {
mHandler.sendEmptyMessage(POST_DUMP_HEAP_NOTIFICATION_MSG);
}
}
}, dumpheapFilter);
//通知系统服务开机完成
//这里就SystemServer中启动的服务
//类似的可以参考《StorageManagerService的启动》中Lifecycle就是一个服务。
mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED);
synchronized (this) {
final int NP = mProcessesOnHold.size();
//之前onhold的进程,开始启动
Slog.d(TAG, "finishBooting 6 NP : "+ NP);
if (NP > 0) {
ArrayList<ProcessRecord> procs =
new ArrayList<ProcessRecord>(mProcessesOnHold);
for (int ip=0; ip<NP; ip++) {
startProcessLocked(procs.get(ip), "on-hold", null);
}
}
if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
return;
}
Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_POWER_USE_MSG);
mHandler.sendMessageDelayed(nmsg, mConstants.POWER_CHECK_INTERVAL);
SystemProperties.set("sys.boot_completed", "1");
if (!"trigger_restart_min_framework".equals(SystemProperties.get("vold.decrypt"))
|| "".equals(SystemProperties.get("vold.encrypt_progress"))) {
SystemProperties.set("dev.bootcomplete", "1");
}
//调用mUserController发送sendBootCompleted
mUserController.sendBootCompleted(
new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode,
String data, Bundle extras, boolean ordered,
boolean sticky, int sendingUser) {
synchronized (ActivityManagerService.this) {
requestPssAllProcsLocked(SystemClock.uptimeMillis(), true, false);
}
}
});
mUserController.scheduleStartProfiles();
}
mAnrManager.writeEvent(AnrManager.EVENT_BOOT_COMPLETED);
}
上面比较重要的是:
mSystemServiceManager调用startBootPhase(),这里会通知SystemService中添加的所有服务
mUserController调用sendBootCompleted,通知发送Boot Completed
我们主要关注第二点。
UserController.java
sendBootCompleted()
void sendBootCompleted(IIntentReceiver resultTo) {
SparseArray<UserState> startedUsers;
synchronized (mLock) {
startedUsers = mStartedUsers.clone();
}
//此时至少有一个用户
for (int i = 0; i < startedUsers.size(); i++) {
UserState uss = startedUsers.valueAt(i);
//执行finishUserBoot
finishUserBoot(uss, resultTo);
}
}
finishUserBoot()
private void finishUserBoot(UserState uss, IIntentReceiver resultTo) {
final int userId = uss.mHandle.getIdentifier();
synchronized (mLock) {
//用户不匹配则返回
if (mStartedUsers.get(userId) != uss) {
return;
}
}
//如果用户在锁定状态
if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
if (userId == UserHandle.USER_SYSTEM
&& !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {
int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
MetricsLogger.histogram(mInjector.getContext(),
"framework_locked_boot_completed", uptimeSeconds);
final int MAX_UPTIME_SECONDS = 120;
if (uptimeSeconds > MAX_UPTIME_SECONDS) {
if ("user".equals(Build.TYPE)) {
Slog.wtf("SystemServerTiming",
"finishUserBoot took too long. uptimeSeconds=" + uptimeSeconds);
} else {
Slog.w("SystemServerTiming",
"finishUserBoot took too long. uptimeSeconds=" + uptimeSeconds);
}
}
}
//发送锁屏开机广播
mHandler.sendMessage(mHandler.obtainMessage(REPORT_LOCKED_BOOT_COMPLETE_MSG,
userId, 0));
Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mInjector.broadcastIntent(intent, null, resultTo, 0, null, null,
new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED},
AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
}
//解锁用户的credential-encrypted storage
//false
if (mInjector.getUserManager().isManagedProfile(userId)) {
final UserInfo parent = mInjector.getUserManager().getProfileParent(userId);
if (parent != null
&& isUserRunning(parent.id, ActivityManager.FLAG_AND_UNLOCKED)) {
Slog.d(TAG, "User " + userId + " (parent " + parent.id
+ "): attempting unlock because parent is unlocked");
maybeUnlockUser(userId);
} else {
String parentId = (parent == null) ? "<null>" : String.valueOf(parent.id);
Slog.d(TAG, "User " + userId + " (parent " + parentId
+ "): delaying unlock because parent is locked");
}
} else {
maybeUnlockUser(userId);
}
}
maybeUnlockUser()
private boolean maybeUnlockUser(final int userId) {
return unlockUserCleared(userId, null, null, null);
}
unlockUserCleared()
private boolean unlockUserCleared(final int userId, byte[] token, byte[] secret,
IProgressListener listener) {
UserState uss;
//解锁user storage,isUserKeyUnlocked()返回true,但取反就false
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);
} catch (RemoteException | RuntimeException e) {
Slog.w(TAG, "Failed to unlock: " + e.getMessage());
}
}
synchronized (mLock) {
// Register the given listener to watch for unlock progress
uss = mStartedUsers.get(userId);
//不为null
if (uss != null) {
uss.mUnlockProgress.addListener(listener);
uss.tokenProvided = (token != null);
}
}
// Bail if user isn't actually running
if (uss == null) {
notifyFinished(userId, listener);
return false;
}
//完成解锁
finishUserUnlocking(uss);
int[] userIds;
synchronized (mLock) {
userIds = new int[mStartedUsers.size()];
for (int i = 0; i < userIds.length; i++) {
userIds[i] = mStartedUsers.keyAt(i);
}
}
//解锁其他的用户
for (int testUserId : userIds) {
final UserInfo parent = mInjector.getUserManager().getProfileParent(testUserId);
//parent= null
if (parent != null && parent.id == userId && testUserId != userId) {
maybeUnlockUser(testUserId);
}
}
return true;
}
上面比较关心的是finishUserUnlocking()
finishUserUnlocking()
private void finishUserUnlocking(final UserState uss) {
final int userId = uss.mHandle.getIdentifier();
if (!StorageManager.isUserKeyUnlocked(userId)) return;
synchronized (mLock) {
if (mStartedUsers.get(userId) != uss || uss.state != STATE_RUNNING_LOCKED) {
return;
}
}
uss.mUnlockProgress.start();
// 设置进度
uss.mUnlockProgress.setProgress(5,
mInjector.getContext().getString(R.string.android_start_title));
// Call onBeforeUnlockUser on a worker thread that allows disk I/O
FgThread.getHandler().post(() -> {
//isUserKeyUnlocked()=true
if (!StorageManager.isUserKeyUnlocked(userId)) {
return;
}
mInjector.getUserManager().onBeforeUnlockUser(userId);
synchronized (mLock) {
if (!uss.setState(STATE_RUNNING_LOCKED, STATE_RUNNING_UNLOCKING)) {
return;
}
}
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
// 设置进度
uss.mUnlockProgress.setProgress(20);
//通知系统服务解锁完成
mHandler.obtainMessage(SYSTEM_USER_UNLOCK_MSG, userId, 0, uss)
.sendToTarget();
});
}
Handler发送了SYSTEM_USER_UNLOCK_MSG。
handleMessage()
case SYSTEM_USER_UNLOCK_MSG:
final int userId = msg.arg1;
mInjector.getSystemServiceManager().unlockUser(userId);
// Loads recents on a worker thread that allows disk I/O
FgThread.getHandler().post(() -> {
mInjector.loadUserRecents(userId);
});
//完成用户解锁
finishUserUnlocked((UserState) msg.obj);
break;
finishUserUnlocked()
显示几个用户状态
public final static int STATE_BOOTING = 0;
// User is in the locked state.
public final static int STATE_RUNNING_LOCKED = 1;
// User is in the unlocking state.
public final static int STATE_RUNNING_UNLOCKING = 2;
// User is in the running state.
public final static int STATE_RUNNING_UNLOCKED = 3;
// User is in the initial process of being stopped.
public final static int STATE_STOPPING = 4;
// User is in the final phase of stopping, sending Intent.ACTION_SHUTDOWN.
public final static int STATE_SHUTDOWN = 5;
void finishUserUnlocked(final UserState uss) {
final int userId = uss.mHandle.getIdentifier();
//没有解锁返回
if (!StorageManager.isUserKeyUnlocked(userId)) return;
synchronized (mLock) {
// Bail if we ended up with a stale user
if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
// Do not proceed if unexpected state
if (!uss.setState(STATE_RUNNING_UNLOCKING, STATE_RUNNING_UNLOCKED)) {
return;
}
}
//解锁完成
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
uss.mUnlockProgress.finish();
//发送ACTION_USER_UNLOCKED广播
final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED);
unlockedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
unlockedIntent.addFlags(
Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
mInjector.broadcastIntent(unlockedIntent, null, null, 0, null,
null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
userId);
//略
//info.lastLoggedInFingerprint, Build.FINGERPRINT相等,取反就不满足条件,走else
if (!Objects.equals(info.lastLoggedInFingerprint, Build.FINGERPRINT)) {
final boolean quiet;
if (info.isManagedProfile()) {
quiet = !uss.tokenProvided
|| !mLockPatternUtils.isSeparateProfileChallengeEnabled(userId);
} else {
quiet = false;
}
mInjector.sendPreBootBroadcast(userId, quiet,
() -> finishUserUnlockedCompleted(uss));
} else {
//进入这里
finishUserUnlockedCompleted(uss);
}
}
这里最重要的一个点,发送了ACTION_USER_UNLOCKED。
也就是这里才会有ACTION_USER_UNLOCKED广播发送。
继续看finishUserUnlockedCompleted()
finishUserUnlockedCompleted()
private void finishUserUnlockedCompleted(UserState uss) {
final int userId = uss.mHandle.getIdentifier();
synchronized (mLock) {
if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
}
UserInfo userInfo = getUserInfo(userId);
if (userInfo == null) {
return;
}
// Only keep marching forward if user is actually unlocked
if (!StorageManager.isUserKeyUnlocked(userId)) return;
// Remember that we logged in
mInjector.getUserManager().onUserLoggedIn(userId);
//userInfo.isInitialized() = true,不进入
if (!userInfo.isInitialized()) {
if (userId != UserHandle.USER_SYSTEM) {
//发送ACTION_USER_INITIALIZE广播去给user初始化
Intent intent = new Intent(Intent.ACTION_USER_INITIALIZE);
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mInjector.broadcastIntent(intent, null,
new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode,
String data, Bundle extras, boolean ordered,
boolean sticky, int sendingUser) {
// Note: performReceive is called with mService lock held
mInjector.getUserManager().makeInitialized(userInfo.id);
}
}, 0, null, null, null, AppOpsManager.OP_NONE,
null, true, false, MY_PID, SYSTEM_UID, userId);
}
}
// Do not report secondary users, runtime restarts or first boot/upgrade
//userId = 0
if (userId == UserHandle.USER_SYSTEM
&& !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {
int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);
MetricsLogger.histogram(mInjector.getContext(), "framework_boot_completed",
uptimeSeconds);
}
//发送ACTION_BOOT_COMPLETED广播
final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode, String data,
Bundle extras, boolean ordered, boolean sticky, int sendingUser)
throws RemoteException {
Slog.i(UserController.TAG, "Finished processing BOOT_COMPLETED for u" + userId);
}
}, 0, null, null,
new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED},
AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
if (!SystemProperties.get("vendor.android.home.ready").equals("1")) {
SystemProperties.set("vendor.android.home.ready", "1");
}
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
final Intent readyIntent = new Intent(Intent.ACTION_HOME_READY, null);
readyIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
readyIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
mInjector.broadcastIntent(readyIntent, null, new IIntentReceiver.Stub() {
@Override
public void performReceive(Intent intent, int resultCode, String data,
Bundle extras, boolean ordered, boolean sticky, int sendingUser)
throws RemoteException {
Slog.i(UserController.TAG, "Finished processing HOME_READY for u" + userId);
}
}, 0, null, null,
new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED},
AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
}
}, 1000); // Delay 1s
}
这里会发送ACTION_BOOT_COMPLETED,至此,才算真正的开机成功。
参考文章
《》
《》
《》
联系我们

微信号:rssme_com