Android Automotive 开发工具
版本变更
| 版本 | 日期 | 修改人 | 描述 |
|---|---|---|---|
| V1.0 | 2022.06.19 | 越岚 | Android Automotive 开发工具 |
目录
概述
工欲善其事,必先利其器,这句话出自《论语》,意思是一个好的工匠要想出色的完成自己的工作,则必须要先把工具准备得锋利好用。作为一名Android系统开发人员,我们也需要工匠精神,那么在我们进入系统的开发工作之前,我们也需要把一些常用的工具掌握好。
源码开发工具
在上一篇文章,我们通过repo工具同步了Android的源码工程,那么我们同步完源码工程后,怎么编译系统源码、编译模块或者查找文件呢?
编译工具使用
配置编译环境
source build/envsetup.sh
or .build/envsetup.sh
执行以上的shell脚本进行环境配置之后,我们会将以下一些方法加到当前终端环境中
| 方法 | 说明 |
|---|---|
| lunch | 选择要编译的产品 |
| m | 从源码根目录开始编译 |
| mm | 构建当前目录的所有模块,但不构建它们的依赖项 |
| mmm | 构建给定目录的所有模块,但不构建它们的依赖项 |
| cgrep | 对所有本地的c/c++文件内进行搜索查询 |
| ggrep | 对所有本地的gradle文件内进行搜索查询 |
| jgrep | 对所有本地的java文件内进行搜索查询 |
| resgrep | 对所有本地res/*.xml文件进行搜索查询 |
| mangrep | 对所有本地的AndroidManifest.xml文件内搜索查询 |
| mgrep | 对所有本地的Makefiles(包含mk,bp文件)文件进行搜索查询 |
| sepgrep | 对所有本地的sepolicy文件进行搜索查询 |
| godir | 进入指定目录 |
在茫茫源码中,当你需要通过关键字搜索时,那么按文件类型来搜索就显得很有必要了,这个时候可以使用上面表格中提到的cgrep,ggrep,jgrep,resgrep,mangrep,mgrep,sepgrep等命令工具
对于项目中的模块,可以采用模块编译mm,mmm等方式,但在这里,对于Android 9.0以上,建议使用ninja进行模块编译,因为使用后者编译速度会更快。
IDE工具使用
接着我们发现整个源代码的工程有海量的代码文件,那么我们应该通过使用什么样的工具来快速的阅读和开发源码呢。
首先,关于Android源码的阅读,这里推荐使用代码编辑软件 Visual Studio Code
Visual Studio Code 是一款轻量级的代码编辑工具,具有启动速度快,海量插件等优点。
但是,通常对于Andnroid开发者而言,接触更多的开发者工具是 Adnroid Studio ,以下简称为AS
那么我们怎么使用ide工具导入系统源码来辅助阅读或者开发呢,这个时候需要idegen
idegen
idegen 工具源码位于 development/tools/idegen 目录下
然后,我们需要构建AS项目所需要的项目配置文件,即ipr和iml文件,模块编译idegen
source build/envsetup.sh
mmm development/tools/idegen
./development/tools/idegen/idegen.sh
这样就会在源码根目录生成android.ipr 以及 android.iml 文件,其中android.ipr是项目配置文件,android.iml是模块配置文件。
到了这时候,你可以使用AS工具打开android.ipr,打开后AS就会开始构建索引文件。
注意,由于Android源码模块非常多,直接使用AS工具打开项目配置文件,构建索引的时间会非常漫长。
这时候可以参考官方的说明文档,可以通过修改配置文件中的排除文件列表excluded-paths 例如,你想排除整个package/apps但是不包含Browser应用,可以应用如下正则表达式: "^packages/apps/(?!Browser)"
固件烧录工具
fastboot
fastboot 的源码位于 system/core/fastboot 目录下
fastboot是一个用于Android设备分区的烧录工具。如果要使用这个烧录工具,那么还是有必要熟悉Android设备的分区表的。fastboot工具可以完成设备分区烧录,分区擦除,设备重启,获取设备状态信息等操作。
fastboot协议是一种通过USB或者以太网与Bootloader进行通信的简单刷机协议。它被设计成了可以简单的实现,并且允许在各种设备以及主机例如Linux,macOs或者Windows的主机上运行。
fastboot常用指令
| 指令 | 说明 |
|---|---|
| devices | 枚举所有连接的设备 |
| reboot <partion> | 重启设备 |
| reboot-bootloader <partion> | 重启设备到Bootloader模式 |
| flash <partion> | 将分区镜像写入指定分区 |
| erase <partion> | 擦除指定分区 |
| boot <kernel> | 下载并启动内核 |
通常我们也可以通过adb 进入Bootloader模式
adb reboot bootloader
命令行工具
adb
全称Android Debug Bridge: 安卓调试常用工具
下表对常用的命令做一些说明
| 指令 | 说明 |
|---|---|
| adb devices | 列出所有连接的设备,包含其序列号SERIAL |
| adb -s SERIAL | 使用给定序列号SERIAL的设备 |
| adb connect HOST[:PORT] | 通过TCP/IP无线连接到设备 |
| adb disconnect HOST[:PORT] | 断开TCP/IP无线连接的设备 |
| adb push LOCAL... REMOTE | 拷贝本地计算机文件/目录到设备 |
| adb pull REMOTE... LOCAL | 拷贝设备文件/目录到本地计算机 |
| adb insall [-lrtsdg] PACKAGE | 安装apk包 |
| adb logcat | 查看设备日志 |
官方关于adb的介绍 adb调试命令行工具
logcat
系统消息日志写入和查看的命令行工具。
查看备用日志缓冲区
[adb] logcat [-b <buffer>]
| 缓冲区 | 说明 |
|---|---|
radio | 查看包含无线装置/电话相关消息的缓冲区。 |
events | 查看已经过解译的二进制系统事件缓冲区消息。 |
main | 查看主日志缓冲区(默认),不包含系统和崩溃日志消息。 |
system | 查看系统日志缓冲区(默认)。 |
crash | 查看崩溃日志缓冲区(默认)。 |
all | 查看所有缓冲区。 |
logcat 在日志输出上还有以下一些功能
- 过滤日志的输出
[adb] logcat *:E - 控制日志输出格式
[adb] logcat [-v <format>]
官方关于logcat的介绍 logcat日志命令行工具
dmesg
查看驱动内核环形缓冲区日志
命令语法
dumpsys [options]
选项说明
-c #显示信息后,清除ring buffer中的内容
-s<缓冲区大小> #默认值为8196,刚好等于ring buffer的大小
-n #设置记录信息的层级
-D #禁用打印消息到控制台
-E #启用打印消息到控制台
-h #打印帮助文本并退出
-k #打印内核消息
-n #设置将消息记录到控制台的级别
-r #打印原始消息缓冲区
-s #使用多少大小的缓冲区来查询内核环缓冲区。 默认情况下为16392
-T #打印人类可读时间戳
-t #不打印内核的时间戳
-u #打印用户空间消息
-V #输出版本信息并退出
-x #将设施和级别(优先级)编号解码为可读的前缀
常用指令
- 修改驱动日志输出等级
dmesg -n8 - 查看前20行开机日志
dmesg | head -n 20 - 查看最后20行日志
dmesg | tail -n 20 - 查看与内存相关开机日志
dmesg | grep -i memory
dumpsys
查询系统服务状态信息,用于系统服务诊断,在Android设备上运行的工具。
命令语法
adb shell dumpsys [-t timeout] [--help | -l | --skip services | service [arguments] | -c | -h]
常用系统服务
| 系统服务 | 说明 |
|---|---|
| car_service | Automotive 车载服务信息 |
| cpuinfo | CPU信息 |
| meminfo | 内存信息 |
| location | 位置信息 |
| input | 输入组件(如触摸屏或内置键盘)的系统信息 |
| SurfaceFlinger | 显示组件的系统信息 |
查询应用在一段时间内的表现,使用以下命令
adb shell dumpsys procstats --hours 3
官方关于dumpsys的介绍 dumpsys命令行工具
启动优化工具
这里主要介绍系统的启动优化以及应用的启动优化工具。系统启动时间以及应用启动时间是系统性能的重要组成部分。
通常在Android Automotive车载音视频娱乐系统,这两项的优化显得攸关重要。因为对于较常进行冷启动的汽车等设备,没有人希望在系统冷启动后需要等待漫长的时间才可以开始导航到目的地,也没有人希望在使用应用的过程中,应用长时间才进入到导航页面。
以下,从工具角度上介绍一些常用的优化工具,仅供大家使用和参考。
首先是系统启动的优化工具 bootchart 的使用
adb shell
cd /data/bootchart
touch enabled
重启车机,等车机重启完毕后,通过adb重新进入车机终端,进入目录 /data/bootchart
将该目录下的文件打包 tar -czvf bootchart.tgz *后拉取到Ubuntu本地计算机
最后通过 bootchart bootchart.tgz 生成开机时序图,可以根据生成的开机时序图分析每个模块的启动时间,以及思考该模块的初始化启动逻辑是否可以往前挪动。
参考资料
以上所写内容包含个人的一些实践经验,其中有部分内容有参考如下资料