大部分安卓内核并不难,基本上没有多少个博客说清楚参数怎么填
大部分内核参照build.config.aarch64,build.config.common里面的参数基本上可以编译成功
对于非gki内核
以联想l79031的源码举例:
aarch64-linux-gnu本机自带
aarch64-linux-android地址:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
arm-linux-android地址:https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
llvm地址:https://github.com/llvm/llvm-project
build.config.aarch64文件内容
ARCH=arm64
CLANG_TRIPLE=aarch64-linux-gnu-
CROSS_COMPILE=aarch64-linux-androidkernel-
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
FILES="
arch/arm64/boot/Image.gz
vmlinux
System.map
build.config.common文件内容
BRANCH=android-4.19-q
KERNEL_DIR=common
CC=clang
CLANG_PREBUILT_BIN=prebuilts-master/clang/host/linux-x86/clang-r365631c/bin
EXTRA_CMDS=''
STOP_SHIP_TRACEPRINTK=1
LD=ld.lld
我们需要的脚本大概是这样的
#!/bin/bash
#环境变量
source $PWD/../envpath/envset.sh
#LLVM环境变量
export PATH=$PWD/../envpath/llvm10/bin:$PATH
#编译参数
args=(-j$(nproc --all)
O=out
ARCH=arm64
CLANG_TRIPLE=aarch64-linux-gnu-
CROSS_COMPILE=aarch64-linux-android-
CROSS_COMPILE_ARM32=arm-linux-androideabi-
CC=clang
AR=llvm-ar
NM=llvm-nm
OBJCOPY=llvm-objcopy
OBJDUMP=llvm-objdump
STRIP=llvm-strip
DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod
DTC_OVERLAY_TEST_EXT=ufdt_apply_overlay
CONFIG_BUILD_ARM64_DT_OVERLAY=y
)
#清理旧的构建
make ${args[@]} mrproper
#定义默认配置
make ${args[@]} moba_defconfig
#开始编译
make ${args[@]} Image.gz-dtb modules
#生成modules_install
make ${args[@]} INSTALL_MOD_PATH=modules modules_install
为什么内核文件配置显示的是CROSS_COMPILE=aarch64-linux-androidkernel-,而我的配置却是CROSS_COMPILE=aarch64-linux-android-,因为他们两个是同一个工具链
source $PWD/../envpath/envset.sh Fedora不支持proton-clang所以默认使用谷歌的编译环境
CC=clang 使用clang作为编译器
下面的是使用llvm的工具链接而不是系统的,防止打包内核的时候链接错误而导致不能生成内核
O=out将编译内容输出到out目录
AR=llvm-ar
NM=llvm-nm
OBJCOPY=llvm-objcopy
OBJDUMP=llvm-objdump
STRIP=llvm-strip
DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod 我的本机的depmod生成6.0以下内核的modeles.dep文件
make ${args[@]} moba_defconfig生成默认配置配置,配置文件在arch/arm64/configs里面不知道的话可以到里面去看。
make ${args[@]}展开来是这样的
make -j$(nproc --all) O=out ARCH=arm64 CLANG_TRIPLE=aarch64-linux-gnu- CROSS_COMPILE=aarch64-linux-android- CROSS_COMPILE_ARM32=arm-linux-androideabi- CC=clang AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump STRIP=llvm-strip DEPMOD=$PWD/../envpath/build/build-tools/path/linux-x86/depmod DTC_OVERLAY_TEST_EXT=ufdt_apply_overlay CONFIG_BUILD_ARM64_DT_OVERLAY=y
写成数组的方式比较好阅读,也比较美观。
关于为什么按照官方的方法编译KernelSU,为什么会出现各种各样的问题,对于gki内核推推荐用官方的方法,而非gki内核不推荐用KPROBES,推荐手动修补源码虽然麻烦,但是出现问题也比较少。可以参考官方的修补教程。
我的github有内核可以参考一下对应的文件,https://github.com/xiaoxian8/kernel_xiaomi_gauguin
按照官方的教程修补完成以后基本上可以bash build.sh构建内核了。
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.9.5
bash build.sh
以下是按照修补KernelSU示例
static int __do_execve_file(int fd, struct filename *filename,
...
...
...
...
out_files:
if (displaced)
reset_files_struct(displaced);
out_ret:
if (filename)
putname(filename);
return retval;
}
extern bool ksu_execveat_hook __read_mostly; //修补KernelUu内容
extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv,
void *envp, int *flags);
extern int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr,//修补kernelSU内容
static int do_execveat_common(int fd, struct filename *filename,
struct user_arg_ptr argv,
struct user_arg_ptr envp,
int flags)
...
...
以下是编译完成大概的样子
内核在out/arch/arm64/boot,
接下来用Anykernel3打包就可以了
对于gki内核
以android14-6.1为例
build.config.aarch64内容
ARCH=arm64
MAKE_GOALS="
Image
modules
"
FILES="
arch/arm64/boot/Image
vmlinux
System.map
vmlinux.symvers
modules.builtin
modules.builtin.modinfo
"
NDK_TRIPLE=${AARCH64_NDK_TRIPLE}
build.config.common内容
. ${ROOT_DIR}/${KERNEL_DIR}/build.config.constants
KMI_GENERATION=11
LLVM=1
DEPMOD=depmod
CLANG_PREBUILT_BIN=prebuilts/clang/host/linux-x86/clang-${CLANG_VERSION}/bin
BUILDTOOLS_PREBUILT_BIN=build/kernel/build-tools/path/linux-x86
DTC=${ROOT_DIR}/${BUILDTOOLS_PREBUILT_BIN}/dtc
KCFLAGS="${KCFLAGS} -D__ANDROID_COMMON_KERNEL__"
EXTRA_CMDS=''
STOP_SHIP_TRACEPRINTK=1
IN_KERNEL_MODULES=1
DO_NOT_STRIP_MODULES=1
HERMETIC_TOOLCHAIN=${HERMETIC_TOOLCHAIN:-1}
build.config.constants内容
BRANCH=android14-6.1
CLANG_VERSION=r487747c
AARCH64_NDK_TRIPLE=aarch64-linux-android31
X86_64_NDK_TRIPLE=x86_64-linux-android31
ARM_NDK_TRIPLE=arm-linux-androideabi31
编译脚本build.sh内容
#!/bin/bash
#LLVM环境变量
export PATH=$PWD/../envpath/llvm20/bin:$PATH
#构建参数
args=(-j$(nproc --all)
O=out
ARCH=arm64
NDK_TRIPLE=aarch64-linux-android31
LLVM=1
DEPMOD=depmod
DTC=/usr/bin/dtc)
#清理旧的构建
make ${args[@]} mrproper
#定义默认配置
make ${args[@]} gki_defconfig
#开始编译
make ${args[@]} Image.lz4 modules
#生成modules_install
make ${args[@]} INSTALL_MOD_PATH=modules modules_install
gki内核不需要修补内核,直接编译即可
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
bash build.sh
编译成功大概是这样的
谢谢您的阅读,有其他看法欢迎在评论区留言。
本文为原创文章,作者:[唐小贤],首发于U社区。
版权声明:
转载请注明以下信息:
- 作者:糖小贤
- 原文链接:https://haouou.cn/forum-post/348.html
- 联系方式:an7788yy@163.com
说明:未经授权禁止转载,尊重原创内容是对作者最大的支持
暂无评论内容