小工具知识网

当前位置: 首页 > 行业知识 > Android11 FallbackHome启动和关闭流程分析

行业知识

Android11 FallbackHome启动和关闭流程分析

2026-10-26 02:44:00 来源:互联网转载

Android 7.0引入了新特性:Direct Boot Mode,设备启动后进入的一个新模式,直到用户解锁(unlock)设备此阶段结束。在这个模式下,系统调用 resolveHomeActivity 找到的是FallbackHome ,而不是我们的桌面应用。所以系统开始启动的是 FallbackHome 这个"桌面"。

()
03-13 16:58:41.359   431   431 D test10  : ===getDefaultTaskDisplayArea===03-13 16:58:41.359   431   431 D test10  : comp:nullResolveInfo:ResolveInfo{b15783 com.android.settings/.FallbackHome p=-1000 m=0x108000}03-13 16:58:41.361   431   431 D test10  : bestChoice:ResolveInfo{b15783 com.android.settings/.FallbackHome p=-1000 m=0x108000}03-13 16:58:41.361   431   431 D test10  : aInfo:ActivityInfo{67e5d00 com.android.settings.FallbackHome}

那为什么找到是FallbackHome 呢?FallbackHome 位于 com.android.settings这个包下,看一下主配置文件

//packages\apps\Settings\AndroidManifest.xml eebff5 u0 com.android.settings/.FallbackHome t2}03-13 16:58:41.400   431   431 D test10  : java.lang.Exception03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStackSupervisor.startSpecificActivity(ActivityStackSupervisor.java:979)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:1970)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:1516)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.RootWindowContainer.resumeFocusedStacksTopActivities(RootWindowContainer.java:2311)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStarter.startActivityInner(ActivityStarter.java:1736)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1525)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStarter.executeRequest(ActivityStarter.java:1189)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStarter.execute(ActivityStarter.java:670)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityStartController.startHomeActivity(ActivityStartController.java:207)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.RootWindowContainer.startHomeOnTaskDisplayArea(RootWindowContainer.java:1549)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1491)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.RootWindowContainer.startHomeOnDisplay(RootWindowContainer.java:1475)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.RootWindowContainer.startHomeOnAllDisplays(RootWindowContainer.java:1456)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.wm.ActivityTaskManagerService$LocalService.startHomeOnAllDisplays(ActivityTaskManagerService.java:6727)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.am.ActivityManagerService.systemReady(ActivityManagerService.java:9689)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.SystemServer.startOtherServices(SystemServer.java:2257)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.SystemServer.run(SystemServer.java:599)03-13 16:58:41.400   431   431 D test10  :      at com.android.server.SystemServer.main(SystemServer.java:415)03-13 16:58:41.400   431   431 D test10  :      at java.lang.reflect.Method.invoke(Native Method)03-13 16:58:41.400   431   431 D test10  :      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)03-13 16:58:41.400   431   431 D test10  :      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)              //......        final boolean isTop = andResume && r.isTopRunningActivity();        mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");    }//...... // Start the process.  It will either succeed and return a result containing            // the PID of the new process, or else throw a RuntimeException.        final String entryPoint = "android.app.ActivityThread";       return startProcessLocked(hostingRecord, entryPoint, app, uid, gids,                    runtimeFlags, zygotePolicyFlags, mountExternal, seInfo, requiredAbi,                    instructionSet, invokeWith, startTime);}        return ZYGOTE_PROCESS.start(processClass, niceName, uid, gid, gids,                    runtimeFlags, mountExternal, targetSdkVersion, seInfo,                    abi, instructionSet, appDataDir, invokeWith, packageName,                    zygotePolicyFlags, isTopApp, disabledCompatChanges,                    pkgDataInfoMap, whitelistedDataInfoMap, bindMountAppsData,  //一系列的参数设置,省略......//这里的processClass为android.app.ActivityThreadargsForZygote.add(processClass);    if (extraArgs != null) {    Collections.addAll(argsForZygote, extraArgs);    }        synchronized(mLock) {            // The USAP pool can not be used if the application will not use the systems graphics            // driver.  If that driver is requested use the Zygote application start path.            return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),                                              zygotePolicyFlags,                                              argsForZygote);        }}        try {            attemptConnectionToPrimaryZygote();            if (primaryZygoteState.matches(abi)) {                return primaryZygoteState;            }            //......    }@GuardedBy("mLock")    private void attemptConnectionToPrimaryZygote() throws IOException {        if (primaryZygoteState == null || primaryZygoteState.isClosed()) {            primaryZygoteState =                    ZygoteState.connect(mZygoteSocketAddress, mUsapPoolSocketAddress);            //......        }    }            DataInputStream zygoteInputStream;            BufferedWriter zygoteOutputWriter;            final LocalSocket zygoteSessionSocket = new LocalSocket();            if (zygoteSocketAddress == null) {                throw new IllegalArgumentException("zygoteSocketAddress can't be null");            }            try {                zygoteSessionSocket.connect(zygoteSocketAddress);                zygoteInputStream = new DataInputStream(zygoteSessionSocket.getInputStream());                zygoteOutputWriter =                        new BufferedWriter(                                new OutputStreamWriter(zygoteSessionSocket.getOutputStream()),                                Zygote.SOCKET_BUFFER_SIZE);            } catch (IOException ex) {                try {                    zygoteSessionSocket.close();                } catch (IOException ignore) { }                throw ex;            }            return new ZygoteState(zygoteSocketAddress, usapSocketAddress,                                   zygoteSessionSocket, zygoteInputStream, zygoteOutputWriter,                                   getAbiList(zygoteOutputWriter, zygoteInputStream));        }        //......        if (shouldAttemptUsapLaunch(zygotePolicyFlags, args)) {            try {                return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);            } catch (IOException ex) {                // If there was an IOException using the USAP pool we will log the error and                // attempt to start the process through the Zygote.                Log.e(LOG_TAG, "IO Exception while communicating with USAP pool - "                        + ex.getMessage());            }        }        return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr);    }private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(            ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {        try {            final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;            final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;            zygoteWriter.write(msgStr);            zygoteWriter.flush();            // Always read the entire result from the input stream to avoid leaving            // bytes in the stream for future process starts to accidentally stumble            // upon.            Process.ProcessStartResult result = new Process.ProcessStartResult();            result.pid = zygoteInputStream.readInt();            result.usingWrapper = zygoteInputStream.readBoolean();            if (result.pid 

上一篇:源码公司揭秘,探寻成都科技之源

下一篇:公司服务器不用了怎么利用?