首页
社区
课程
招聘
[原创]实操篇- pixel 2 刷8.0.0/8.1.0 AOSP +4.4 Kernel (重点解决刷完触屏失灵问题)
发表于: 2020-12-15 16:29 10300

[原创]实操篇- pixel 2 刷8.0.0/8.1.0 AOSP +4.4 Kernel (重点解决刷完触屏失灵问题)

2020-12-15 16:29
10300

前面这些版本源码资源以及vendor资源大家应该刷过机的都知道怎么去找和下载,网上也有很多比较详细的教程,不赘述。本文重点对整个编译脚本进行注解,以及解决一部分人遇到的触屏失灵问题。

Image.lz4-dtb
Image.lz4-dtb是内核的设备树描述文件,通过此文件编译内核时不会编译冗余的代码,所以要编译某个版本的内核时,应该先将生产的设备树文件拷贝到内核编译前查询的目录:

Image.lz4-dtb是Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pain in the ass”,引发ARM Linux社区的地震,随后ARM社区进行了一系列的重大修正。在过去的ARM Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。读者有兴趣可以统计下常见的s3c2410、s3c6410等板级目录,代码量在数万行。
社区必须改变这种局面,于是PowerPC等其他体系架构下已经使用的Flattened Device Tree(FDT)进入ARM社区的视野。Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,采用Device Tree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。

可能出现的问题(我自己遇到的问题,坑的一头雾水那种)
如果每次更换内核版本的时候不能直接在msm下git checkoout 版本来切换,因为会有很多已经生成的文件在下一次编译的时候不会再进行编译,会出错,
一种比较保险的方式就是,git checkout .丢弃本地没有提交的所有修改,返回到最初版本。
此外,另一种最保险的方法是重新

然后checkout到干净的分支,再进行编译。优点是之前一些找不到原因的问题可能会在下次正常操作后不再出现,但是缺点是浪费时间。

建议
脚本中编译内核部分没有对编译内核失败进行报错,因此首次编译内核生成dtb文件的时候最好手动编译。或者单独写个脚本编译;

本文重点解决的大家比较关心的安装大多数网上方法刷完机后触屏失灵问题:

pixel 2的刷机和别的google系列的手机差别并不大,不过值得注意的是如果只替换boot.img,会导致有几个htc驱动的version magic和内核的version magic不一致,从而使得这几个驱动在boot时,不能被insmod,所以刷完之后就会有触摸屏幕没有反应的状况。所以,在pixel 2刷机之前,首先要对内核做一些修改,去掉这个version magic的校验机制

方法二,改掉自身编译的内核的version magic, 使得和原本userdebug 版本相匹配:

3.在module.c里,注释掉check_verion函数:

我自己在实践中发现pixel 2刷其他版本时也遇到类似的问题,同样的方式解决就行。nexus 6p不存在这样的问题。

