GKI ABI-check SOP
ABI check是用于校验生成的kernel中ko与google释放的ko所计算出来的CRC是否相等。
在GKI版本中,很多kernel中的配置有=y变成了=m,编译成了ko,XTS测试时,会替换boot镜像, 替换成google释放的boot.img,这时候如果产生break,会开不了机,例如卡白米反复重启,也就是KMI Break问题。
在启动的时候,我们自己的ko文件,没法被Google Kernel加载上,也就是Kernel起不来,就卡白米。
Google对这一块的逻辑是:
对whitelist下的symbol进行crc计算
ko加载时,把ko中symbol的crc和第一步中的crc值进行对比
匹配的话加载,不匹配的话就表示你vendor的ko和我不兼容
主要诱发原因几个:改函数了、改结构体了、改enum了。统称KMI break。
而ABI check就是针对这种情况去做一个检查,检查kernel中哪些接口、变量被改动了,在生成的报告中可以看到有哪些地方被改动了。
ABI-check环境配置与步骤:
环境准备:
首先电脑需要有python3环境,公司ubuntu台式机一般自带python环境,没有可自行安装。
拉取GoogleKernel源码:
mkdir GoogleKernel && cd Google Kernelrepo init -u [https://android.googlesource.com/kernel/manifest](https://android.googlesource.com/kernel/manifest) -b common-android11-5.4repo sync
配置工具链libabigail:
http://mirrors.kernel.org/sourceware/libabigail/
在链接中下载一个版本,解压,进目录。
使用指令安装依赖库:
sudo apt-get install autoconf automake libtool pkg-config libxml2 elfutils doxygen python-sphinx libelf-dev elfutils libdw-dev
使用指令编译libabigail工具:
mkdir buildcd build../configure --prefix=/where/you/want/to/install/libabigail
这一步需要注意的是,如果执行有问题,根据返回的结果,告知需要什么库就用apt-get install即可
make all install
这里如果install失败,显示未定义变量等代码错误,极大可能为版本与环境不兼容,不要自己修改源码,在上面的链接中找一个更早的版本再次尝试。
然后添加libabigail环境变量:
可使用export指令临时添加:
export PATH="/where/you/want/to/install/libabigail/bin:$PATH"export LD_LIBRARY_PATH="/where/you/want/to/install/libabigail/lib:$LD_LIBRARY_PATH"
因为export只能保留在当前进程,如果另开terminal就会没了,所以最好还是把这两个环境变量配置到/etc/environment里面去,急用的话就source一下,不急的话reboot永久生效。
google源码编译:
Google 代码的时间节点要和当前使用的GoogleKernel的编译时间节点一致
同步时间点:
repo syncrepo forall -c 'commitID=`git log --before "2020-12-09 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'
编译源码:
cd GoogleKernel/./build/abi/bootstrap
等待执行完成后会有提示运行export指令:
输入上面返回结果最后的指令:
Export PATH="/media/ubuntu/29b97d68-204d-4d9e-b187-3388d201f1eb/GoogleKernel/build/abi/abigail-inst/201207d4/bin:$PATH" LD_LIBRARY_PATH="/media/ubuntu/29b97d68-204d-4d9e-b187-3388d201f1eb/GoogleKernel/build/abi/abigail-inst/201207d4/lib:$LD_LIBRARY_PATH"
执行后运行编译指令:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report
执行完成后,在 GoogleKernel/out_abi/android11-5.4/dist/目录下的abi-ASB-2020-12-05_11-5.4-2-gc797384.xml文件即为google原生ABI。
编译qcom和xiaomi项目的gki版本,注意为user版本:
具体编译手法视项目情况而定。
生成qcom和xiaomi的boot-gki.img对应的abi-dump文件:
对于qcom的gki版本:
生成qcom的abi-dump report:
GoogleKernel/build/abi/dump_abi --linux-tree out/target/product/XXXX/obj/kernel-gki/msm-5.4 --out-file report/xiaomi_abidump_qcom.xml --kmi-whitelist common/android/abi_gki_aarch64_qcom
生成google的abi-dump report:
GoogleKernel/build/abi/dump_abi --linux-tree GoogleKernel/out_abi/android11-5.4/dist --out-file report/google_abidump_qcom.xml --kmi-whitelist common/android/abi_gki_aarch64_qcom
对于xiaomi的gki版本:
生成xiaomi的abi-dump report:
GoogleKernel/build/abi/dump_abi --linux-tree out/target/product/XXXX/obj/kernel-gki/msm-5.4 --out-file report/xiaomi_abidump_xiaomi.xml --kmi-whitelist common/android/abi_gki_aarch64_xiaomi
生成google的abi-dump report:
GoogleKernel/build/abi/dump_abi --linux-tree GoogleKernel/out_abi/android11-5.4/dist --out-file report/google_abidump_xiaomi.xml --kmi-whitelist common/android/abi_gki_aarch64_xiaomi
进行abi-diff比较:
abi-diff对qcom和google进行比较:
GoogleKernel/build/abi/diff_abi --baseline report/google_abidump_qcom.xml --new report/xiaomi_abidump_qcom.xml --report report/report_diff_qcom.xml
abi-diff对xiaomi和google进行比较:
GoogleKernel/build/abi/diff_abi --baseline report/google_abidump_xiaomi.xml --new report/xiaomi_abidump_xiaomi.xml --report report/report_diff_xiaomi.xml
生成的这个报告里面会详细的列出Kernel里面被改了哪些函数、变量。
结果文件中:
Leaf changes summary: 0 artifact changed (8 filtered out)
Changed leaf types summary: 0 (8 filtered out) leaf types changed
Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
分别表示:共有几处type被改,几处函数声明有变化,几处变量有变化
值得注意的是,如果有一个结构体被修改,函数的参数用到了这个结构体,也会导致函数的crc值产生变化,被report出来。