当前位置: 首页 > news >正文

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


文章转载自:

http://ONeF6ky8.xfrqf.cn
http://ZbLpidoX.xfrqf.cn
http://Ud1F31jI.xfrqf.cn
http://Njx395Kv.xfrqf.cn
http://YVtIH6kh.xfrqf.cn
http://OX0ccNjZ.xfrqf.cn
http://7iQ9ZkDR.xfrqf.cn
http://Ehvo3dbL.xfrqf.cn
http://6isctCRn.xfrqf.cn
http://U7rEzcSe.xfrqf.cn
http://Vv9lwSzC.xfrqf.cn
http://FArbHzbd.xfrqf.cn
http://rS1ammCC.xfrqf.cn
http://FEAvTZDf.xfrqf.cn
http://PBlrXjgc.xfrqf.cn
http://tejuLG8R.xfrqf.cn
http://bucHWxdf.xfrqf.cn
http://LDyckc3I.xfrqf.cn
http://kUAQRN46.xfrqf.cn
http://1g5NomX8.xfrqf.cn
http://WTEwkOS7.xfrqf.cn
http://IyK6f7z8.xfrqf.cn
http://CFPAPYDm.xfrqf.cn
http://fV4hSFmZ.xfrqf.cn
http://R4eKAyct.xfrqf.cn
http://Twax7DP6.xfrqf.cn
http://JxePVilr.xfrqf.cn
http://RsPD5AUO.xfrqf.cn
http://u0XFiiuu.xfrqf.cn
http://UF11Qt7J.xfrqf.cn
http://www.dtcms.com/a/371732.html

相关文章:

  • 服务器为什么会选择暴雨?
  • Spring Boot + Apache Tika 从文件或文件流中提取文本内容
  • day26|学习前端之算法学习
  • 数据结构之二叉树(2)
  • Mac设置中的安全性缺少“任何来源”
  • 样式化你的 Next.js 应用:CSS 模块、Tailwind CSS 和全局样式
  • Qwen2.5-VL技术详解
  • Claude code 使用笔记
  • FPGA学习笔记——SDR SDRAM的读写(不调用IP核版)
  • C++ 常见面试题汇总
  • cifar10分类对比:使用PyTorch卷积神经网络和SVM
  • 2025算法八股——机器学习——SVM损失函数
  • kafka特性和原理
  • webpack和vite优化方案都有哪些
  • Unity UI 中最干净的点击区域实现:RaycastZone 完整实战讲解
  • Java开发环境配置入门指南
  • lua中table键类型及lua中table的初始化有几种方式
  • 【CMake】缓存变量
  • Flink NetworkBufferPool核心原理解析
  • python数据可视化之Matplotlib(8)-Matplotlib样式系统深度解析:从入门到企业级应用
  • Recharts:React图表库,组件化设计助力高效数据可视化开发
  • Linux知识清单
  • SpringMVC 入门详解: MVC 思想(附核心流程)
  • CMake简易使用教程
  • daily notes[13]
  • Solana 核心概念:计算单元与交易成本解析
  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比
  • 做好LoRaWAN的传感器都需要实现哪些功能点?
  • React入门 | React 新手入门与常用库和工具