Android内核编译

news2024/12/23 22:44:30

前言

本文描述使用Ubuntu 编译Android内核刷入pixel4一些心得和流程。

PC信息:

                          ./+o+-       jack@jack
                  yyyyy- -yyyyyy+      OS: Ubuntu 22.04 jammy
               ://+//-yyyyyyo      Kernel: x86_64 Linux 6.5.0-35-generic
           .++ .:/++++++/-.+sss/`      Uptime: 1d 5h 4m
         .:++o:  /++++++++/:--:/-      Packages: 1807
        o:+o+:++.`..```.-/oo+++++/     Shell: bash 5.1.16
       .:+o:+o/.          `+sssoo+/    Resolution: 3840x2160
  .++/+:+oo+o:`             /sssooo.   DE: GNOME 41.7
 /+++//+:`oo+o               /::--:.   WM: Mutter
 \+/+o+++`o++o               ++.   WM Theme: Adwaita
  .++.o+++oo+:`             /dddhhh.   GTK Theme: Yaru [GTK2/3]
       .+.o+oo:.          `oddhhhh+    Icon Theme: Yaru
        \+.++o+o``-````.:ohdhhhhh+     Font: Ubuntu 11
         `:o+++ `ohhhhhhhhyo++os:      Disk: 345G / 459G (80%)
           .o:`.syhhhhhhh/.oo++o`      CPU: Intel Core i9-9900K @ 16x 5GHz [46.0°C]
               /osyyyyyyo++ooo+++/     GPU: NVIDIA GeForce RTX 4060
                   `````+oo+++o\:     RAM: 9361MiB / 31990MiB
                          `oo++. 

由于AOSP工程是不包含内核和驱动信息的,需要我们额外再另一个工程中二次编译导入AOSP构建或者bootloader中刷入。

前置相关信息

预编译驱动

再为AOSP编译时需要导入如下两个驱动文件信息。其中一个是高通另一个是google。(关于相关基础编译知识不在拓展)
在这里插入图片描述
解压后Google文件如下所示

google_devices/
├── coral
│   └── proprietary
│       ├── BoardConfigVendor.mk
│       └── device-vendor.mk
└── flame
    ├── android-info.txt
    ├── BoardConfigPartial.mk
    ├── COPYRIGHT
    ├── device-partial.mk
    ├── LICENSE
    └── proprietary
        ├── Android.mk
        ├── bootloader.img
        ├── radio.img
        └── vendor.img

4 directories, 11 files

其中vendor.img包含很多驱动信息。

使用file查阅此文件类型
file vendor.img 
vendor.img: Linux rev 1.0 ext2 filesystem data, UUID=c6de2406-7a19-5ed4-a028-9059e2335369, volume name "vendor" (extents) (large files) (huge files)

我们查阅发现是一个文件夹而已,我们将其解压后如下所示:

├── app
├── bin
├── build.prop
├── dsp
├── etc
├── firmware
├── firmware_mnt
├── lib
├── lib64
├── lost+found
├── media
├── odm
├── odm_dlkm
├── overlay
├── radio
├── rfs
├── ueventd.rc
└── vendor_dlkm

16 directories, 2 files

其中lib下的modules有很多关于驱动模块文件:

tree -L 1 vendorout/lib/modules/
vendorout/lib/modules/
├── adsp_loader_dlkm.ko
├── apr_dlkm.ko
├── cs35l36_dlkm.ko
├── ftm5.ko
├── heatmap.ko
├── incrementalfs.ko
├── lkdtm.ko
├── machine_dlkm.ko
├── mbhc_dlkm.ko
├── modules.alias
├── modules.dep
├── modules.load
├── modules.softdep
├── msm_11ad_proxy.ko
├── native_dlkm.ko
├── pinctrl_wcd_dlkm.ko
├── platform_dlkm.ko
├── q6_dlkm.ko
├── q6_notifier_dlkm.ko
├── q6_pdr_dlkm.ko
├── softdog.ko
├── stub_dlkm.ko
├── swr_ctrl_dlkm.ko
├── swr_dlkm.ko
├── usf_dlkm.ko
├── videobuf2-memops.ko
├── videobuf2-vmalloc.ko
├── wcd934x_dlkm.ko
├── wcd9360_dlkm.ko
├── wcd9xxx_dlkm.ko
├── wcd_core_dlkm.ko
├── wcd_cpe_dlkm.ko
├── wcd_spi_dlkm.ko
├── wglink_dlkm.ko
├── wlan.ko
└── wsa881x_dlkm.ko

0 directories, 36 files

上面以ko结尾的文件就是包含驱动的文件。这些文件会在内核加载后在读取这些驱动以正常驱动相关硬件。
更多信息可参阅:Kernal modules
但是需要注意内核模块和内核文件签名必须相同才可正常驱动!!!!
上面的一些img会直接在AOSP原封不动的输出到构建结果目录下:
在这里插入图片描述

编译内核

building-kernels
building-pixel-kernels
首先编译内核就需要下载内核工程。内核工程依旧是推荐使用repo下载。
对于pixel 系列手机可以先看对应仓库分支然后repo到本地
在这里插入图片描述
以笔者为例下载的是pixel4 flame分支

tree -L 1 .
.
├── build
├── build.config -> private/msm-google/build.config.no-cfi
├── build_floral.sh -> private/msm-google/build_floral.sh
├── build_sunfish.sh -> private/msm-google/build_sunfish.sh
├── out
├── prebuilts
├── prebuilts-master
└── private

下载后执行 build_floral.sh即可开始编译。我们常说的binder源码就在这个工程中
如下所示:

jack@jack:~/Desktop/android-kernel$ find -name binder* 
./private/msm-google/include/uapi/linux/android/binderfs.h
./private/msm-google/include/uapi/linux/android/binder.h
./private/msm-google/drivers/android/binder_alloc_selftest.c
./private/msm-google/drivers/android/binder_alloc.c
./private/msm-google/drivers/android/binderfs.c
./private/msm-google/drivers/android/binder_internal.h
./private/msm-google/drivers/android/binder.c
./private/msm-google/drivers/android/binder_alloc.h
./private/msm-google/drivers/android/binder_trace.h
./out/android-msm-pixel-4.14/kernel_uapi_headers/usr/include/linux/android/binderfs.h
./out/android-msm-pixel-4.14/kernel_uapi_headers/usr/include/linux/android/binder.h
./out/android-msm-pixel-4.14/private/msm-google/include/config/android/binder
./out/android-msm-pixel-4.14/private/msm-google/drivers/android/binder.o
./out/android-msm-pixel-4.14/private/msm-google/drivers/android/binder_alloc.o

编译完成后会在如下目录生成内核和驱动文件
${root_repo}/out/android-msm-pixel-4.14/dist

./
├── abi.prop
├── adsp_loader_dlkm.ko
├── apr_dlkm.ko
├── cs35l36_dlkm.ko
├── dtbo.img
├── ftm5.ko
├── heatmap.ko
├── Image.lz4
├── incrementalfs.ko
├── initramfs.img
├── kernel-headers.tar.gz
├── kernel-uapi-headers.tar.gz
├── lkdtm.ko
├── machine_dlkm.ko
├── mbhc_dlkm.ko
├── modules.load
├── msm_11ad_proxy.ko
├── native_dlkm.ko
├── pinctrl_wcd_dlkm.ko
├── platform_dlkm.ko
├── q6_dlkm.ko
├── q6_notifier_dlkm.ko
├── q6_pdr_dlkm.ko
├── sm8150.dtb
├── sm8150-v2.dtb
├── softdog.ko
├── stub_dlkm.ko
├── swr_ctrl_dlkm.ko
├── swr_dlkm.ko
├── System.map
├── unstripped
├── usf_dlkm.ko
├── videobuf2-memops.ko
├── videobuf2-vmalloc.ko
├── vmlinux
├── wcd934x_dlkm.ko
├── wcd9360_dlkm.ko
├── wcd9xxx_dlkm.ko
├── wcd_core_dlkm.ko
├── wcd_cpe_dlkm.ko
├── wcd_spi_dlkm.ko
├── wglink_dlkm.ko
├── wlan.ko
└── wsa881x_dlkm.ko

1 directory, 43 files

其中ko后缀文件是相关驱动文件,Image.lz4为内核文件
根据官方文档描述可以使用fastboot boot Image.lz4 使用这个文件引导系统启动(重启后失效)。但实际实际发现错误如下:

creating boot image...
creating boot image - 15556608 bytes
Sending 'boot.img' (15192 KB)                      OKAY [  0.500s]
Booting                                            FAILED (remote: 'Error verifying the received boot.img: Invalid Parameter')
fastboot: error: Command failed

也许该操作对于不同手机内核有一定要求。最后处理方案采样将内核打包进入boot.img中

boot.img

boot.img 会被刷入boot分区。boot.img包含内核以及通用的引导所需的必要tramfs文件系统。这个文件会在AOSP编译后产出。
我们大致看看这个文件的二进制结构

jack@jack:~/Desktop/bootdir$ file boot.img 
boot.img: Android bootimg, kernel (0x8000), ramdisk (0x1000000), page size: 4096, cmdline (console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on msm_rtb.filter=0x237 ehci-hcd.park=3 service_locator.ena)

在这里插入图片描述
我们可以利用网上众多工具将其解压。这里推荐一个开源库Android_boot_image_editor

将boot.img放在目录下自行gradlw unpack后会在build目录下得到解压的文件
在这里插入图片描述在这里插入图片描述
我们再其对应的目录查看其解压信息。
在这里插入图片描述
你可以修改任意的文件然后重打包成Boot.img.
再构建AOSP时有一个预构建的内核,比如flame构建Debug的内核位置/home/jack/Desktop/aosp/device/google/coral-kernel/Image.lz4。我们对比下boot.img中的内核MD5AOSPImage.lz4
在这里插入图片描述
所以你可以替换你所编译的内核再此处重新AOSP。那么你会再重新得到一个包含自定义内核新的boot.img。
这里使用别的方式刷入系统,Android_boot_image_editor支持重打包,我们将自定义的编译的内核改名为Kernal覆盖到其解包目录。然后调用./gradlew pack会得到一个替换内核的boot.img.
之后你可以使用 fastboot boot boot.img进行引导测试。

启动后你会发现手机无法触摸或者wifi有问题等。这问题是由于我们自定义内核和手机的驱动模块签名不符合导致的。
我们进入手机查看以下目录/vendor/lib/modules文件

130|flame:/vendor/lib/modules # ls
adsp_loader_dlkm.ko  modules.softdep      usf_dlkm.ko
apr_dlkm.ko          msm_11ad_proxy.ko    videobuf2-memops.ko
cs35l36_dlkm.ko      native_dlkm.ko       videobuf2-vmalloc.ko
ftm5.ko              pinctrl_wcd_dlkm.ko  wcd934x_dlkm.ko
heatmap.ko           platform_dlkm.ko     wcd9360_dlkm.ko
incrementalfs.ko     q6_dlkm.ko           wcd9xxx_dlkm.ko
lkdtm.ko             q6_notifier_dlkm.ko  wcd_core_dlkm.ko
machine_dlkm.ko      q6_pdr_dlkm.ko       wcd_cpe_dlkm.ko
mbhc_dlkm.ko         softdog.ko           wcd_spi_dlkm.ko
modules.alias        stub_dlkm.ko         wglink_dlkm.ko
modules.dep          swr_ctrl_dlkm.ko     wlan.ko
modules.load         swr_dlkm.ko          wsa881x_dlkm.ko

这些驱动模块来自vendor.img中的。
我们随便输出一个其中的文件的md5在这里插入图片描述
然后在vender.img解压后的目录对同一个文件查阅其md5
在这里插入图片描述
我们只需要将自定义的内核构建的ko文件拷贝

#解决方案来自参考文献
# 禁用 dm-verity
adb root
adb disable-verity
adb reboot
# 重新以 可读可写的 形式挂载分区
adb root
adb remount 
# push 到 vendor 分区对应的 内核模块的目录
cd ~/aosp/android-kernel/out/android-msm-pixel-4.14/dist/
adb push *.ko /vendor/lib/modules
adb reboot

# 建议之后重新开启dm-verity
adb enable-verity

解决方案来源
android-pixel4a-刷机系列-(3)内核下载并编译

这里还有一种解决方案,我们自定义内核的输出目录有一个initramfs.img,这个文件是一个内存文件系统。内部也包含了上面的ko文件,我们只需要也打入到boot.img的ramdfs中即可。
在这里插入图片描述
在这里插入图片描述

file initramfs.img 
initramfs.img: gzip compressed data, was "initramfs.cpio", last modified: Sun Jun 16 09:13:17 2024, from Unix, original size modulo 2^32 24428032

#解压后的目录查找所有驱动模块
 find lib -name *.ko 
lib/modules/kernel/fs/incfs/incrementalfs.ko
lib/modules/kernel/techpack/audio/dsp/usf_dlkm.ko
lib/modules/kernel/techpack/audio/dsp/codecs/native_dlkm.ko
lib/modules/kernel/techpack/audio/dsp/adsp_loader_dlkm.ko
lib/modules/kernel/techpack/audio/dsp/q6_dlkm.ko
lib/modules/kernel/techpack/audio/dsp/q6_pdr_dlkm.ko
lib/modules/kernel/techpack/audio/dsp/q6_notifier_dlkm.ko
lib/modules/kernel/techpack/audio/ipc/wglink_dlkm.ko
lib/modules/kernel/techpack/audio/ipc/apr_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/platform_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd9xxx_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd9360/wcd9360_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wsa881x_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd_spi_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/stub_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd_cpe_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd_core_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/wcd934x/wcd934x_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/mbhc_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/codecs/cs35l36_dlkm.ko
lib/modules/kernel/techpack/audio/asoc/machine_dlkm.ko
lib/modules/kernel/techpack/audio/soc/pinctrl_wcd_dlkm.ko
lib/modules/kernel/techpack/audio/soc/swr_dlkm.ko
lib/modules/kernel/techpack/audio/soc/swr_ctrl_dlkm.ko
lib/modules/kernel/drivers/input/touchscreen/heatmap.ko
lib/modules/kernel/drivers/watchdog/softdog.ko
lib/modules/kernel/drivers/media/v4l2-core/videobuf2-memops.ko
lib/modules/kernel/drivers/media/v4l2-core/videobuf2-vmalloc.ko
lib/modules/kernel/drivers/misc/lkdtm.ko
lib/modules/kernel/drivers/platform/msm/msm_11ad/msm_11ad_proxy.ko
lib/modules/extra/wlan.ko
lib/modules/extra/ftm5.ko

我们可以将整个initramfs.img解压后的目录拷贝到[Android_boot_image_editor]解压后的root下
在这里插入图片描述
然后再执行fastboot boot boot.img
然后在我的设备上出现如下错误:
在这里插入图片描述
解决方案:
重刷设备bootloader。这里你可以从Google官方下载factory image镜像中的bootloader.img。
在这里插入图片描述
对应命令如下:fastboot flash bootloader bootloader-flame-c2f2-0.5-8906123.img
刷入后重启进入bootloader再次引导boot.img即可。

验证内核

这招来自看雪https://bbs.kanxue.com/thread-277224.htm

为了验证我们的内核修改有效我们修改一个内核函数filp_close 这个函数会在我们应用层调用closefile的时候进行syscall触发。

int filp_close(struct file *filp, fl_owner_t id)
{
	int retval = 0;
	//假如此打印函数
	printk("invoke filp_close mykernal");

	if (!file_count(filp)) {
		printk(KERN_ERR "VFS: Close: file count is 0\n");
		return 0;
	}

	if (filp->f_op->flush)
		retval = filp->f_op->flush(filp, id);

	if (likely(!(filp->f_mode & FMODE_PATH))) {
		dnotify_flush(filp, id);
		locks_remove_posix(filp, id);
	}
	fput(filp);
	return retval;
}

上面修改输入手机执行命令查阅(dmesg是一个诊断命令)
adb root || adb shell dmesg | grep -i "mykernal"
在这里插入图片描述

参考信息

wsl编译android内核并刷入pixel4
Kernal modules
initramfs原理探讨
building-kernels
building-pixel-kernels``

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1850440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于AT89C52单片机的温度报警系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456321?spm=1001.2014.3001.5503 仿真构造:AT89C52+DS18B20温度模块+三按键+蜂鸣器+四位数码管显示+电源模块。 压缩包构造:源码+仿真图+设计文档+原理图+开题文档+元件…

Apple - Cryptographic Services Guide

本文翻译自:Cryptographic Services Guide(更新时间:2018-06-04 https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011172 文章目录…

Stable Diffusion部署教程,开启你的AI绘图之路

本文环境 系统:Ubuntu 20.04 64位 内存:32G 环境安装 2.1 安装GPU驱动 在英伟达官网根据显卡型号、操作系统、CUDA等查询驱动版本。官网查询链接https://www.nvidia.com/Download/index.aspx?langen-us 注意这里的CUDA版本,如未安装CUD…

Open WebUI – 本地化部署大模型仿照 ChatGPT用户界面

Open WebUI介绍: Open WebUI 是一个仿照 ChatGPT 界面,为本地大语言模型提供图形化界面的开源项目,可以非常方便的调试、调用本地模型。你能用它连接你在本地的大语言模型(包括 Ollama 和 OpenAI 兼容的 API)&#xf…

物理层(二)

2.2 传输介质 2.2.1 双绞线、同轴电缆、光纤和无线传输介质 传输介质也称传输媒体,是数据传输系统中发送器和接收器之间的物理通路。传输介质可分为:①导向传输介质,指铜线或光纤等,电磁波被导向为沿着固体介质传播:②)非导向传输介质&…

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞(六十三)

Python武器库开发-武器库篇之ThinkPHP 2.x 任意代码执行漏洞(六十三) PHP代码审计简介 PHP代码审计是指对PHP程序进行安全审计,以发现潜在的安全漏洞和风险。PHP是一种流行的服务器端脚本语言,广泛用于开发网站和Web应用程序。由…

Linux 内核权限提升漏洞CVE-2024-1086三种修复方法

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。一、漏…

任务3.8.4 利用RDD实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述:使用Spark RDD实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell4. 读取数据生成RDD5. 数据处理6. 计算TopN7. 输出结果8…

echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段

功能要求 1、折线图,展示每天对应的一个时间片段 2、echarts Y轴展示时间片段,如:[00:00,03:00,05:15] 3、X轴展示日期,如:[xx年xx月xx日] 后端返回的数据结构,如 [{xAdate:"2024-06-15",data:…

细说MCU的ADC模块单通道单次采样的实现方法

目录 一、工程依赖的硬件 二、设计目的 三、建立工程 1、配置GPIO 2、配置中断 3、配置串口 4、配置ADC 5、选择时钟源和Debug 6、配置系统时钟和ADC时钟 四、设置采样频率 五、代码修改 1、重定义外部中断回调函数 2、启动ADC 3、配置printf函数 六、运行并…

Java开发-面试题-0006-DELETE、VACUUM和TRUNCATE的区别

Java开发-面试题-0006-DELETE、VACUUM和TRUNCATE的区别 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术文) …

[论文阅读笔记31] Object-Centric Multiple Object Tracking (ICCV2023)

最近Object centric learning比较火, 其借助了心理学的概念, 旨在将注意力集中在图像或视频中的独立对象(objects)上,而不是整个图像。这个方法与传统的基于像素或区域的方法有所不同,它试图通过识别和分离图像中的各个对象来进行…

推出一系列GaN功率放大器: QPA2211、QPA2211D、QPA2212、QPA2212D、QPA2212T,支持卫星通信和5G基础设施。

推出用于支持支持卫星通信和5G基础设施的GaN功率放大器: QPA2211 QPA2211D QPA2212 QPA2212D QPA2212T QPA2211 10W GaN功率放大器是一款Ka波段功率放大器,采用0.15m碳化硅基氮化镓工艺 (QGaN15) 制造而成。该放大器的工作频率范围为27.5GHz至31GHz&…

Linux_内核缓冲区

目录 1、用户缓冲区概念 2、用户缓冲区刷新策略 3、用户缓冲区的好处 4、内核缓冲区 5、验证内核缓冲区 6、用户缓冲区存放的位置 7、全缓冲 结语 前言: Linux下的内核缓冲区存在于系统中,该缓冲区和用户层面的缓冲区不过同一个概念&#x…

【并发程序设计】总篇集 Linux下 C语言 实现并发程序

11_Concurrent_Programing 文章目录 11_Concurrent_Programing1.进程概念进程内容进程类型进程状态 2.进程常用命令进程信息命令top 命令进程信息表 进程优先级命令nice 命令renice 命令 后台进程命令 3.子进程创建子进程fork 函数 结束进程exit 函数_exit 函数 回收子进程wait…

MySQL性能问题诊断方法和常用工具

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。MySQL运…

如何监控巨量千川的违规行为

在这个瞬息万变的数字营销时代,每一分数据都蕴含着无限价值,尤其在电商领域,精准洞察与高效决策力已成为致胜关键。然而,面对巨量千川这一电商一体化智能营销平台的广阔天地,如何在海量信息中准确捕捉投放违规信息&…

如何避免vue的url中使用hash符号?

目录 1. 安装 Vue Router 2. 配置 Vue Router 使用 history 模式 3. 更新 main.js 4. 配置服务器以支持 history 模式(此处需要仔细测试) a. Nginx 配置 b. Apache 配置 5. 部署并测试 总结 在 Vue.js 项目中,避免 URL 中出现 # 符号的…

用 Rust 实现一个替代 WebSocket 的协议

很久之前我就对websocket颇有微词,它的确满足了很多情境下的需求,但是仍然有不少问题。对我来说,最大的一个问题是websocket的数据是明文传输的,这使得websocket的数据很容易遭到劫持和攻击。同时,WebSocket继承自HTTP…

yocto系列讲解[实战篇]94 - 添加libhybris库和测试示例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 1. 概述2. 添加libhybris的recipe3.libhybris编译4.libhybris测试5.自制Android C++动态库6.自制Android C++动态库编译7.创建testhyb…