内核源码

NGK支持AOSP、MIUI

1
git clone https://github.com/mkr-0920/NGK_android_kernel_xiaomi_sm8250.git

编译链

clang

proton-clang

nexus-clang

neutron-clang

gcc

los-gcc-4.9-64

los-gcc-4.9-32

gcc-4.9-aosp-64

gcc-4.9-aosp-32

这里使用proton-clang

内核配置

1
2
3
#打开到内核目录
git clone https://github.com/mkr-0920/lxc-docker-support-for-android.git utils
echo 'source "utils/Kconfig"' >> Kconfig

在arch/arm64/configs/xxxx_defconfig 中加入以下内容

1
2
# CONFIG_ANDROID_PARANOID_NETWORK is not set
CONFIG_DOCKER=y

补丁

参照utils下的补丁文件进行修改,fix_cgroup.patch,fix_panic.patch 主要修改以下这两个文件 kernel/cgroup/cgroup.c net/netfilter/xt_qtaguid.c

1
2
3
4
5
6
7
8
9
10
11
12
13
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -3786,6 +3786,10 @@ static int cgroup_add_file(struct cgroup_subsys_state *css, struct cgroup *cgrp,
cfile->kn = kn;
spin_unlock_irq(&cgroup_file_kn_lock);
}
+ if (cft->ss && (cgrp->root->flags & CGRP_ROOT_NOPREFIX) && !(cft->flags & CFTYPE_NO_PREFIX)) {
+ snprintf(name, CGROUP_FILE_NAME_MAX, "%s.%s", cft->ss->name, cft->name);
+ kernfs_create_link(cgrp->kn, name, kn);
+ }

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
--- a/net/netfilter/xt_qtaguid.c     2020-05-12 12:13:14.000000000 +0300
+++ b/net/netfilter/xt_qtaguid.c 2019-09-15 23:56:45.000000000 +0300
@@ -737,7 +737,7 @@
{
struct proc_iface_stat_fmt_info *p = m->private;
struct iface_stat *iface_entry;
- struct rtnl_link_stats64 dev_stats, *stats;
+ struct rtnl_link_stats64 *stats;
struct rtnl_link_stats64 no_dev_stats = {0};
@@ -745,13 +745,8 @@
current->pid, current->tgid, from_kuid(&init_user_ns, current_fsuid()));
iface_entry = list_entry(v, struct iface_stat, list);
+ stats = &no_dev_stats;
- if (iface_entry->active) {
- stats = dev_get_stats(iface_entry->net_dev,
- &dev_stats);
- } else {
- stats = &no_dev_stats;
- }
/*
* If the meaning of the data changes, then update the fmtX
* string.

编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
export PATH="/home/mkr/Downloads/toolchains/proton-clang/bin:${PATH}"

make ARCH=arm64 CC=clang nogravity-lmi_defconfig O=out
make -j$(nproc --all) \
ARCH=arm64 \
O=out \
CC=clang \
CROSS_COMPILE=aarch64-linux-gnu- \
CROSS_COMPILE_COMPAT=arm-linux-gnueabi- \
AR=llvm-ar \
NM=llvm-nm \
OBJCOPY=llvm-objcopy \
OBJDUMP=llvm-objdump \
STRIP=llvm-strip \
LLVM=1 \
LLVM_IAS=1

打包内核

AnyKernel3

1
2
3
git clone https://github.com/osm0sis/AnyKernel3.git
cp out/arch/arm64/boot/Image.gz-dtb AnyKernel3/
cp out/arch/arm64/boot/dtbo.img AnyKernel3/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#anykernel.sh
properties() { '
kernel.string=k30p-lxc-docker
do.devicecheck=1
do.modules=0
do.systemless=1
do.cleanup=1
do.cleanuponabort=0
device.name1=lmi
device.name2=
device.name3=
device.name4=
device.name5=
supported.versions=
supported.patchlevels=
'; } # end properties

# shell variables
block=/dev/block/bootdevice/by-name/boot;
is_slot_device=0;
ramdisk_compression=auto;


## AnyKernel methods (DO NOT CHANGE)
# import patching functions/variables - see for reference
. tools/ak3-core.sh;


# migrate from /overlay to /overlay.d to enable SAR Magisk
if [ -d $ramdisk/overlay ]; then
rm -rf $ramdisk/overlay;
fi;

## AnyKernel install
dump_boot;

if [ -e /vendor/etc/powerhint.json ]; then
cp -a $ramdisk/ngk/powerhint.json /vendor/etc/powerhint.json;
chmod 644 /vendor/etc/powerhint.json;
fi;

write_boot;
## end install

简要说明

1
2
3
4
5
6
kernel.string= : 这里需要你填写内核的名称
do.devicecheck= : 填写1开启,0是关闭。这里是用来检测设备名称的,和下面device.name1~5形成对应。如果设备名称不对应,就无法刷入进设备。
device.name1 ~5 : 这里可以填写你的设备名称。注意,有些手机是开发代号,有的是设备名称具体依靠你自行判断。使用这些参数需要先开启do.devicecheck。
block= XXXX : 需要刷写内核的分区,一般是boot。
is_slot_device= : 填写1开启,0是关闭,auto是自动判断。设备使用是使用AB插槽。一般是VAB分区或者AB分区的则需要开启。
patch_vbmeta_flag= : 填写1开启,0是关闭,auto是自动判断。是否修补vbmeta来关闭AVB验证。

TWRP刷入

termux

termux-lxc