```   
#!/bin/bash
#内核源码目录
export KERNEL_PATH=/home/koozxcv/vp/Kernel/kernel/msm                              
# export GCC_PATH=/home/koozxcv/vp/Kernel/AOSP_SOURCE/android-8.0.0_r34/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
#编译工具链
export GCC_PATH=/opt/android-ndk-r15b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
#AOSP源码目录
export AOSP_PATH=/home/koozxcv/vp/Kernel/AOSP_SOURCE/android-8.0.0_r34
#生成的目标文件目录
export TARGET_PATH=$AOSP_PATH/out/target/product/walleye
#
export DEVICE_PATH=$AOSP_PATH/device/google/wahoo-kernel
export KERNEL_OUT_PATH=$KERNEL_PATH/arch/arm64/boot
 
 
cd $KERNEL_PATH
#删除旧的vmlinux.o和vmlinux,当然是如果存在的情况下
#在修改了kernel源码后,KERNEL_PATH下的vmlinux.o和vmlinux文件就会发生#改变,而$KERNEL_PATH/arch/arm64/boot下的 Image Image.gz #Image.gz-dtb都是根据vmlinux拷贝或者压缩而来的,
#具体细节查看$KERNEL_PATH/arch/arm64/boot/Makefile,当vmlinux发生##改变的时候,会接连引起Image Image.gz Image.gz-dtb、Image-dtb的重新生成。
rm vmlinux.o
rm vmlinux
sleep 2
 
 
#######交叉编译内核########
 
#交叉编译-指定编译目标平台架构是arm64
export ARCH=arm64
#交叉编译-指定交叉编译工具链位置
export export CROSS_COMPILE=$GCC_PATH
#交叉编译-指定wahoo_defconfig配置文件
make -j$(nproc --all) wahoo_defconfig
make  -j$(nproc --all)
#关于Image.lz4-dtb下面会做简单介绍,设备树在内核中是个比较重要的概念
cp $KERNEL_OUT_PATH/Image.lz4-dtb $DEVICE_PATH/
#编译完dtbo.img后拷贝到源码下的/out/target/product/walleye目录
cp $KERNEL_OUT_PATH/dtbo.img $TARGET_PATH/
 
cd $TARGET_PATH
rm boot.img
rm kernel
#########编译AOSP###############
cd $AOSP_PATH
source $AOSP_PATH/build/envsetup.sh
lunch 29
 
# # make -j$(nproc --all) dtc mktimg
#当拷贝dtbo.img和Image.lz4-dtb到目标目录后,这里才可以正常编译bootimage
make -B bootimage和dtbo.img
cd $TARGET_PATH
 
#####刷入编译好的boot.img和dtbo.img#####
adb reboot bootloader
echo "waiting device"
sleep 8
fastboot flash boot boot.img
fastboot flash dtbo_a dtbo.img
fastboot reboot
```
```   
#!/bin/bash
#内核源码目录
export KERNEL_PATH=/home/koozxcv/vp/Kernel/kernel/msm                              
# export GCC_PATH=/home/koozxcv/vp/Kernel/AOSP_SOURCE/android-8.0.0_r34/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
#编译工具链
export GCC_PATH=/opt/android-ndk-r15b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
#AOSP源码目录
export AOSP_PATH=/home/koozxcv/vp/Kernel/AOSP_SOURCE/android-8.0.0_r34
#生成的目标文件目录
export TARGET_PATH=$AOSP_PATH/out/target/product/walleye
#
export DEVICE_PATH=$AOSP_PATH/device/google/wahoo-kernel
export KERNEL_OUT_PATH=$KERNEL_PATH/arch/arm64/boot
 
 
cd $KERNEL_PATH
#删除旧的vmlinux.o和vmlinux,当然是如果存在的情况下
#在修改了kernel源码后,KERNEL_PATH下的vmlinux.o和vmlinux文件就会发生#改变,而$KERNEL_PATH/arch/arm64/boot下的 Image Image.gz #Image.gz-dtb都是根据vmlinux拷贝或者压缩而来的,
#具体细节查看$KERNEL_PATH/arch/arm64/boot/Makefile,当vmlinux发生##改变的时候,会接连引起Image Image.gz Image.gz-dtb、Image-dtb的重新生成。
rm vmlinux.o
rm vmlinux
sleep 2
 
 
#######交叉编译内核########
 
#交叉编译-指定编译目标平台架构是arm64
export ARCH=arm64
#交叉编译-指定交叉编译工具链位置
export export CROSS_COMPILE=$GCC_PATH
#交叉编译-指定wahoo_defconfig配置文件
make -j$(nproc --all) wahoo_defconfig
make  -j$(nproc --all)
#关于Image.lz4-dtb下面会做简单介绍,设备树在内核中是个比较重要的概念
cp $KERNEL_OUT_PATH/Image.lz4-dtb $DEVICE_PATH/
#编译完dtbo.img后拷贝到源码下的/out/target/product/walleye目录
cp $KERNEL_OUT_PATH/dtbo.img $TARGET_PATH/
 
cd $TARGET_PATH
rm boot.img
rm kernel
#########编译AOSP###############
cd $AOSP_PATH
source $AOSP_PATH/build/envsetup.sh
lunch 29
 
# # make -j$(nproc --all) dtc mktimg
#当拷贝dtbo.img和Image.lz4-dtb到目标目录后,这里才可以正常编译bootimage
make -B bootimage和dtbo.img
cd $TARGET_PATH
 
#####刷入编译好的boot.img和dtbo.img#####
adb reboot bootloader
echo "waiting device"
sleep 8
fastboot flash boot boot.img
fastboot flash dtbo_a dtbo.img
fastboot reboot
```
cp $KERNEL_OUT_PATH/Image.lz4-dtb $DEVICE_PATH/
cp $KERNEL_OUT_PATH/Image.lz4-dtb $DEVICE_PATH/
git clone https://android.googlesource.com/kernel/msm
git clone https://android.googlesource.com/kernel/msm
 
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
static int check_modinfo(struct module *mod, struct load_info *info, int fla
gs)
{
const char *modmagic = get_modinfo(info, "vermagic");
int err;
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
/* This is allowed: modprobe --force will invalidate it. */
if (!modmagic) {
err = try_to_force_load(mod, "bad vermagic");
if (err)
return err;
} else if (!same_magic(modmagic, vermagic, info->index.vers)) {
pr_err("%s: version magic '%s' should be '%s'\n",
mod->name, modmagic, vermagic);
//return -ENOEXEC; 【这里注释掉】
}
if (!get_modinfo(info, "intree"))
add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
if (get_modinfo(info, "staging")) {
add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
pr_warn("%s: module is from the staging directory, the quality "
"is unknown, you have been warned.\n", mod->name);
}
/* Set up license info based on the info section */
set_license(mod, get_modinfo(info, "license"));
return 0;
}
static int check_modinfo(struct module *mod, struct load_info *info, int fla
gs)
{
const char *modmagic = get_modinfo(info, "vermagic");
int err;
if (flags & MODULE_INIT_IGNORE_VERMAGIC)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-12-15 16:30 被koozxcv编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (5)
雪    币: 29
活跃值: (5672)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好!
2020-12-20 22:21
0
雪    币: 477
活跃值: (1412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢分享
2020-12-20 23:24
0
雪    币: 5596
活跃值: (2173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢大佬分享
2020-12-21 14:45
0
雪    币: 117
活跃值: (886)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

感谢大佬分享

最后于 2021-1-8 16:49 被zhengyuqin编辑 ,原因:
2021-1-8 14:24
0
雪    币: 12
活跃值: (1075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个问题其实是 touch 驱动没有被正确加载的问题。内核和模块是要匹配才能加载的,这里改内核校验其实不可取。应该把自己编译的内核+驱动一起刷进去。有两个办法,一个是把驱动编译进内核,这样刷一个内核就可以了。第二个是用AnyKernel3,把 vendor 中的模块一并刷入。
2021-2-26 17:29
2
游客
登录 | 注册 方可回帖
返回
//