玩转Android Framework:Launcher启动

本文将介绍有关Android Launcher启动相关的一些知识。

系统版本: Ubuntu 22.04 lts

AOSP分支: android-14.0.0_r28

在阅读本篇建议先阅读:

System Server

juejin.cn/post/734508...

什么是Launcher

Launcher的概念,应该做应用层开发的都不会陌生,它可以说对用户来讲最重要的一个东西了,就好像Windows的桌面一样,也是我们其它应用主要的入口。

Launcher本质上来讲,也只是我们的一个Android应用,既然是应用,就肯定要被启动,那么问题来了,谁启动了Launcher?

谁启动了Launcher

我想这个问题肯定立刻就有人抢答了,要么说是System Server,要么说是ActivityManagerService,那么真的是这样吗? 就让我们接下来一探究竟。

启动源码分析

打开/frameworks/base/services/java/com/android/server/SystemServer.java,如果了解了SystemServer.java这个类的话,就应该知道它的主要工作就是启动一系列的重要Service,找到startOtherServices方法,拉到最后,可以找到如下代码:

可以看到,在这里SystemServer调用了ActivityManagerServicesystemReady方法,进入此方法,其它的先不管,找到这段代码:

可以看到这里调用了mAtmInternal.startHomeOnAllDisplays,这个mAtmInternal其实是一个ActvityTaskManagerService实例,我们进入ActvityTaskManagerServicestartHomeOnAllDisplays这个方法,然后可以看到它依次调用了:

最终,我们进入RootWindowContainerstartHomeOnTaskDisplayArea方法:

可以看到,这个方法的主要内容就是构造了一个homeIntent,最后调用ActivityStartControllerstartHomeActivity方法,将Intent发送了出去:

我们再看里面的getHomeIntent方法,可以看到确实加了Home的Category:

接下来,应该就是启动Luancher了吧。

Log分析

好,我们接下来验证一下。

首先打开我们的模拟器,等待它进入到Launcher之后,接着进入adb shell,输入logcat | grep "ActivityTaskManager: START",然后可以看到如下的日志:

log 复制代码
03-13 17:51:41.529   509   509 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.settings/.FallbackHome (has extras)} with LAUNCH_MULTIPLE from uid 0 (BAL_ALLOW_ALLOWLISTED_UID) result code=0
03-13 17:51:35.896   509   937 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.android.launcher3/.uioverrides.QuickstepLauncher (has extras)} with LAUNCH_SINGLE_TASK from uid 0 (BAL_ALLOW_ALLOWLISTED_UID) result code=0

可以看到,我们启动的第一个Activity,并不是Luancher而是com.android.settings.FallbackHome,那么问题就来了,FallbackHome是什么?

FallbackHome是什么

我们打开/packages/apps/Settings/src/com/android/settings/FallbackHome.java,先看看它的布局文件:

好像也没什么特别内容,再看看它的代码,尤其注意以下三块:

可以看到多处在尝试调用这个maybeFinish,那么我们再看下这个方法:

这里的核心逻辑,其实就是调用isUserUnlocked这个方法,然后只要返回true,那么就再发送一个Home Intent,从上面的Activity启动log我们可以得知,这里的Home Intent,就会被Launcher拦截了。

那么isUserUnlocked到底代表什么? 其实这代表着设备的解密,这也是为什么我们需要FallbackHome的原因。

为什么需要FallbackHome

如果想要知道这个,首先我们就要了解什么是文件级加密直接启动,这里是官方文档:

文件级加密

source.android.com/docs/securi...
直接启动

developer.android.com/privacy-and...

简单来说,在Android 7以后,Android开始支持文件级加密,Android 10以后,更是开始强制使用文件级加密,文件级加密将存储分成了两部分,凭据加密部分和设备加密部分,以下是两者区别:

对于我们的设备来讲,刚开始开机的时候,系统属于未解密状态,因为Launcher可能与其它的很多应用会产生数据的交互,需要读取凭据加密存储空间,所以默认情况下无法支持直接启动,那么我们就需要一个loading页面作为中间页,让他来显示等待页面,等待解密完成后,由它来启动Launcher。

我们可以打开/packages/apps/Settings/AndroidManifest.xml,可以看到整个FallBackHome所属于的整个Setting应用都增加了对直接启动模式的支持:

至此,我们就完成了对Launcher启动的整个源码分析。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui