本文是系列文章的第一篇,旨在分享我的 Android 内核探索经历、个人笔记和见解。我将主要关注如何修改内核,以便更深入地分析系统上运行的应用程序。需要注意的是,距离我上次接触 Android 内核——上次是在我那台老旧的三星 Galaxy 手机上编译并运行模块——已经过去很久了。不出所料,从那以后,很多事情发生了变化,在撰写后续文章的过程中,这将是一个重新发现和学习的过程。如果我犯了任何错误,或者您有任何建议,请随时联系我们。事不宜迟,让我们一起踏上这段旅程吧!
在 Android 文档中https://source.android.com/docs/core/architecture/kernel/android-common,您还可以找到每个 Android 版本支持的内核列表,分为启动内核和功能内核 。启动内核是特定 Android 版本设备发布的有效内核,而功能内核则确保特定版本功能的实现,防止这些功能被反向移植到早期的内核版本。
我们测试的内核版本是 android13–5.15 。Android 内核分支的组织方式反映了 Android 版本和对应的内核版本,格式为 ANDROID_RELEASE-KERNEL_VERSION ,其中 ANDROID_RELEASE 代表 Android 版本, KERNEL_VERSION 代表内核版本。例如,android13–5.15 内核对应的是 Android 13 的内核版本 5.15。我们使用以下命令下载 Android 内核。
mkdir android-kernel && cd android-kernelrepo init -u https://android.googlesource.com/kernel/manifest -b common-android13-5.15repo sync -c -j4
load("//build/kernel/kleaf:common_kernels.bzl", "define_common_kernels", "define_db845c")
###POST_DEFCONFIG_CMDS="check_defconfig"
kernel_build( name = "virtual_device_x86_64", srcs = [":virtual_device_x86_64_common_sources"], outs = [], base_kernel = "//common:kernel_x86_64", build_config = "build.config.virtual_device.x86_64", module_outs = _virt_common_modules + [# keep sorted"test_meminit.ko","test_stackinit.ko", ],)
PRE_DEFCONFIG_CMDS="KCONFIG_CONFIG=${ROOT_DIR}/${KERNEL_DIR}/arch/x86/configs/${DEFCONFIG}${ROOT_DIR}/${KERNEL_DIR}/scripts/kconfig/merge_config.sh -m -r ${ROOT_DIR}/${KERNEL_DIR}/arch/x86/configs/gki_defconfig ${ROOT_DIR}/common-modules/virtual-device/virtual_device.fragment"
CONFIG_FUNCTION_TRACER=yCONFIG_FUNCTION_GRAPH_TRACER=yCONFIG_STACK_TRACER=yCONFIG_DYNAMIC_FTRACE=y
tools/bazel build //common:kernel_x86_64_disttools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist
Cuttlefish 配置正确后,我们可以使用以下命令测试新编译的内核。相关参数可以根据需要进行调整。
HOME=${PWD} ./bin/launch_cvd -daemon -memory_mb 27000 -data_policy always_create -blank_data_image_mb 30000 -cpus 1 --kernel_path=/home/thiago/android-kernel/out/android13-5.15/dist/bzImage -initramfs_path=/home/thiago/android-kernel/out/android13-5.15/dist/initramfs.img
结论
总而言之,本文概述了编译和修改 Android 内核,以及如何在 Cuttlefish 中执行测试以验证其功能的关键步骤。这为在虚拟化环境中定制 Android 内核奠定了基础。在接下来的文章中,我们将探讨高级内核调试技术,并演示如何定制内核以收集有关系统上运行的应用程序的详细信息。
参考
https://2net.co.uk/blog/cuttlefish-android12.html?source=post_page-----d20af6f2080a---------------------------------------
https://source.android.com/docs/setup/build/building-kernels?source=post_page-----d20af6f2080a---------------------------------------
https://source.android.com/docs/core/tests/debug/ftrace?source=post_page-----d20af6f2080a---------------------------------------
原文始发于微信公众号(Ots安全):Android 内核历险记:深入了解编译、定制和应用程序分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论