-
Notifications
You must be signed in to change notification settings - Fork 4
12.适配部分4.14内核简要提示
理论上,这个教程适合EMUI 10的4.14内核设备。
前清提要:适配4.9内核
由于EMUI10内核对编译设备提高了要求,所以我建议高配电脑用户尝试。
配置需求:
Linux发行版:Ubuntu 22.04
CPU:建议4核心
RAM:视情况而定,建议16GB起步。推荐32GB。(如果是虚拟机,那肯定就直接内存翻倍然后再分配对应的内存大小。)
SSD:512GB足够。
显卡:核显,亮机卡或者更高。
为什么会要求如此高的内存?因为华为开启了CONFIG_LTO
和CONFIG_LTO_CLANG
。
你可以关闭这两个编译标记,但是理所当然内核优化会变差。好处是编译内存要求变低,8GB内存都够。
开启了编译会很慢,然后内存占用会慢慢膨胀到最高29GB左右。直到编译完成。
这里单刀直入:
defconfig修改和4.9的区别不大。
参考:defconfig:disable some useless features
手动集成KSU:KernelSU:integrate KernelSU for non GKI
由于KernelSU不再官方支持non-GKI内核,所以你只能使用最后支持non-GKI内核的v0.9.5代码:
警告:由于KernelSU不再维护non-GKI内核,最后支持non-GKI内核的KernelSU代码版本为v0.9.5!!!
但是因为兼容性问题,只能使用v0.9.2的源代码和管理器。都不要升级,升级了就不兼容大多数模块。
由于KernelSU修改了运行机制,华为EMUI 10设备无法使用高于此commit后的所有代码。
这意味着你只能降级KernelSU代码到v0.9.2(11682)。你不能使用4.9内核的同步KernelSU的命令直接同步。
你需要换用此命令:
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s v0.9.2
然后修改KernelSU代码兼容EMUI10:
参考: 修复华为海思SoC设备部分兼容性补丁:kernel:Add Huawei hisi check
修改KSU代码修复内核重启后导致root授权失效:kernel: fix filp_open on older kernel's kworker #205
编译部分:
- 谷歌的GCC,Clang交叉编译器
+ [AArch64交叉编译器_安卓10版本](https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/+archive/84fb09fafc92a3d9b4d160f049d46c3c784cc941.tar.gz) + [ARM交叉编译器_安卓10版本](https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/+archive/5a8beef7b1aa2c8ca0dfe4a00358559d12dfa3b6.tar.gz) + [Google Clang 安卓10版本](https://android.googlesource.com/platform//prebuilts/clang/host/linux-x86/+archive/3f889f9c9d42bae85728fa89ba5f92a01704fd83.tar.gz)
- 依赖库:
基本和4.9区别不大。
可以安装ccache增加编译效率。
sudo apt install ccache -y
- 编译命令:
// 交叉编译器路径,根据自己实际路径填写 export PATH=$PATH:$(pwd)/../Compiler/Google/GCC64/bin:$(pwd)/../Compiler/Google/Clang/clang-r346389c/bin // Find those flag in Makefile!!! // 这两个标记请在Makefile内寻找!!!AOSP编译标记,也是交叉编译器路径,根据自己实际路径填写 export CLANG_PREBUILTS_PATH=$(pwd)/../Compiler/Google/Clang/clang-r346389c/ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/../Compiler/Google/Clang/clang-r346389c/lib64/ export CROSS_COMPILE=aarch64-linux-android- export ARCH=arm64 make ARCH=arm64 O=out CC="ccache clang" merge_kirin970_ksu_defconfig // 定义编译线程数 make ARCH=arm64 O=out CC="ccache clang" -j$(nproc --all)
- 打包命令:
基本和4.9区别不大。
对于部分华为开源的源码有编译错误,错误显示:../security/selinux/include/classmap.h:247:2: error: New address family defined, please update secclass_map.
,参考此patch:
---
scripts/selinux/genheaders/genheaders.c | 1 -
scripts/selinux/mdp/mdp.c | 1 -
security/selinux/include/classmap.h | 1 +
3 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/scripts/selinux/genheaders/genheaders.c b/scripts/selinux/genheaders/genheaders.c
index 1ceedea847dd..544ca126a8a8 100644
--- a/scripts/selinux/genheaders/genheaders.c
+++ b/scripts/selinux/genheaders/genheaders.c
@@ -9,7 +9,6 @@
#include <string.h>
#include <errno.h>
#include <ctype.h>
-#include <sys/socket.h>
struct security_class_mapping {
const char *name;
diff --git a/scripts/selinux/mdp/mdp.c b/scripts/selinux/mdp/mdp.c
index 073fe7537f6c..6d51b74bc679 100644
--- a/scripts/selinux/mdp/mdp.c
+++ b/scripts/selinux/mdp/mdp.c
@@ -32,7 +32,6 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-#include <sys/socket.h>
static void usage(char *name)
{
diff --git a/security/selinux/include/classmap.h b/security/selinux/include/classmap.h
index bd5fe0d3204a..201f7e588a29 100644
--- a/security/selinux/include/classmap.h
+++ b/security/selinux/include/classmap.h
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0 */
#include <linux/capability.h>
+#include <linux/socket.h>
#define COMMON_FILE_SOCK_PERMS "ioctl", "read", "write", "create", \
"getattr", "setattr", "lock", "relabelfrom", "relabelto", "append", "map"
--
2.20.1
逆天华为增加了镜像校验,无法关闭。
只能通过安装先Magisk然后dd if= of=
的形式安装。最后卸载Magisk。
甚至不如直接用Magisk.
具体操作:
adb push kernel.img /sdcard/Download/ // 假设你编译好的KSU内核就叫kernel.img
adb shell
su // 在Magisk内允许shell的su权限
cd /sdcard/Download/
dd if=kernel.img of=/dev/block/by-name/kernel // 替换默认内核
如何替换回默认内核?Fastboot里面直接刷。但是自己编译的就要这么搞。
由于华为修改了Linux内核调度器,新版KernelSU(高于v0.9.2主代码以后的代码)代码将无法正常工作,会出现找不到KSU管理器的bug。
由于华为魔改安卓系统,所以大量依赖Zygisk或者其他特性的模块无法正常工作。
已知兼容:
- ZygiskNext
- LSPosed
- PlayIntegrityFix
已知不兼容:
- 幸运破解器的Xposed工作模式
- Magic_OverlayFS
- 几乎所有的调度模块
- 几乎所有的音效模块
综合上述,几乎不值得。
KernelSU在EMUI 10的唯一优势只有隐藏root。没了。
Bug多,兼容性差,安装麻烦。可以说是完全不推荐。
如果想规避华为恶心的ROOT检查之类,完全可以编译去除华为ROOT检查的内核,忽略KSU。
然后安装Magisk。
最后,其实KernelSU在EMUI 10的唯一优势马上也没了。360加固企业版可以完美检测KSU,然后KSU 1.0.0正式版马上就要推出,
KernelSU官方决定去除所有的non-GKI支持(也就是说低于5.10以下的内核被统统放弃了。)。
所以不如直接自定义内核+Magisk或者Magisk就行了。