2023.5.9工作问题记录————安卓GKI检测abi-check

2024-03-13 13:20

本文主要是介绍2023.5.9工作问题记录————安卓GKI检测abi-check,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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出来。

参考网站:

Python3:https://www.python.org/

Libabigail工具:http://mirrors.kernel.org/sourceware/libabigail/

Libabigail install sop:https://sourceware.org/libabigail/#presentation

ABI-check sop:https://source.android.google.cn/devices/architecture/kernel/abi-monitor

这篇关于2023.5.9工作问题记录————安卓GKI检测abi-check的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805030

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

MySQL报错sql_mode=only_full_group_by的问题解决

《MySQL报错sql_mode=only_full_group_by的问题解决》本文主要介绍了MySQL报错sql_mode=only_full_group_by的问题解决,文中通过示例代码介绍的非... 目录报错信息DataGrip 报错还原Navicat 报错还原报错原因解决方案查看当前 sql mo

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed