首页
社区
课程
招聘
eBPF on Android之编译内核与打补丁(解决触摸和WIFI失效问题)
发表于: 2022-10-20 09:15 29655

eBPF on Android之编译内核与打补丁(解决触摸和WIFI失效问题)

2022-10-20 09:15
29655

有错误的地方还请指正

在之前的这篇文章中尝试了ptach内核,但是尝试开启CONFIG_KRETPROBES后出现了触摸和WIFI失效的情况

后来和missking交流之后,发现文章中修改内核编译选项的操作是不标准的,具体可以参考下面的文章

简单来说正确的步骤如下:

然而即使这样我编译出来的内核还是会导致触摸和WIFI失效,后来在参考了下面的几个帖子之后,把触摸修好了,但是WIFI始终没有修好

修好触摸主要参考第一个帖子第四楼

先在.repo/manifests/default.xml里面进行配置fts_touch这些

但是发现这些驱动代码目录不对,然后用git submodule命令去把代码同步过去、或者手动复制

在一系列操作之后,终于触摸能用了,后面接着看了下怎么修WIFI,但是涉及的内容实在是太多了,就暂时搁置没有再研究了

也正是这一番操作,我注意到build/build.sh还有个设定是BUILD_BOOT_IMG,也就是单独编译内核的时候,是可以构建出boot.img的

网上没有找到关于BUILD_BOOT_IMG这个选项的用法,虽然脚本中有说明,但是当时已经是筋疲力尽,对于里面提到的GKI_RAMDISK_PREBUILT_BINARYVENDOR_RAMDISK_BINARY更是一头雾水(我去哪儿搞这玩意儿??)

最近假期又有点时间了,于是认真看了脚本说明和逻辑,结合boot.img解包的信息,终于搞清楚单独编译内核且触摸和WIFI都正常的正确姿势了

操作其实很简单,不需要大改特改

操作其实很简单,不需要大改特改

操作其实很简单,不需要大改特改

本文将就正确单独编译安卓内核给内核打bpf_probe_read_user补丁进行详细指南

博客中以下两篇文章步骤或多或少存在问题,请勿参考,以本文为准

仅供参考

该使用代理连接的时候请自行加代理

首先根据官方指南安装必要库和软件

创建一个工作目录,后面的文件都会放这下面

根据官方的说明,我这里选择Pixel 4XL对应的分支android-msm-coral-4.14-android13

为了能对应上手机的内核版本,这里没有加上--depth=1,后面需要checkout

repo不会设置?请参考

最新版的内核编译脚本会使用自带的编译工具,不需要自己设置clang环境变量

如果你同步的内核源代码没有编译工具,需要自己手动同步一下,如下

代码同步好之后,进入private/msm-google文件夹,通过下面的命令切换到和手机内核版本一致的commit

我的内核版本是4.14.276-ge333cb8619d0-ab8811257,那么对应的commit id就是e333cb8619d0

如果对这个部分不感兴趣,请直接查看脚本修改小节

首先将手机当前的boot.imgAndroid-Image-Kitchen解包,会得到一堆文件,终端会给出这些信息

build/build.sh中查找BUILD_BOOT_IMG,在脚本末尾的代码如下

对代码阅读后可知:当BOOT_IMAGE_HEADER_VERSION3的时候才会检查GKI_RAMDISK_PREBUILT_BINARYKERNEL_VENDOR_CMDLINE

但是解包的结果中可以看到BOARD_HEADER_VERSION2

脚本的帮助信息中说,如果BOOT_IMAGE_HEADER_VERSION值小于3,那么还需要指定BASE_ADDRESSPAGE_SIZE

这两个选项的值其实就是解包信息中的BOARD_KERNEL_BASEBOARD_PAGE_SIZE

解包信息中的BOARD_KERNEL_CMDLINE则就是KERNEL_CMDLINE

KERNEL_BINARY的值直接说了是Image.lz4或者Image.gz,我们知道编译产物中有Image.lz4,所以指定为Image.lz4

MKBOOTIMG_PATH默认是tools/mkbootimg/mkbootimg.py,但是我发现同步下来的代码并没有这个脚本,这个我们去AOSP之类的代码中找一个就行了,比如

或者直接同步下官方的代码

我这里直接把脚本放在了${WORK_DIR},也就是整个代码的根目录下面

那么问题来了,VENDOR_RAMDISK_BINARY应该是什么呢,哪里找,脚本里面的说明如下

最开始我也是迷糊的,boot.img解包出来的文件有一个是boot.img-ramdisk.cpio.gz

build/build.sh的逻辑是要和initramfs.cpio甚至GKI_RAMDISK_PREBUILT_BINARY一起打包

那么解包出来的boot.img-ramdisk.cpio.gz是需要更新内容吗,还是接着用呢?

在此之前的经验告诉我,肯定不是直接接着用解包出来的boot.img-ramdisk.cpio.gz

注意到BUILD_INITRAMFS的描述是if defined, build a ramdisk containing all .ko files and resulting depmod artifacts

就是说会打包出一个ramdisk包含所有.ko也就是驱动模块文件

虽然之前编译的时候没有定义这个,但是产物确实有initramfs.img

发现原来是private/msm-google/build.config.common文件中设置了

而脚本中也确实是这样,可以看到中途会产生initramfs.cpio

initramfs.cpio正好是和VENDOR_RAMDISK_BINARY一起打包的,也就是说VENDOR_RAMDISK_BINARY应该是.cpio文件

boot.img-ramdisk.cpio.gz解压确实会有一个boot.img-ramdisk.cpio文件

那么将VENDOR_RAMDISK_BINARY指定为解压的boot.img-ramdisk.cpio,然后和initramfs.cpio打包,那不就会把所有驱动都带上了吗,触摸什么的应该都会正常吧

经过实践,确实是这样

需要注意的是脚本操作VENDOR_RAMDISK_BINARY的时候,操作的是${DIST_DIR}下面的文件

我们需要在脚本中把解压的boot.img-ramdisk.cpio复制到${DIST_DIR}

于是在build/build.shecho " Files copied to ${DIST_DIR}"之前加上复制命令

做完上面的准备后,结合解包的信息,正常情况下使用下面的命令就能编译生成boot.img

注意:KERNEL_CMDLINE BASE_ADDRESS PAGE_SIZE请从解包的内核信息中获取

根据bcc的issue:bpf_probe_read_user returns error (-14) on Android 11, Kernel 4.14, ARM64

要添加读取用户空间数据的功能,可以参考下面这个补丁

https://lkml.org/lkml/diff/2019/5/2/1100/1

这里没有几行,我手动找到对应的代码位置,添加了代码

private/msm-google/include/uapi/linux/bpf.h

private/msm-google/kernel/trace/bpf_trace.c

private/msm-google/tools/include/uapi/linux/bpf.h

注意原patch中有两处FN(probe_read_user),,但是我截图没有,这是因为我这个版本的源代码已经有这个了

主要是缺少BPF_CALL_3(bpf_probe_read_user, void *, dst, u32, size, const void *, unsafe_ptr)函数

请打补丁的时候仔细确定,看好了再修改,否则编译会出问题,提示重定义什么的

还有更多的bpf帮助函数需要patch?可以参考bcc给出的相关函数的commit列表,不过还是参考下安卓的补丁写法比较好

这里针对的是我的Pixel 4XL的做法,4.9这些内核也可以打补丁,但是需要自己参考一些新一点的内核源码做patch

首先进入内核源码目录

生成floral_defconfig对应的.config配置文件,这一步是基于arch/arm64/configs/floral_defconfig配置文件进行的生成

打开内核编译配置的可视化界面

如图所示,这里按空格键可以切换选项选中状态

/可以进行搜索,这样可以知道一些选项在哪里,以及选项的限制条件等等

比如这里CONFIG_KRETPROBES是多个条件共同决定的,只要这些条件均为y那么CONFIG_KRETPROBES自然会变成y

而图中后面的SAMPLE_KRETPROBES会多出一个Location指示,这一种除了子条件要通过,同时需要到对应的子菜单修改选中状态

修改选项状态之后,按TAB键可以切换底部的选项,先选择Save保存.config文件,然后选择Exit退出编辑

然后根据.config配置文件生成defconfig配置文件的命令如下,注意这里生成的defconfig是精简的,有些选项你可能明明设置了但是里面没有

实际上在编译的时候会生成完整的版本,不用担心,如果说编译阶段(out文件夹下)生成的.config文件没有你之前设置的,那么可能有选项冲突了

覆盖原有的floral_defconfig配置文件

删除.config配置文件,不然编译时会提示你需要清理

至此完成了内核编译配置的修改,可以开始正式编译了

如果你有编译过内核的经验,会发现自己编译出来的内核版本有+或者dirty这些内容

如果你想去掉这些,那么请先把相关代码的修改添加commit,就可以避免这个问题

编译命令如下:

可以看到boot.img正常生成了

可以发现会比之前仅用Image.lz4-dtb替换boot.img-kernel后使用Android-Image-Kitchen重打包得到的产物明显大不少

经过验证,这样编译打包出来的boot.img刷机后可以正常开机、触摸和WIFI均正常,用Magisk打补丁后也能正常使用

相关eBPF设定开启情况

内核符号情况

在之前的文章中,我认为内核编译可能会遭遇各种问题,以至于通过修改并重新编译内核在4.x系列的手机上可能过于折腾

但是在达成了不需要完整AOSP环境,直接编译内核生成正常可用的boot.img的目的之后,eBPF在安卓上的可玩性又好了很多

最后再次汇总下整个操作步骤:

 
 
 
 
 
 
 
 
 
 
 
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
mkdir ~/Desktop/p4xl
export WORK_DIR=~/Desktop/p4xl
cd ${WORK_DIR}
mkdir ~/Desktop/p4xl
export WORK_DIR=~/Desktop/p4xl
cd ${WORK_DIR}
 
repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-coral-4.14-android13
repo sync
repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-coral-4.14-android13
repo sync
 
cd prebuilts
git clone https://android.googlesource.com/kernel/prebuilts/build-tools
mv build-tools kernel-build-tools
export PATH=${WORK_DIR}/prebuilts/kernel-build-tools/linux-x86/bin:$PATH
cd prebuilts
git clone https://android.googlesource.com/kernel/prebuilts/build-tools
mv build-tools kernel-build-tools
export PATH=${WORK_DIR}/prebuilts/kernel-build-tools/linux-x86/bin:$PATH
 
git checkout e333cb8619d0
git checkout e333cb8619d0
 
ANDROID! magic found at: 0
BOARD_KERNEL_CMDLINE console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 androidboot.memcg=1 cgroup.memory=nokmem usbcore.autosuspend=7 androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 androidboot.boot_devices=soc/1d84000.ufshc loop.max_part=7 buildvariant=user
BOARD_KERNEL_BASE 0x00000000
BOARD_NAME
BOARD_PAGE_SIZE 4096
BOARD_HASH_TYPE sha1
BOARD_KERNEL_OFFSET 0x00008000
BOARD_RAMDISK_OFFSET 0x01000000
BOARD_SECOND_OFFSET 0x00000000
BOARD_TAGS_OFFSET 0x00000100
BOARD_OS_VERSION 13.0.0
BOARD_OS_PATCH_LEVEL 2022-09
BOARD_HEADER_VERSION 2
BOARD_HEADER_SIZE 1660
BOARD_DTB_SIZE 1048284
BOARD_DTB_OFFSET 0x01f00000
ANDROID! magic found at: 0
BOARD_KERNEL_CMDLINE console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.enable=1 androidboot.memcg=1 cgroup.memory=nokmem usbcore.autosuspend=7 androidboot.usbcontroller=a600000.dwc3 swiotlb=2048 androidboot.boot_devices=soc/1d84000.ufshc loop.max_part=7 buildvariant=user
BOARD_KERNEL_BASE 0x00000000
BOARD_NAME
BOARD_PAGE_SIZE 4096
BOARD_HASH_TYPE sha1
BOARD_KERNEL_OFFSET 0x00008000
BOARD_RAMDISK_OFFSET 0x01000000
BOARD_SECOND_OFFSET 0x00000000
BOARD_TAGS_OFFSET 0x00000100
BOARD_OS_VERSION 13.0.0
BOARD_OS_PATCH_LEVEL 2022-09
BOARD_HEADER_VERSION 2
BOARD_HEADER_SIZE 1660
BOARD_DTB_SIZE 1048284
BOARD_DTB_OFFSET 0x01f00000
 
 
 
 
 
 
 
 
 
 
 
