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