背景:
平时做aosp开发时候,如果要编译某一个模块就会直接使用命令make,或者make xxx模块。
比如:
make SettingsProvider
make SystemUI
make bootanimation
这样就直接有对应的apk,或者bin文件了,具体这些apk或者bin文件是如果生成的其实一点都不清楚,那么有没有什么方法可以看到这些bin文件或者apk的是如何生成的呢?特别时候有时候做一些错误排查等情况,非常需要一个详细日志来看一下错在哪里。
下面就来介绍一下如何查看这些make产物的详细输出日志。
aosp8.1的低版本查看方式
在aosp8.1版本时候可以使用make showcommands xx目标的方式来展示详细的编译日志,具体使用如下:
bin文件情况
make showcommands bootanimation
日志太多,可以取一点核心部分看看
上图可以看出来,最开始是编译个目标总共的任务数量,有一个详细的任务进度,实际上编译bin文件用的是prebuilts/clang/host/linux-x86/clang-4053586/bin/clang++这个工具链进行编译的,有通过参数把头文件目录,和cpp源文件进行编译。
编译apk情况
同样如果编译apk则展示如下
apk的编译相对流程就比较多,上面日志太多,只展示了一小部分,即aapt2打包资源:
aapt->aidl -> javac-> dx(dex)-> apkbuilder-> jarsigner-> zipalign
第一步:打包资源文件,生成R.java文件
第二步:处理AIDL文件,生成对应的.java文件(工程没有用到AIDL,那这个过程就可以省了)
第三步:编译Java文件,生成对应的.class文件
第四步:把.class文件转化成.dex文件
第五步:打包生成未签名的.apk文件
第六步:对未签名.apk文件进行签名
第七步:对签名后的.apk文件进行对齐处理
aosp14高版本查看方式:
如果高版本android上面也使用make showcommands xx命令会发生什么呢?
test@test:~/disk2/aosp14$ make showcommands SettingsProvider
! The argument `showcommands` is no longer supported.
! Instead, the verbose log is always written to a compressed file in the output dir:
!
! gzip -cd /home/test/disk2/aosp14/out/verbose.log.gz | less -R
!
! Older versions are saved in verbose.log.#.gz files
15:34:32 Invalid argument
#### failed to build some targets (1 seconds) ####
可以看到这里直接报错说showcommands已经不再支持了,不过这里也说了详细的日志已经被压缩打包成了verbose.log.gz文件,直接去这个文件看就行。
下面来看看这个verbose.log.gz文件情况:
test@test:~/disk2/nx563j_aosp14/out$ ls -l verbose.log.*
-rw-rw-r-- 1 test test 5753 Sep 20 13:57 verbose.log.1.gz
-rw-rw-r-- 1 test test 11123 Sep 20 14:00 verbose.log.gz
这里注意verbose.log.gz是在out的根目录查看既可以,但这里需要注意一下,它一般是编译几次就有几个这种verbose.log.gz,末尾加了数字,比如verbose.log.1.gz,verbose.log.2.gz的方式。这里一般查看的最新的日志就是 verbose.log.gz,可以从文件时间情况也看得出来。
打开后如下:
看看日志
可以看得出和原来的showcommands方式是一样的,所以高版本aosp其实这块做的更好了,保存成了文件,更加方便我们查看。
更多framework技术干货,请关注下面“千里马学框架”