本文已AOSP的android-15.0.0_r14分支为源代码,采用编译后的emulator为研究对象对 于其下的SystemUI模块进行分析
AOSP下载及编译可以参考:Android --- AOSP下载及编译-CSDN博客
source build/envsetup.sh
lunch sdk_phone64_x86_64-trunk_staging-eng
make
emulator
SystemUI 导入Android Studio
Step1. 使用 aidegen 工具,构建 SystemUI 模块
在lunch后,使用
aidegen SystemUI -i s -p /home/tsdl/Downloads/android-studio-2023.2.1.18
linux/android-studio/bin
#aidegen 是 Android 集成开发环境生成器(Android IDE Generator)的缩写。它是 AOSP
提供的一个工具,用于生成特定模块的工程文件(如 .iml 文件),以便在 IDE(如 Android
Studio)中打开和调试
#这里指定了 SystemUI 模块,表示我们希望生成 SystemUI 的工程文件
#-i 参数指定要使用的 IDE,这里 s 表示 Android Studio
#其他可能的值:
#j:IntelliJ IDEA
#e:Eclipse
#-p 参数指定 IDE 的安装路径。这里提供了 Android Studio 的安装路径,aidegen 会使用这个
路径来启动 Android Studio 并加载生成的工程文件
aidegen详细帮助请参考aidegen --help
成功后会自动打开Android Studio,目录结构如下图:

Step2. 配置 Project 的 SDK
source build/envsetup.sh
lunch sdk_phone64_x86_64-trunk_staging-eng
make sdk
编译完成后会生成SDK,路径如下:

点击Android Studio中 File->Project Structure->SDKs 添加SDK

路径选择make sdk后生成的路径

添加SDK完成后,我这里命名为aosp15-sdk,将这个sdk应用到该工程 Project中的SDK选择aosp15-sdk

注意Modules中的3个module也要是该SDK

点击apply应用这些设置。到此SystemUI中java的跳转应该就可以实现
Step3. 配置 Android ,处理 AndroidManifest.xml 和 res 资源
同样的点开Project Structure->Modules->SystsmUI,点击 ➕ 号,选择Android

点击apply完成设置
至此,项目中资源间的跳转应该就可以实现
但是,发现在java中通过例如R.layout R.id等等依然是无法找到

这是因为在src中,SystemUI使用的是
import com.android.systemui.res.R;
发现它其实对应的是SystemUI/AndroidManifest-res.xml
<manifest package= "com.android.systemui.res">
<application/>
</manifest>
在Android.bp中可以看到这个res.xml的引用
//Create a library to expose SystemUI's resources to other modules.
android_library {
name: "SystemUI-res",
use_resource_processor: true,
resource_dirs: [
"res-product",
"res-keyguard",
"res",
],
static_libs: [
"SystemUISharedLib",
"SystemUICustomizationLib",
"SettingsLib",
"androidx.leanback_leanback",
"androidx.slice_slice-core",
"androidx.slice_slice-view",
],
manifest: "AndroidManifest-res.xml",
}
原来它是单独创建了一个模块,这样可以提供给其他模块使用,它适用于bp编译但是 gradle无法处理
那么在Android Studio中该如何配置R呢?
可以替换所有import com.android.systemui.res.R 为 import com.android.systemui.R 这仅仅是为了AndroidStudio调试方便。它会影响AOSP编 译,建议做成一个patch,编译时revert

这样的话我们就发现java/kt 能够直接引res资源

需要注意的点
SystemUI/src/com.android.keyguard/ 下的文件仍无法进行资源跳转,原因是在配置Android的时候

可以将res-keyguard 合并到res下。 或者重新选择这里的Resources directory。这里为 了不破坏systemui结构就不合并了,主要的java跳转及部分的res跳转已经完成,这样能 大大提高SystemUI的开发以及调试效率
使用 Android Studio debug SystemUI
众所周知,像是平常的普通应用,我们代码打好断点然后attach Debugger to it's process就可以了,然后去点击触发到断点的逻辑。但是systemUI是伴随着 systemServer启动,我们该如何在开机的时候可以去debug systemUI的
Android studio 的 adb 和终端的 adb 互相抢占端口的问题可参考:Android studio的adb和终端的adb互相抢占端口-CSDN博客
Step1. 首先配置一下这个 SystemUI 项目的 Run/Debug Configurations
添加一个Android App Module选择我们的SystemUI,重要的是Debugger里的内容

在Debugger里开启 Automatically attach on Debug.waitForDebugger()这个选项,然后 Apply。它可以自动的去attach到SystemUI如果SystemUI被设置为等待debug

Step2. 配置 SystemUI 为 debug_app ,以及开启等待 SystemUI 调试
adb shell am set-debug-app -w --persistent com.android.systemui
# -w表示在应用启动时等待调试器连接。应用会暂停运行,直到调试器附加到它
# --persistent表示将调试设置持久化,即使设备重启后,调试设置仍然有效
然后模拟器重启。会发现Android Stuido自动的attch上SystemUI进程然后开始 debugger~

清除debug app设置
adb shell am clear-debug-app