有错误的地方还请指正
在之前的这篇文章中尝试了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_BINARY
和VENDOR_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.img
用Android-Image-Kitchen
解包,会得到一堆文件,终端会给出这些信息
在build/build.sh
中查找BUILD_BOOT_IMG
,在脚本末尾的代码如下
对代码阅读后可知:当BOOT_IMAGE_HEADER_VERSION
为3
的时候才会检查GKI_RAMDISK_PREBUILT_BINARY
和KERNEL_VENDOR_CMDLINE
但是解包的结果中可以看到BOARD_HEADER_VERSION
是2
脚本的帮助信息中说,如果BOOT_IMAGE_HEADER_VERSION
值小于3
,那么还需要指定BASE_ADDRESS
和PAGE_SIZE
这两个选项的值其实就是解包信息中的BOARD_KERNEL_BASE
和BOARD_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.sh
中echo " 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.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!