Android 12 源码分析 —— 应用层 一(SystemUI准备篇)

Android 12 源码分析 —— 应用层一(SystemUI准备篇)

在接下来的时间中,将会使用Pixel 3(blueline)作为研究对象,选用AOSP的android-12.0.0_r34分支作源代码。

先从android的应用层进行探析,然后慢慢深入android的framework,接着进入android的hal层,最后以android的linux内核结束,期间可能会穿插一些其他文章如android的art虚拟机分析等。

本文是整个系列的第一篇,但是在此之前,请务必阅读以下的文章,他们将在以后的源码分析中时不时出场

  1. android 如何分析应用的内存(二)——xdd,gdb命令行(http://t.csdn.cn/RENbG)
  2. android 如何分析应用的内存(三)——LLDB命令行(http://t.csdn.cn/Vpw8e)
  3. android 如何分析应用的内存(四)——Visual studio code的LLDB(http://t.csdn.cn/8ZM8A)
  4. android 如何分析应用的内存(十四)——jdb命令行(http://t.csdn.cn/99r2G)
  5. android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用(http://t.csdn.cn/dWeF5)

上面列出的文章,是关于如何使用gdb,lldb,jdb进行android源码级别的调试。它在没有IDE的情况下非常有用。

本文作为应用层的开篇之作,选取SystemUI作为研究对象。

为什么选取SystemUI?

在Android的应用层有很多应用可以进行源码分析,如Launcher,Camera,Gallery,Bluetooth,SIM,telephony,Settings等等应用,综合考虑到SystemUI可能是定制比较多的一个模块,因此,对其进行仔细的分析。

本文的首要目标是——搭建分析SystemUI的环境——如何使用Android Studio进行AOSP的开发和调试

注意:在使用Android studio时,对pc的性能有一定的要求,如果pc性能确实不够,可以参考前面列出的5篇文章,使用VS code进行替代。在前面5篇文章中,未提及如何搭建java工程,只提及了如何调试。读者可参考其他关于:Extension Pack for Java插件的使用。搭配前面的5篇调试文章,也可以进行AOSP的开发。

如何使用Android Studio进行AOSP的开发和调试

要使用Android Studio进行SystemUI的编辑工作,需要进行如下的配置:

  1. 使用AOSP源码中aidegen工具,构建依赖模块
  2. 使用AOSP源码中的JDK
  3. 使用AOSP源码中的SDK
  4. 如何让AndroidManifest.xml和各种资源xml能相互引用
  5. 如何修改静态代码分析工具lint,以解决IDE中各种标红的错误(实际非错误)
  6. 如何使用Android studio单步调试SystemUI

接下来我们依次解决上面的步骤。

使用aidegen工具,构建依赖模块

在aosp源码中,加载完编译环境之后,即运行下面的命令之后:

. build/envsetup.sh
lunch

aidegen即可使用。

接下来使用aidegen工具,产生能在as中打开SystemUI的工程配置文件。如下:

aidegen SystemUI -i s -p /media/wanbiao/disk1t/root/IDE/android-studio/bin
# SystemUI:表示要生成工程文件的模块
# -i s:表示生成的工程文件对应的IDE为Android studio。
#        j=IntelliJ s=Android Studio e=Eclipse c=CLion v=VS Code
# -p <路径>:表示对应的IDE的安装路径,在生成工程文件完成之后,会自动打开IDE
# 其他常见选项如下:
# -n:表示不用打开IDE
# -s:表示跳过编译各种依赖,如果以前运行过make等命令,可以添加-s
# -e:表示排除一些目录,这个非常有用,尤其是大型模块
# -d:源码引用的模块的深度
# -r:重置所有的aidegen保存的配置
# -v:显示debug级别的log
# -a:生成整个Android 源码树的工程文件
# -l:用指定的语言打开IDE,j=java,c=c/c++,r=Rust
# -h:打开帮助

成功运行之后,会得到如下的图片
在这里插入图片描述

在frameworks/base/package/SystemUI目录下,会出现一下几个文件:

  1. .idea文件夹,Android studio使用的工程文件夹,里面可以配置有多少个模块,从上图可以看到,有三个模块分别为:R,SystemUI,dependencies
  2. SystemUI.iml:配置SystemUI模块的配置文件
  3. dependencies.iml:配置dependencies模块的配置文件

接下来我们将要对上面的模块进行JDK和SDK的配置。这样as才能正确地在java类之间跳转。

使用AOSP源码中的JDK

可以使用which javac命令,查看具体的jdk路径如下:
在这里插入图片描述

然后打开Android studio,将这个jdk加入配置中,

  1. File->Project Structure
  2. 按照下图进行配置
    在这里插入图片描述

在这里插入图片描述

如上图,我们选择了aosp目录中的jdk,并将这个jdk配置命名为:aosp-jdk11

接下来配置sdk

使用AOSP源码中的SDK

在android-12.0.0_r34分支中,默认并不会编译SDK,因此,运行下面的命令进行源码的编译。

. build/envsetup.sh
lunch
make sdk -j8

在Android的编译过程中,可能会报错,例如:module can not be located。又或者xxx文件不存在。

解决办法:只需要找到对应的报错文件,然后打开查看对应的module是否存在,如果不存在,就修改成正确的路径。当然也可简单粗暴的注释掉报错行,前提是:能够确定该行不会影响SDK的功能。

编译成功之后,将会在如下路径中出现:

./out/host/本机平台/sdk/aosp_blueline/android-sdk_eng.wanbiao_linux-x86

然后按照如下所示,添加SDK。

在这里插入图片描述

在这里插入图片描述

注意:在上图中,要保证SDK内部使用的JDK为我们前面配置的JDK即,aosp-jdk11.同时build target请确保为Android API 31.

将SDK和JDK与SystemUI项目相关联

上面两个步骤只是添加了对应的SDK配置和JDK配置,但是还未与SystemUI相关联起来,参照如下步骤,进行关联

在这里插入图片描述

接下来将项目下的各个模块,也配置好SDK,如下图
在这里插入图片描述

在点击完,apply之后,会出现一段时间的indexing…请等待片刻。

至此,as已经具备,编辑和跳转java代码的功能。在进行xml资源配置之前,我们需要先解决几个问题
如下:

  1. 如何正确跳转到源码中,而不是跳转到SDK中
  2. 源码中的重复文件该怎么操作

如何正确跳转到源码中

在上面的配置中,如果我们跳转源码,将会首先跳转到SDK中。为了能够成功跳转到我们的源码中而不是SDK中
可以有如下两种办法:

  1. 修改依赖的优先级
  2. 去掉sdk中的android.jar

两种办法都需要修改,project structure.我们用如下的图片来讲解两种办法
第一种办法:
在这里插入图片描述

第一种办法通常需要经常修改,因为as经常会将sdk移动到高优先级

第二种办法:
在这里插入图片描述

经过上面的配置,就可以正确的跳转到源码中的位置了

如何处理重复文件

我们处理重复文件,通过将其文件夹标记为exclude 目录即可,如下图
在这里插入图片描述
上图将Stub模块下的重复的SystemProperties.java排除在了source file之外。

注意:添加exclude 文件夹,除了上面的右键以外,还可通过对应的.iml文件添加如下的格式:

<content url="file://$MODULE_DIR$/../../../../system/tools/sysprop/stub"><sourceFolder url="file://$MODULE_DIR$/../../../../system/tools/sysprop/stub" isTestSource="false" /><excludeFolder url="file://$MODULE_DIR$/../../../../system/tools/sysprop/stub/android/os" />
</content>

再次注意:除了上面两种方法,还可以通过打开project structure进行修改,如下图

在这里插入图片描述

配置Android

上面的处理,只能进行java代码之间的跳转和配置,我们还需要进行AndroidManifest.xml和资源文件的处理。进行如下配置。

  1. 添加Android
    在这里插入图片描述

  2. 选择清单文件和资源文件夹。其中清单文件和资源文件夹是必须
    在这里插入图片描述

注意:在Android中,一次只能添加一个资源文件夹,如果有多个资源文件夹需要编辑,可以修改此处的配置。例如,我想在res-product中编辑资源的时候,IDE能给我正确的提示,那么可以将此处的Resource directory改为对应的文件夹。

至此,IDE中已经基本可以使用Android的资源了。但是在使用之前,依然还需要处理两个问题:

  1. 引用系统资源时,跳转到源码而不是sdk
  2. 处理IDE中报错,但是是正确的使用

如何调整到系统资源

在我的例子中,为了能够正确的关联到系统资源,我将编译出来的sdk中的资源文件夹,删掉,然后通过链接文件夹指向framworks/base/core/res/res目录。使用ln命令即可,不再赘述

处理xml中的非法使用

在AndroidManifest.xml中,如果使用了系统权限如:

<uses-permission android:name="android.permission.BIND_CONTROLS" />

再如,使用了不属于应用的useid

android:sharedUserId="android.uid.systemui"

这些会在IDE中,用红线标识其错误,

再如资源文件夹中使用

@*android:integer/config_mediumAnimTime

访问非public的资源,也会报错

这些都属于静态代码检查工具的功能,我们将对其进行一些修改。

针对上述错误,可做如下修改:
方法一:

  1. 打开AndroidManifest.xml文件之后,右键单击
  2. 选中Analyze->Configure Current File Analysis
  3. 最后选择Syntax

上面的步骤,是告诉IDE,对于当前这个文件,只做语法检查,不做其他检查

方法二:
上面仅仅是非常粗暴的关掉了提示。同样还可以通过File->Settings->Editor->Inspections 在打开的面板中,进行精细的条件。这个涉及到inspect功能的详细解读,不在此赘述。

方法三:
除了通过图形界面操作以外,还可以在当前目录下的lint.xml文件中进行配置。
lint.xml支持的选项,可以通过如下命令得到:

./prebuilts/devtools/tools/lint --list

至此,你可以畅快的在Android Studio中进行,java代码以及xml代码中的编辑工作了。

当然,你也可以对IDE编辑器上面的报错,视而不见,这对于我们的编辑工作并没有什么实质性影响。

在Android studio中调试

关于Android studio怎么调试Android 应用,此处不再介绍,请参考:
android 如何分析应用的内存(五)——Android studio的LLDB:http://t.csdn.cn/jSurw和android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用:http://t.csdn.cn/wHOgd

本文只介绍,如何能让SystemUI能够正确的调试起来。

事实上,在进行SystemUI的调试中,你将会发现local变量无法debug的场景。为了解决这个问题。需要处理如下几个步骤:

  1. 确定编译的时候,添加了javac -g选项
  2. 关掉AOSP中的优化配置

确定编译出来的class文件包含调试信息

在android 如何分析应用的内存(十四)——jdb命令行http://t.csdn.cn/GtbBH文章中,讲解了使用javap进行查看的命令。

接下来我们直接查看SystemUIApplication.class是否含有调试信息。
在这里插入图片描述

如果没有上面的输出,则尝试如下修改:

1. Android.mk中增加:LOCAL_JAVACFLAGS += -g
2. Android.bp中增加:javacflags:["-g"]

然后重新编译。并再次确定,如果依然没有调试信息。可以尝试切换成userdebug版本

关掉AOSP中的模块优化

在AOSP生成apk的环节中,有一个优化环节,这个优化环节包括资源的压缩,无用代码的剥离,混淆代码等。为了不破坏调试信息,我们需要关闭优化。如下:

1. Android.mk中添加:LOCAL_PROGUARD_ENABLED := false
2. Android.bp中添加:optimize:[enabled:false]

完成上述步骤之后,可关闭优化功能,且能够在单步调试中进行本地变量的查看

开始调试代码

为了能让SystemUI启动的时候就等待调试器的加入,我们运行下面的命令:

adb shell am set-debug-app -w com.android.systemui

上面代码的详细解释,可参考:android 如何分析应用的内存(十五)——Visual Studio Code 调试Android应用http://t.csdn.cn/JPBjC一文中的开始测试小节

调试结果

单步调试结果如下图

在这里插入图片描述

在上面的图中,可以一步一步单步下去,完成整个执行流程的熟悉。

本篇是我们分析SystemUI的基础环节,必不可少的环节,因为能够单步运行,减轻了许多分析源码的工作。说句人话就是少加班了。

至此,Android studio如何进行SystemUI的源码编辑和调试,介绍完毕。

从下一篇文章开始,我们将正式进入SystemUI的源码中,查看让人魂牵梦绕的SystemUI是怎样被写出来的。

另外,题外话,如果自己的PC性能还可以,可以使用一些AI工具,进行辅助编程,比如笔者正在使用tabnine插件,再比如使用variable extractor将对象翻译成json格式,然后使用工具,进行图形化查看,如前面文章中提及的Debug Visualizer工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/101206.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CrossOver2023虚拟机工具最新版本功能介绍

想要在Mac OS中运行Windows程序&#xff0c;除了使用虚拟机外&#xff0c;使用CrossOver在Mac OS系统中运行Windows程序是非常不错的选择。CrossOver基于Wine技术&#xff0c;可以在Mac OS上运行许多Windows应用程序&#xff0c;而无需安装整个Windows操作系统。 本次发布的Cr…

【JAVA程序设计】基于SpringBoot+vue的在线考试系统-以计算机网络为例,可自行录入题库-附下载地址

基于SpringBootvue的在线考试系统-以计算机网络为例&#xff0c;可自行录入题库 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着信息技术的迅猛发展&#xff0c;教育行业正面临着巨大的变革和挑战。…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 3 Paramter标签页介绍

这页是参数设置的界面,那首先要知道什么是参数,参数就是算法中的系数这些可以更改的变量,接下来就是要学习如何创建参数,如下图: 打开模型资源管理器 选择model Workspace标签,点击上边工具栏里的创建参数的按钮(红色箭头指向的按钮),添加一个新的参数K,值设置为4,数…

【Golang系统开发】搜索引擎(3) 压缩倒排索引表

写在前面 假设我们的数据集中有 800000 篇文章&#xff0c;每篇文章有 200 词条&#xff0c;每个词条有6个字符&#xff0c;倒排记录数目是 1 亿。那么如果我们倒排索引表中单单记录文档id&#xff0c;不记录文档内的频率和偏移信息。 那么 文档id 的长度就必须是 l o g 2 8…

Java动态代理、反射

文章目录 动态代理调用者--->代理--->对象为什么需要代理代理的详细实现过程代码详情 反射反射概念反射中常用的方法所有代码 动态代理 调用者—>代理—>对象 动态代理就是无侵入式的给代码增加新的功能&#xff0c;通过接口保证后面的对象和代理需要实现同一个接…

19万字智慧城市总体规划与设计方案WORD

导读&#xff1a;原文《19万字智慧城市总体规划与设计方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 感知基础设施 感知基础设施架构由感知范围、感知手…

Excel/PowerPoint折线图从Y轴开始(两侧不留空隙)

默认Excel/PowerPoint折线图是这个样子的&#xff1a; 左右两侧都留了大块空白&#xff0c;很难看 解决方案 点击横坐标&#xff0c;双击&#xff0c;然后按下图顺序点击 效果

No mapping found for HTTP request with URI

参考: 参考地址 说明 ssm老项目,接过来别人的项目 临时建了一个Controller方便测试用的,结果访问掉不通,报: No mapping found for HTTP request with URIxxxx 这样的错误 解决办法 看了下web,xml配置 在 webmvc-config.xml 配置文件里面添加了几行配置 说明: com.iph.h…

实景无人直播平台是这么开发出来的

标题&#xff1a;实景无人直播平台开发&#xff1a;探索专业性、思考深度与逻辑性的全新体验 随着科技的不断进步&#xff0c;实景无人直播平台成为了当今数字娱乐领域的热门话题。这种新型娱乐方式将虚拟与现实相结合&#xff0c;为用户带来了前所未有的视听体验。本文将探…

搜狗拼音占用了VSCode及微信小程序开发者工具快捷键Ctrl + Shit + K 搜狗拼音截图快捷键

修改搜狗拼音的快捷键 右键--更多设置--属性设置--按键--系统功能快捷键--系统功能快捷键设置--取消Ctrl Shit K的勾选--勾选截屏并设置为Ctrl Shit A 微信开发者工具设置快捷键 右键--Command Palette--删除行 微信开发者工具快捷键 删除行&#xff1a;Ctrl Shit K 或…

【LeetCode】复写零

复写零 题目描述算法描述编程代码 链接: 复写零 题目描述 算法描述 编程代码 class Solution { public:void duplicateZeros(vector<int>& arr) {int n arr.size();int dest -1,cur 0;while(cur < n){if(arr[cur]){dest;}else{dest2;}cur;if(dest > n-1){…

数学建模大全及优缺点解读

分类模型 1、距离聚类&#xff08;系统聚类&#xff09;&#xff08;常用&#xff0c;需掌握&#xff09; 优点&#xff1a; ①将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类 ②是一种探索性的分析方法&#xff0c;分类结果不一定相同 例如&am…

java面试基础 -- 深克隆 浅克隆

引例 说到java的克隆你还记得多少? 一说到克隆你可能就会想起来那个接口, 没错, 他就是Cloneable Cloneable是java里面内置的很常用的接口, 我们说 Object类中也有一个clone方法: 但是要想合法调用 clone 方法, 必须要先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedEx…

Redis 数据库 NoSQL

目录 一、NoSQL 二、为什么会出现NoSQL技术 三、NoSQL的类别 键值&#xff08;Key-Value&#xff09;存储数据库 列存储数据库 文档型数据库 图形&#xff08;Graph&#xff09;数据库 四、NoSQL适应场景 五、在分布式数据库中CAP原理 1、CAP 2、BASE 一、NoSQL NoS…

[C++ 网络协议编程] 域名及网络地址

1. DNS服务器 DNS&#xff08;Domain Name System&#xff09;&#xff1a;是对IP地址和域名&#xff08;如:www.baidu.com等&#xff09;进行相互转换的系统&#xff0c;其核心是DNS服务器。 我们输入的www.baidu.com是域名&#xff0c;是一种虚拟地址&#xff0c;而非实际地…

Error creating bean with name ‘esUtils‘ defined in file

报错异常&#xff1a; 背景&#xff1a; esUtils在common服务中、启动media服务时候、报这个异常、后排查esUtils在启动时候发生异常引起的、在相关bean中加入try{}catch{}即可解决问题 String[] split url.split(","); HttpHost[] httpHosts new HttpHost[split.…

MySQL的配置文件my.cnf与my.ini

一、my.cnf与my.ini win系统&#xff0c;MySQL配置文件为my.ini 其他系统&#xff08;Ubuntu、CentOS、macOS)MySQL配置文件为my.cnf 二、my.cnf与my.ini的路径 2.1 默认路径 MySQL 的配置文件 my.cnf 可能位于多个位置&#xff0c;具体取决于安装方式和操作系统。以下是一…

燃尽图、甘特图、鱼骨图

燃尽图、甘特图、鱼骨图 1. 燃尽图 燃尽图&#xff08;burn down chart&#xff09;是在项目完成之前&#xff0c;对需要完成的工作的一种可视化表示。燃尽图有一个Y轴&#xff08;工作&#xff09;和X轴&#xff08;时间&#xff09;。理想情况下&#xff0c;该图表是一个向下…

2023.8 - java - Number类和Math类

一般地&#xff0c;当需要使用数字的时候&#xff0c;我们通常使用内置数据类型&#xff0c;如&#xff1a;byte、int、long、double 等。 然而&#xff0c;在实际开发过程中&#xff0c;我们经常会遇到需要使用对象&#xff0c;而不是内置数据类型的情形。为了解决这个问题&a…

LeetCode[面试题04.12]求和路径

难度&#xff1a;Medium 题目&#xff1a; 给定一棵二叉树&#xff0c;其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法&#xff0c;打印节点数值总和等于某个给定值的所有路径的数量。注意&#xff0c;路径不一定非得从二叉树的根节点或叶节点开始或结束&#x…