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

相关文章

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec