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

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

找完工作该补充的东西

首先: 锻炼身体,包括乒乓球,羽毛球,都必须练习,学习,锻炼身体等是一个很重要的与人交际沟通的方式; 打牌,娱乐:会玩是一个人很重要的交际沟通的法宝; 摄影:这个是一个兴趣爱好,也是提高自己的审美,生活品质,当然也是与人沟通的重要途径; 做饭:这个的话就是对自己,对朋友非常有益的一件事情;

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

工作流Activiti初体验【一】

在这里记录一下我的Activiti历程:(以下示例不涉及真实业务,所有逻辑均建立在学习的基础上) bpmn图 发起任务我设置了一个权限组user1,只要是这个权限的用户都可以发起任务 分发任务我设置了一个用户组,用户组中每个用户都可以处理这步流程,只要有一个人处理这步任务,分发的流程就算结束了 分发任务这一环节还有个判断,允许任务下发和不允许任务下发 任务分发完成则来到子流程,每个被分