ACTION_USER_UNLOCKED发送分析

Android  源码分析  2024年1月9日 pm6:18发布11个月前更新 城堡大人
137 0 0

前言

记录一下Android开机时ACTION_USER_UNLOCKEDACTION_BOOT_COMPLETED啥时候发送的过程记录,主要是方便自己回顾。

Android P分析为例。

正文

本文跟《Android开机动画关闭源码分析》存在大量重复,这就简单过一下。

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对象,具体看《Android开机动画关闭源码分析

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;
}

ActivityManagerService.java

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);
}

上面比较重要的是:

  1. mSystemServiceManager调用startBootPhase(),这里会通知SystemService中添加的所有服务

  2. 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,至此,才算真正的开机成功。

参考文章

  1. Android输入法IMMS服务启动流程(5)(onUnlockUser过程)

  2. Android开机动画关闭源码分析

  3. StorageManagerService的启动

 历史上的今天

  1. 2023: Android开启Wifi debug调试(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

JNI之对象数组使用

前言上一篇《JNI之数组简单操作》介绍的是jintArray的使用,今天就介绍对象数组。 jarray               (数组)   jobjectArray         (object数组)   jbooleanArray       (boolean数组) ...

博尔赫斯:我用什么才能留住你

我用什么才能留住你?我给你瘦落的街道、绝望的落日、荒郊的月亮。我给你一个久久地望着孤月的人的悲哀。 我给你我已死去的祖辈,后人们用大理石祭奠的先魂:我父亲的父亲,阵亡于布宜诺斯艾利斯的边境,两颗子弹射穿了他的胸膛,死的时候蓄着胡子,尸体被士兵们用牛皮裹起; ...

ViewPager2事件冲突问题

前言项目中用ViewPager2+Fragment替换ViewPager+Fragment做图片浏览功能,替换完后发现ViewPager2和Fragment中存在事件冲突,比如Fragment存在对图片进双指缩放等处理。因此,需要我们自己处理冲突事件。正文思路:重写mAnimViewP...

佚名:人就这么一生,要学会把握自己

人就这么一生,要学会把握自己人这一辈子,有多少无可奈何,邂逅多少恩恩怨怨。可是想到人不就这么一辈子吗,有什么看不开的? 人世间的烦恼忧愁,恩恩怨怨几十年后,不都烟消云散了,还有什么不能化解,不能消气的呢? 人就这么一生,我们不能白来这一遭。所以让我们从快乐...

去除USB权限效验弹框

修改路径:frameworks/base/core/res/res/values/config.xml 修改内容:<bool name="config_disableUsbPermissionDialogs">true</bool>

Web网站置灰的几种方式代码

前言众所周知,一般有大事情,很多官方网站的首页就会置灰。对这个比较感兴趣,因此就查询了一下,发现设置全站置灰的方式很简单。记录一下,方便自己查阅。PS: 本文内容摘抄的,文末有原作者连接正文置灰涉及全屏置灰,另外一种是首屏置灰。下面记录一下置灰的代码。全屏置灰方式一亲测,有效。...