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

news2025/1/22 17:50:41

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.coloradmin.cn/o/895213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维节点CPU飙升问题分析

工作内容,不对外开放 前言 首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是…

8个免费的在线思维导图制作工具推荐,节省时间提高效率!

思维导图&#xff0c;也称为心智图或思维图&#xff0c;最初由英国的心理学家Tony Buzan提出。它是一种图形化的思维工具&#xff0c;旨在帮助我们组织信息、理解知识和激发创新思维。思维导图最大特点是其中心放射式的结构。一张思维导图通常由一个中心主题发散出各个子主题&a…

真知灼见|鲸图知识图谱平台,助力金融业务深度洞察(下)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

HVV(护网)行动详解

前言 最近的全国护网可谓是正在火热的进行中&#xff0c;有很多网安小白以及准大一网安的同学在后台问我&#xff0c;到底什么是护网啊&#xff1f;怎么参加呢&#xff1f;有没有相关的学习资料呢&#xff1f;在下不才&#xff0c;连夜整理出来了这篇护网详解文章&#xff0c;希…

msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法

装好软件或游戏之后&#xff0c;一打开就跳出各种报错信息的情况小伙伴一定见过&#xff0c;其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪&#xff0c;用得好好的电脑&#xff0c;怎么会缺文件呢&#xff1f;为啥其他游戏/应用就没事呢&#xff1f;其实这些“丢失”的…

java生成Excel表格

public HSSFWorkbook CreateJZZJSList() {// 绘制ExcelString fileName "自动分析详情";HSSFWorkbook wb new HSSFWorkbook();//创建工作相簿对象HSSFSheet sheet wb.createSheet(fileName); // --->创建了一个工作簿sheet.setDefaultRowHeight((short) 600);…

【Vue】Hbuilder x代码风格设置

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 一、Hbuilder x 默认代码风格太乱1.在工具中找到设置&#xff0c;点击插件设置2.代开jsbeautify.js配置 一、Hbuilder x 默认代码风格太乱 1…

SENet网络分析

文章目录 注意力机制&#xff1a;AttentionBiased Competition Theorybottom-up和top-down注意力 SE BlockSqueeze操作Excitation操作scale操作与原结构合并计算复杂度评估 实验与其他网络对比数据集实验内部参数对比实验进一步评估Squeezeexcitation Squuze-and-Excitation网络…

流弊的docker

docker就是隔离式运行软件组&#xff08;多个软件&#xff09;&#xff0c;docker分为dockerfile文件&#xff0c;images 镜像&#xff0c;容器&#xff0c;本地仓库&#xff0c;远程仓库。 构建dockerFile文件&#xff0c;可以获得images镜像 运行镜像获得容器 || 容器提交获得…

MS Word表格宽度自适应

x.1 问题&#xff1a; 你的表格可能并没有占满整行&#xff0c;且右对齐&#xff0c;例如如下&#xff0c; x.2 解决方式 这个时候你想右对齐&#xff0c;你可以这么操作&#xff0c;点左上角的十字全选表格&#xff0c; 在布局里选择自动对齐&#xff0c; 对齐方式选择居中右…

vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

vscode报错如下&#xff1a; 一、第一种情况 原因是本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方案就是把本地的known_hosts的原服务器信息全部删掉&#xff0c;然后重新连接。 二、第二种情况 在编写配置文件config时&…

SQL力扣练习(十一)

目录 1.树节点(608) 示例 1 解法一(case when) 解法二(not in) 2.判断三角形(610) 示例 1 解法一(case when) 解法二(if) 解法三(嵌套if) 3.只出现一次的最大数字(619) 示例 1 解法一(count limit) 解法二(max) 4.有趣的电影(620) 解法一 5.换座位(626) 示例 …

VoxWeekly|The Sandbox 生态周报|20230814

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…

动漫3D虚拟人物制作为企业数字化转型提供强大动力

一个 3D 虚拟数字人角色的制作流程&#xff0c;可以分为概念设定-3D 建模-贴图-蒙皮-动画-引擎测试六个步骤&#xff0c;涉及到的岗位有原画师、模型师、动画师等。角色概念设定、贴图绘制一般是由视觉设计师来完成;而建模、装配(骨骼绑定)、渲染动画是由三维设计师来制作完成。…

QtCreator中设置自定义注释格式

QtCreator--工具--选项--文本编辑器--片段--组:C--添加 在其中添加一个key为&#xff1a;header&#xff0c;value如下图的组合&#xff1a; /*! ProjName : %{CurrentProject:Name}* FileName : %{CurrentDocument:FileName}* Brief : * Details : * Aut…

六大需求管理工具:满足您的需求管理需求

在项目开发和产品设计中&#xff0c;需求管理是确保项目成功的关键所在。通过使用专业的需求管理工具&#xff0c;团队可以更好地追踪、记录和分析需求&#xff0c;提高工作效率并确保项目按时完成。 市场上有许多需求管理工具可供选择&#xff0c;当下有什么好用的需求管理工…

Linux玩家福音,StarLite 5问世:搭载 Ubuntu、售 3285 元人民币

8月18日消息&#xff0c;英国硬件公司Star Labs近日发布了旗下最新款Linux平板电脑StarLite 5。这款平板配备了12.5英寸屏幕&#xff0c;采用了IPS技术和10点多点触摸&#xff0c;显示效果细腻、触控灵敏。屏幕比例为16:10&#xff0c;分辨率高达288x192&#xff0c;能够呈现出…

RISC-V公测平台发布· CoreMark测试报告

一. CoreMark简介 CoreMark是一款用于评估CPU性能的基准测试程序&#xff0c;它包含了多种不同的计算任务&#xff0c;包括浮点数、整数、缓存、内存等方面的测试。CoreMark的测试结果通常被用来作为CPU性能的参考&#xff0c;它可以帮助开发人员和系统管理员评估不同处理器和…

Vue 2组件基础

一个简单的组件示例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…