git clone https://android.googlesource.com/platform/system/tools/mkbootimg
git clone https://android.googlesource.com/platform/system/tools/mkbootimg
 
Name of the vendor ramdisk binary which includes the device-specific components of ramdisk like the fstab file and the device-specific rc files.
Name of the vendor ramdisk binary which includes the device-specific components of ramdisk like the fstab file and the device-specific rc files.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 14
支持
分享
最新回复 (15)
雪    币: 4583
活跃值: (6836)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
So powerful
2022-10-20 11:39
0
雪    币: 1212
活跃值: (1362)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
大佬太猛啦,感谢分享!
2022-11-4 14:37
0
雪    币: 2354
活跃值: (3224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大佬,你好,想问一下编译命令中的BUILD_CONFIG=private/msm-google/build.config.floral,这个路径在pixel3中对应的是什么?我在这个目录中没有看到build.config.floral和build.config.b1c1
2023-3-16 22:40
0
雪    币: 508
活跃值: (1782)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
NPC2000 大佬,你好,想问一下编译命令中的BUILD_CONFIG=private/msm-google/build.config.floral,这个路径在pixel3中对应的是什么?我在这个目录中没有看到bu ...
每个型号的手机通常代号都不一样,floral是pixel 4和4 XL的代号。

pixel系列的可以在这里查看,pixel 3应该是blueline,你可以在对应目录下面 grep 一下。

https://source.android.com/docs/setup/build/building-kernels

---

短消息单条不能超过140字符,就不通过短消息回复你了...
2023-3-21 09:51
0
雪    币: 2354
活跃值: (3224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
大佬 ,非常感谢你。我想问一下这文件private/msm-google/build.config.floral文件是用命令生成的吗?pixel3是b1c1,那么是不是说就要把make ARCH=arm64 floral_defconfig改成make ARCH=arm64 b1c1_defconfig执行才可以在private/msm-google/目录下生成private/build.config.b1c1?
2023-3-22 08:48
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7

大佬的教程很不错 可是 可是 我的连build/build.sh都没有
pixel1代 ubuntu系统 按照谷歌以及大佬的教程操作 大概步骤如下:
1.apt-get install repo
2.git config --global user.name xxx
3.git config --global user.email xxx@qq.com
4.repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-marlin-3.18-pie-qpr2  --depth=1
5.repo sync
提示sync成功后 cd build
显示如下

drwxr-xr-x 8 root root  4096 Apr 30 12:00 ./
drwxr-xr-x 6 root root  4096 Apr 30 12:00 ../
drwxr-xr-x 2 root root  4096 Apr 30 12:00 abi/
-rw-r--r-- 1 root root  5462 Apr 30 12:00 BUILD.bazel
lrwxrwxrwx 1 root root    18 Apr 30 12:00 build.config -> ../../build.config
-rw-r--r-- 1 root root   383 Apr 30 12:00 build.config.net_test
-rwxr-xr-x 1 root root  2080 Apr 30 12:00 build_test.sh*
drwxr-xr-x 3 root root  4096 Apr 30 12:00 build-tools/
-rw-r--r-- 1 root root 28790 Apr 30 12:00 build_utils.sh
-rwxr-xr-x 1 root root  3220 Apr 30 12:00 config.sh*
-rw-r--r-- 1 root root  2245 Apr 30 12:00 envsetup.sh
-rwxr-xr-x 1 root root  1056 Apr 30 12:00 gettop.sh*
lrwxrwxrwx 1 root root    27 Apr 30 12:00 .git -> ../.repo/projects/build.git/
-rw-r--r-- 1 root root    19 Apr 30 12:00 .gitignore
drwxr-xr-x 2 root root  4096 Apr 30 12:00 gki/
drwxr-xr-x 2 root root  4096 Apr 30 12:00 hermetic/
drwxr-xr-x 9 root root  4096 Apr 30 12:00 kleaf/
-rw-r--r-- 1 root root 11359 Apr 30 12:00 LICENSE
-rw-r--r-- 1 root root   370 Apr 30 12:00 METADATA
-rw-r--r-- 1 root root     0 Apr 30 12:00 MODULE_LICENSE_APACHE2
-rwxr-xr-x 1 root root  1770 Apr 30 12:00 multi-switcher.sh*
lrwxrwxrwx 1 root root     7 Apr 30 12:00 NOTICE -> LICENSE
-rw-r--r-- 1 root root    78 Apr 30 12:00 OWNERS
-rw-r--r-- 1 root root  9944 Apr 30 12:00 _setup_env.sh
drwxr-xr-x 2 root root  4096 Apr 30 12:00 static_analysis/
-rwxr-xr-x 1 root root  2477 Apr 30 12:00 synchronize_owners*
root@ubuntu:~/android/kernel/build# 

显然 没有build.sh 
不过bazel  kleaf的字眼很明显 看官方文档的意思 好像是要用bazel代替build/build.sh脚本构建 
但bazel具体怎么搞 谷歌好像也没有提供具体文档
所以 我迷茫了 求大佬指个方向

最后于 2023-4-30 18:19 被万里星河编辑 ,原因:
2023-4-30 18:17
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
seeeseee 每个型号的手机通常代号都不一样,floral是pixel 4和4 XL的代号。 pixel系列的可以在这里查看,pixel 3应该是blueline,你可以在对应目录下面 grep 一下。 ...
奇怪 我同步了一下大佬的android-msm-coral-4.14-android13分支 里面就有build/build.sh 但pixel的android-msm-marlin-3.18-pie-qpr2分支就没有
2023-5-1 12:03
0
雪    币: 2334
活跃值: (1349)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
万里星河 奇怪 我同步了一下大佬的android-msm-coral-4.14-android13分支 里面就有build/build.sh 但pixel的android-msm-marlin-3.18-pie ...
去掉 --depth=1 重新拉代码
2023-5-6 17:58
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
FraMeQ 去掉 --depth=1 重新拉代码
OK 已完美解决 感谢大佬的回复
2023-5-6 23:53
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
万里星河 OK 已完美解决 感谢大佬的回复

你好,咨询下你如何解决的, 我尝试了下repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-marlin-3.18-pie-qpr2

repo sync以后 也是没有build.sh的

最后于 2023-5-16 11:54 被问心?编辑 ,原因:
2023-5-16 11:54
0
雪    币: 1887
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
我拉 android-msm-crosshatch-4.9-android10-qpr3 分支也是没有build.sh脚本。
2023-12-19 15:15
0
雪    币: 508
活跃值: (1782)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

给各位说没有`build.sh`的,可以尽可能全量同步代码,然后git log查一下`build.sh`是什么时候删的,不行可以在线查

https://cs.android.com/android/kernel/superproject/+/android-msm-crosshatch-4.9-android10-qpr3:;bpv=1


页面下面选History,然后点击show all,一般都能找到,然后自己同步了代码切commit,不然就用谷歌新的构建系统


最后于 2023-12-19 16:07 被seeeseee编辑 ,原因:
2023-12-19 16:05
0
雪    币: 1887
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
seeeseee 给各位说没有`build.sh`的,可以尽可能全量同步代码,然后git log查一下`build.sh`是什么时候删的,不行可以在线查https://cs.android.com/android/ke ...
已经找到解决方案,查了一下comit log,谷歌在11月15号的一次提交显示彻底删除了build.sh编译,后面全部用Bazel了。为了支持pixel3(内核分支: android-msm-crosshatch-4.9-android-qpr3),我测试了时间较早的一些tag,最后发现hash值为 a9e9a42c7b058c1d339c7a03f97683b21eb9e35 的一次tag可用,直接checkout过去就可以了。
2023-12-19 17:49
1
雪    币: 11011
活跃值: (7424)
能力值: ( LV12,RANK:219 )
在线值:
发帖
回帖
粉丝
15
万里星河 OK 已完美解决 感谢大佬的回复
最后于 2024-1-14 16:18 被neilwu编辑 ,原因:
2024-1-14 16:11
0
雪    币: 201
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
VENDOR_RAMDISK_BINARY是vendor_boot.img,安卓11或者更高要用启动映像头文件版本3或4,供应商专用的ramdisk移动至verdor_boot分区了。
2024-2-28 18:27
1
游客
登录 | 注册 方可回帖
返回
//