Android Kernel 编译与调试指北

这篇具有很好参考价值的文章主要介绍了Android Kernel 编译与调试指北。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Kernel 编译与调试指北

环境

本指北基于以下代码和环境编写

OS     :  Ubuntu 22.04.2 LTS
AOSP   :  master
kernel :  根据编译目标决定
target : aosp_cf_x86_64_phone-userdebug
设备    : Cuttlefish

在前一篇文章说过,因为工具链的原因,AOSP的代码不宜太旧,自上一篇文章以来Cuttlefish的功能和文档逐步健全,足以见得google对其的投入程度,所以如果版本不一样会遇见无此参数等这样那样的问题,本文在master上测试通过。

Android Kernel Repo的源码下载

Linux Kernel是Android系统运行的基础,而Linux Kernel的源码在AOSP中并不存在,通常存在的是预构建的内核映像,如果想对内核做一些定制化的修改,就需要下载代码并构建,Linux Kernel像AOSP有各种各样的分支,并不是随便选择一个分支构建就可以正常运行。编译AOSP对应的Linux Kernel版本才能避免构建过程走很多弯路。每一个AOSP构建目标都预置了预编译的内核映像,可以从内核影像中获取相应版本的蛛丝马迹。

需要说明的是Android的内核项目同样是由repo(android.googlesource.com/kernel/mani…) 管理的,其中Linux Kernel的源码存在于kernel/common(android.googlesource.com/kernel/comm…) 目录下,其他目录是与构建相关的工具链或者脚本等,在之前旧版本Linux Kernel构建中可以直接下载kernel/common的代码使用make直接编译出内核镜像,但是随着Android GKI的推出,这套方法就行不通了。读者最好使用repo提供的编译脚本等进行构建。

下面以aosp_cf_x86_64_phone-userdebugtarget为例,讲述如何一步步找到对应的分支

查找Linux Kernel的version和commitId

从Android设置界面查找

如果你编译的系统已经成功运行到虚拟机,你可以打开Settings - About Phone - Android Version -Kernel Version 可以看到对应的Kernel信息,Linux的版本号按照major.minor.patch-build.desc的格式,通过匹配屏幕输出可以得出内核版本为6.1,从附加描述中提取g开头的连续字符可以得知对应的commitId为963667856ef1

android kernel,android

从AOSP树中查找

如果只有一个构建目标(aosp_cf_x86_64_phone-userdebug)并没有运行成功虚拟机,可以遵循以下步骤获取。

  1. 索引到device/google/cuttlefish目录,device目录下存放了芯片和硬件厂商的相关产品配置,其中cuttlefish作为一款虚拟器,也被添加到了该目录下。
  2. 通过mgrep ":kernel"查看配置文件(该方法不是很通用,可以通过“添加新设备”了解相关知识),最后查看搜索到的配置文件,通过下图可以看到该目标链接的kernel映像文件位于kernel/prebuilts/6.1/x86_64/kernel-6.1
  3. 对该文件执行file kernel-6.1得到以下输出,同样可以得到commmitId为963667856ef1
kernel-6.1: Linux kernel x86 boot executable bzImage, version 6.1.25-android14-7-00377-g963667856ef1-ab10271074 (build-user@build-host) #1 SMP PREEMPT Tue Jun  6 23:03:20 UTC 2023, RO-rootFS, swap_dev 0X10, Normal VGA

android kernel,android

根据分支拉取Kernel代码

通过上面的操作得到了Linux Kernel的版本和commitId,准备就绪就可以着手拉取代码了,需要注意上文获取的commitId是指android.googlesource.com/kernel/comm… 仓库的相应提交。

根据kernel/common的commitId找到对应repo分支

直接访问android.googlesource.com/kernel/comm… (注意按照实际输出更改commitId) 就可以得到对应的changeId,通过点击changeId链接就可以看到对应gerrit 地址,如下所示,该页面同时标注了Linux kernel的分支[android14-6.1], 这里的branch还是Linux Kernel的分支,那么如何得到repo的分支内,只有了,通过在 android.googlesource.com/kernel/mani… 中搜索6.1找到了多个结果,通过依次查看该分支下的default.xml文件,发现common-android14-6.1分支下指向了Linux Kernel的android14-6.1分支,代码如下<project path="common" name="kernel/common" revision="android14-6.1" />

android kernel,androidandroid kernel,android

拉取Kernel代码

使用从上文得到的kernel的repo分支,使用repo下载Linux Kernel的源码和脚本等

mkdir android-kernel && cd android-kernel
repo init -u https://android.googlesource.com/kernel/manifest -b common-android14-6.1
repo sync

如果一切OK,代码就下载好了,如果你遇见了任何网络问题,可以参照上一篇文章设置镜像源下载。

Bazel编译Kernel

Android11引入了GKI的特性,用于将内核拆分为由 Google 维护的内核映像和由供应商维护的模块,两个模块分别构建。Android13开始使用Bazel进行编译,由于构建的分支是master分支,所以内核的编译需要使用bazel进行构建,并且需要分别构建两个内核。

//通用内核镜像的构建
$ tools/bazel run //common:kernel_x86_64_dist -- --dist_dir=out
//因为是虚拟机,所以是虚拟的设备GKI virtual_device
$ tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist -- --dist_dir=out

以上如果构建没有问题,在out目录下会生成bzImageinitramfs.img文件,请记住他们的位置,之后会用到

Cuttlefish 应用新内核

使用kernel_path和initramfs_path即可对Cuttlefish应用新内核,十分方便,需要注意launch_cvd的运行基于上一篇文章编译成功,在AOSP根目录下运行

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd -kernel_path /home/prosixe/ssd/Android/android-kernel/out/bzImage -initramfs_path /home/prosixe/ssd/Android/android-kernel/out/initramfs.img 

android kernel,android

通过查看系统信息,内核已经发生了改变,系统可以正常开机

使用GDB调试Kernel

使用下面命令使内核可调试,读者实操时注意要区分aosp和android-kernel的目录。

//注意在aosp根目录
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd -kernel_path /home/prosixe/ssd/Android/android-kernel/out/bzImage -initramfs_path /home/prosixe/ssd/Android/android-kernel/out/initramfs.img -gdb_port 1234 -cpus=1  -extra_kernel_cmdline nokaslr

然后在另一个终端索引到android-kernel/common方便gdb索引到符号

//切换android-kernel根目录
cd common
gdb ../out/vmlinux
(gdb) target remote :1234
(gdb) hbreak start_kernel
(gdb) c

android kernel,android 可以看到内核在start_kernel时停止了,并且可以正常显示对应的源代码。

总结

经过一步步的摸索,将Linux内核成功运行到了Cuttlefish中,在Cuttlefish的环境下,可以调试内核,调试Native代码,调试Framework代码,也可以当作你的常用“开发机”使用。
该文章是笔者学习中的一个总结,由于知识面的狭隘总有认识不到的错误产生,请大家不吝赐教。如果大家学习中遇见问题,也欢迎大家交流沟通。文章来源地址https://www.toymoban.com/news/detail-784139.html

到了这里,关于Android Kernel 编译与调试指北的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SA8295P 源码分析】20 - GVM Android Kernel NFS Support 配置

    【源码分析】 因为一些原因,本文需要移除, 对于已经购买的兄弟,不用担心,不是跑路, 我会继续持续提供技术支持, 有什么模块想学习的,或者有什么问题有疑问的, 请私聊我,我们 +VX 沟通技术问题,一起学习,一起进步 接下来,我一一私聊已经购买的兄弟添加V

    2024年02月12日
    浏览(45)
  • ubuntu编译kernel

    使用的是ubuntu 22.04 本来的kernel:5.19.0-38-generic 编译kernel 5.19 使用虚拟机要注意存储空间的变化,避免内存爆掉。 需要先安装配置环境 下载和kernel同版本的源码。 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.19.tar.gz 将自带的配置文件copy到解压的源码的顶层Makefil

    2024年02月02日
    浏览(32)
  • 编译RHEL 8.7 kernel 并重新安装

    背景:最近遇到一个bug,需要修改 RHEL 8.7 kernel config 的配置参数,然后重新安装该kernel。踩过一些坑,复盘整理。 这是当前运行的内核版本。版本号的不同部分表示以下信息: • 4.18.0: 内核的主版本号、次版本号和发布版本号。 • 477.15.1.el8_8: 补丁级别和发行版本信息。 •

    2024年02月15日
    浏览(40)
  • ARM Linux 调试 -QEMU启动 Uboot/Kernel/Rootfs

    懒人方式: 直接去方锐/qemu克隆项目,执行script目录的脚本即可 1. build_env.sh安装环境 2. build_rootfs.sh 生成rootfs 3. build_kernel.sh编译kernel 4. qemu_run.sh开始调试 2.1busybox代码的下载编译 Busybox下载地址:https://busybox.net/downloads/ Download 1.36.0 Busybox 默认会安装到 ./_install 目录下 制作ro

    2024年02月02日
    浏览(61)
  • 基于VSCode的Linux内核调试环境搭建以及start_kernel跟踪分析

    参考ppt的步骤: 准备工作:1-5 ,配置vscode环境:6 ,跟踪分析:7。 目录 1.安装开发工具  2.下载内核源码  3.配置内核选项 4.编译和运行内核 5.制作内存根文件系统 *gdb调试(可跳过)  7.配置VSCode调试Linux内核  7.跟踪分析 下载出现了“Axel -n 20 :太多重定向”的问题,原因是

    2023年04月17日
    浏览(63)
  • 【RV1126 学习】SDK/ U-Boot/kernel/rootfs 编译学习

    RV1126 是 Rockchip 推出的一款编解码芯片,CPU 为 4 核 ARM Cortex-A7 32 位,专用于面向人工智能的机械视觉领域,支持 4K 编解码,支持 8 路 1080P 同时进行编解码,内置 2.0TOPS的 NPU。像这种专用芯片,芯片厂商都会给出芯片的 SDK 包进行二次开发,用它来开发有很多好处,比如:不用

    2024年02月02日
    浏览(54)
  • Linux驱动编译报错ERROR: Kernel configuration is invalid怎么办

    Linux驱动编译报错ERROR: Kernel configuration is invalid怎么办 报错信息 RROR: Kernel configuration is invalid. include/generated/autoconf.h or include/config/auto.conf are missing. Run ‘make oldconfig make prepare’ on kernel src to fix it. WARNING: Symbol version dump ./Module.symvers is missing; modules will have no dependencies and modversi

    2024年02月11日
    浏览(61)
  • IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

    目录 linux开发板启动流程 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用  安装内核和模块到开发板上  Bootloader 介绍 编译 u-boot 镜像 Reset--ROM--bootloader--kernel+dtb--rootfs--AP

    2024年01月22日
    浏览(45)
  • 编译正点原子kernel报错make: arm-linux-gnueabihf-gcc:命令未找到

    需要在 Makefile 添加完整路径内容: 解决办法:

    2024年02月02日
    浏览(44)
  • Android12 源码下载、编译、刷机、单编调试Framework

    深入学习Android系统框架开发前,首先要搭建Android工程的开发环境(建房子前先搞地基),详细的配置要求和操作步骤见官网说明 Establishing a build environment,本文也汇总了Android 12工程源码的下载、编译和刷机的实操过程。 在开始代码下载之前,先强调下源码编译对硬件/软件

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包