Android --- SystemUI 导入Android Studio及debug

本文已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
相关推荐
雨白2 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk2 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING3 小时前
RN容器启动优化实践
android·react native
恋猫de小郭6 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
YF02119 小时前
AndroidStudio工具链配置
android studio
Kapaseker11 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴11 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭21 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab1 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack