一、ACK代码下载

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

如需查看可与之前的“repo init”命令搭配使用的 repo 分支 (BRANCH) 列表,请参阅内核分支及其构建系统

本文将以android15-6.6的内核代码为例作为演示:

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

二、ACK编译

2.1 使用 Bazel (Kleaf) 构建

tools/bazel build //common:kernel_aarch64_dist

2.2 使用 build.sh(旧版)构建

build/build.sh

{% tip success %}

注意通用内核是通用的可自定义内核,因此不会定义默认配置。如需了解如何为通用内核指定 build 配置,请参阅自定义内核 build。例如,如需为 aarch64 平台构建 GKI 内核,请运行以下命令:
$ BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

{% endtip %}

2.3 android15-6.6 ack编译

tools/bazel build //common:kernel_aarch64_dist

三、更改KMI接口

在使用了GKI的项目中,当我们使用的一些函数没有在KMI接口中放出来,此时我们需要更改ack的abi并提交给google,比如我收到了这样的请求,需要向google申请白名单(mmc_set_blocklen和nr_free_buffer_pages函数)

3.1 修改android/abi_gki_aarch64_xiaomi

diff --git a/android/abi_gki_aarch64_xiaomi b/android/abi_gki_aarch64_xiaomi
index 1d10d4f..f102702 100644
--- a/android/abi_gki_aarch64_xiaomi
+++ b/android/abi_gki_aarch64_xiaomi
@@ -97,6 +97,8 @@
   __tracepoint_android_vh_mem_cgroup_charge
   __tracepoint_android_vh_filemap_add_folio
   __tracepoint_android_vh_shrink_node
+  mmc_set_blocklen
+  nr_free_buffer_pages
 
 #required by metis.ko module
   __traceiter_android_vh_rwsem_read_wait_start

3.2 更新abi

tools/bazel run //common:kernel_aarch64_abi_update

3.3 提交代码

在执行完成第3.2步骤后,android/目录下会出现一个文件的改动(xml或者是stg文件)

diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg
index 093b3bee1c23..9abc368f6d92 100644
--- a/android/abi_gki_aarch64.stg
+++ b/android/abi_gki_aarch64.stg
@@ -340138,6 +340138,12 @@ function {
   parameter_id: 0x4585663f
   parameter_id: 0x3e10b518
 }
+function {
+  id: 0x9c0fbfcd
+  return_type_id: 0x6720d32f
+  parameter_id: 0x026525e9
+  parameter_id: 0x4585663f
+}
 function {
   id: 0x9c0ff674
   return_type_id: 0x6720d32f
@@ -398549,6 +398555,15 @@ elf_symbol {
   type_id: 0x9326478c
   full_name: "mmc_send_tuning"
 }
+elf_symbol {
+  id: 0x0654cb12
+  name: "mmc_set_blocklen"
+  is_defined: true
+  symbol_type: FUNCTION
+  crc: 0x74d61bc3
+  type_id: 0x9c0fbfcd
+  full_name: "mmc_set_blocklen"
+}
 elf_symbol {
   id: 0xa466e3d3
   name: "mmc_set_bus_mode"
@@ -399960,6 +399975,15 @@ elf_symbol {
   type_id: 0x4585663f
   full_name: "nr_cpu_ids"
 }
+elf_symbol {
+  id: 0xb8d3aa55
+  name: "nr_free_buffer_pages"
+  is_defined: true
+  symbol_type: FUNCTION
+  crc: 0x27fa66e1
+  type_id: 0x31accd53
+  full_name: "nr_free_buffer_pages"
+}
 elf_symbol {
   id: 0x1cfcf940
   name: "nr_ipi_get"
@@ -433319,6 +433343,7 @@ interface {
   symbol_id: 0xd0f0d35f
   symbol_id: 0xfb31b7b7
   symbol_id: 0xfe0604fe
+  symbol_id: 0x0654cb12
   symbol_id: 0xa466e3d3
   symbol_id: 0x836750b8
   symbol_id: 0x1398d9e3
@@ -433475,6 +433500,7 @@ interface {
   symbol_id: 0xe3b94e5f
   symbol_id: 0x16059afd
   symbol_id: 0x1560f116
+  symbol_id: 0xb8d3aa55
   symbol_id: 0x1cfcf940
   symbol_id: 0x3704ac3f
   symbol_id: 0xea37502b

android/abi_gki_aarch64.stgandroid/abi_gki_aarch64_xiaomi文件提交到google

git add android/abi_gki_aarch64_xiaomi android/abi_gki_aarch64.stg
git commit -s
git push aosp HEAD:refs/for/android15-6.6

commit的信息模板如下:

ANDROID: GKI: update symbol list file for xiaomi

2 function symbol(s) added
  'int mmc_set_blocklen(struct mmc_card*, unsigned int)'
  'unsigned long nr_free_buffer_pages()'

bug:xxxxxx

Change-Id: I4bbb6d359d36e3ff768ea2ef0485a9d9f74b7620
Signed-off-by: p-liuqi1 <p-liuqi1@xiaomi.com>

中间显示的 “2 function symbol(s) added”这部分,是由第3.2步骤的abi_update的更新的输出结果得来的。