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
相关推荐
袁美丽..4 小时前
Android studio的adb和终端的adb互相抢占端口
android·adb·android studio
鹏多多.4 小时前
flutter-使用fluttertoast制作丰富的高颜值toast
android·前端·flutter·ios
摆烂z4 小时前
Jupyter Notebook的交互式开发环境方便py开发
ide·python·jupyter
守城小轩5 小时前
Firefox Android 开发环境搭建全流程(四)
android·firefox·chrome devtools·指纹浏览器·浏览器开发
袁美丽..5 小时前
Android --- AOSP源码导入Android Studio
android·android studio
LiuYaoheng5 小时前
【Android】View 的基础知识
android·java·笔记·学习
出海小纸条6 小时前
Google Play 应用被拒-数据安全表单无效(设备上的应用)
android
和煦的春风6 小时前
简单讨论下lmkd 查杀机制
android
Android轮子哥6 小时前
月下载 40 万次的框架是怎么练成的
android