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
相关推荐
鹏晨互联1 小时前
【Compose vs XML:边框内外间距的实现对比】
android·xml
Android系统攻城狮1 小时前
Android tinyalsa深度解析之pcm_plugin_write调用流程与实战(一百七十九)
android·pcm·tinyalsa·android16·音频进阶·android音频进阶
ID_180079054731 小时前
除了JSON,淘宝店铺商品API接口还支持哪些数据格式?
android·数据库
KillerNoBlood2 小时前
2026移动端跨平台开发面经总结
android·算法·flutter·ios·移动开发·鸿蒙·kmp
消失的旧时光-19432 小时前
Android / IoT 面试复盘总结:从 MQTT、TLS 到 JWT 权限体系(标准答案 + 工程理解 + 延伸知识链)
android·物联网·面试
林多3 小时前
【Android】 GPU过度绘制实现原理
android·gpu·性能·实现原理·过度绘制·overdraw
薄荷椰果抹茶3 小时前
手机端Obsidian安装与同步全攻略
android
醇氧3 小时前
CentOS 7安装 mysql-8.0.27-1.el7.x86_64.rpm 安装包
android·mysql·centos
号码认证服务3 小时前
给用户打电话,怎么在对方手机显示为“XX证券”?号码认证办理步骤
android·运维·服务器·ios·智能手机·iphone·webview
Kapaseker4 小时前
我为什么让 Toast 多弹了一次
android·kotlin