This repository was archived by the owner on Jan 29, 2026. It is now read-only.
forked from Laomaoi/Action-KernelSU-Next
-
Notifications
You must be signed in to change notification settings - Fork 199
Expand file tree
/
Copy pathBuild KernelSU Next OnePlus.yml
More file actions
1059 lines (956 loc) · 46.7 KB
/
Copy pathBuild KernelSU Next OnePlus.yml
File metadata and controls
1059 lines (956 loc) · 46.7 KB
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
name: Build KernelSU Next SUSFS All
on:
workflow_dispatch:
inputs:
FILE:
type: choice
description: "配置文件"
required: true
default: oneplus_ace2_pro_b
options:
- oneplus_10r_v
- oneplus_nord_3_v
- oneplus_ace_v
- oneplus_ace_race_v
- oneplus_10_pro_v
- oneplus_10t_v
- oneplus_11r_b
- oneplus_ace2_b
- oneplus_pad_lite_v
- oneplus_pad_mt6983_v
- oneplus_ace_2v_v
- oneplus_ace_pro_v
- oneplus_11_b
- oneplus_12r_b
- oneplus_ace2_pro_b
- oneplus_ace3_b
- oneplus_open_b
- oneplus_nord_ce4_b
- oneplus_12_b
- oneplus_pad_go_2_b
- oneplus_nord_ce4_lite_5g_v
- oneplus_nord_4_b
- oneplus_ace_3v_b
- oneplus_pad_mt6897_v
- oneplus_13r_b
- oneplus_ace3_pro_b
- oneplus_ace5_b
- oneplus_pad_pro_b
- oneplus_pad2_b
- oneplus_nord_ce5_b
- oneplus_nord_5_b
- oneplus_ace5_pro_b
- oneplus_13_b
- oneplus_13t_b
- oneplus_13s_b
- oneplus_pad_2_pro_b
- oneplus_pad_3_b
- oneplus_ace5_race_b
- oneplus_ace5_ultra_b
- oneplus_pad2_mt6991_b
- oneplus_ace_6
- oneplus_ace_6t
- oneplus_15r
- oneplus_15
SUSFS_CI:
type: choice
description: "SUSFS模块下载调用方向"
required: true
default: NoN
options:
- CI
- Release
- NoN
SUSFS_META:
type: string
description: "回退SUSFS到指定哈希版本"
required: false
default: ""
DYNAMIC_REPO:
type: string
description: "动态清单仓库所有者"
required: true
default: "Numbersf"
BUILD_TIME:
type: string
description: "自定义构建时间(输入F使用当前UTC时间)"
required: false
default: "Thu Dec 11 04:17:27 UTC 2025"
SUFFIX:
type: string
description: "自定义内核后缀(不输入使用随机字符串)"
required: false
default: ""
SUBLEVEL:
description: "自定义内核等级欺骗(SUBLEVEL)"
required: false
default: ""
FAST_BUILD:
type: boolean
description: "是否启用极速构建?"
required: true
default: true
LSM:
type: boolean
description: "是否启用关键分区写入保护模块(BBG)?"
required: true
default: true
NETFILTER:
type: boolean
description: "是否启用网络功能拓展(NETFILTER)?"
required: true
default: true
BBR_ECN:
type: boolean
description: "是否启用网络优化算法(BBR+ECN)?"
required: true
default: true
UNICODE_BYPASS:
type: boolean
description: "是否添加Unicode不可见字码点绕过读取漏洞修复?"
required: true
default: false
SCHED:
type: boolean
description: "是否添加风驰驱动1.0?"
required: true
default: false
ZRAM:
type: boolean
description: "是否添加更多ZRAM算法?"
required: true
default: false
SUSFS_DEV:
type: boolean
description: "是否拉取SUSFS-DEV分支?"
required: true
default: false
SPACE_NOCLEAN:
type: boolean
description: "是否停用空间清扫?"
required: true
default: false
BUILD_NOCCACHE:
type: boolean
description: "是否停用此次Ccache?"
required: true
default: false
jobs:
build:
name: ${{ github.event.inputs.FAST_BUILD == 'true' && ' [FAST]' || '' }}${{ github.event.inputs.LSM == 'true' && ' [LSM]' || '' }}${{ github.event.inputs.SCHED == 'true' && ' [SCHED]' || '' }}${{ github.event.inputs.ZRAM == 'true' && ' [ZRAM]' || '' }}For ${{ github.event.inputs.FILE }} ${{ github.event.inputs.SUFFIX }}
runs-on: ubuntu-latest
env:
CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion"
CCACHE_NOHASHDIR: "true"
CCACHE_HARDLINK: "true"
CCACHE_MAXSIZE: 8G
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Maximize Build Space
if: ${{ github.event.inputs.SPACE_NOCLEAN == 'false' }}
uses: easimon/maximize-build-space@master
with:
root-reserve-mb: 8192
temp-reserve-mb: 2048
remove-dotnet: 'true'
remove-android: 'true'
remove-haskell: 'true'
remove-codeql: 'true'
- name: Extract Manifest Info
id: extract_info
env:
FILE: ${{ github.event.inputs.FILE }}
run: |
set -e
cd "$GITHUB_WORKSPACE"
if [[ "$FILE" =~ ^(.+)_([a-zA-Z])$ ]]; then
FILE_CONF="${BASH_REMATCH[1]}"
else
FILE_CONF="$FILE"
fi
FILE_BASE=$(echo "$FILE_CONF" | sed -E 's/_([a-zA-Z0-9])/\U\1/g; s/^oneplus/OnePlus/; s/^realme/Realme/; s/^oppo/Oppo/')
mkdir -p ".repo/manifests_fallback"
XML_PATH=".repo/manifests_fallback/${FILE}.xml"
README_PATH=".repo/manifests_fallback/README.md"
echo "处理 FILE=$FILE, CONF=$FILE_CONF, BASE=$FILE_BASE"
echo "FILE_CONF=$FILE_CONF" >> $GITHUB_ENV
echo "FILE_BASE=$FILE_BASE" >> $GITHUB_ENV
# 动态调用源码清单仓库,仓库优先级:1️⃣ OnePlusOSS → 2️⃣ Numbersf(可换)
DYNAMIC_REPO_INPUT="${{ github.event.inputs.DYNAMIC_REPO }}"
declare -A REPOS
REPOS["OnePlusOSS"]="https://api.github.com/repos/OnePlusOSS/kernel_manifest"
REPOS["Dynamic"]="https://api.github.com/repos/${DYNAMIC_REPO_INPUT}/kernel_manifest"
FOUND_REPO=""
FOUND_BRANCH=""
check_repo() {
local OWNER=$1
local REPO_URL=$2
echo "🌐 尝试拉取 ${OWNER} 分支列表..."
BRANCHES=$(curl -s ${REPO_URL}/branches | jq -r '.[].name' || true)
if [[ -z "$BRANCHES" ]]; then
echo "⚠️ ${OWNER} 分支列表获取失败,跳过。"
return 1
fi
for BRANCH in $BRANCHES; do
XML_URL="https://raw.githubusercontent.com/${OWNER}/kernel_manifest/$BRANCH/${FILE}.xml"
README_URL="https://raw.githubusercontent.com/${OWNER}/kernel_manifest/$BRANCH/README.md"
if curl -sf --head "$XML_URL" > /dev/null; then
echo "✅ 在 ${OWNER} 找到 ${FILE}.xml (分支: $BRANCH)"
curl -s -o "$XML_PATH" "$XML_URL"
curl -s -o "$README_PATH" "$README_URL" || true
FOUND_REPO="$OWNER"
FOUND_BRANCH="$BRANCH"
return 0
fi
done
return 1
}
# 默认仓库寻找文件
if check_repo "OnePlusOSS" "${REPOS["OnePlusOSS"]}"; then
echo "MANIFEST_REPO=OnePlusOSS" >> $GITHUB_ENV
echo "MANIFEST_BRANCH=$FOUND_BRANCH" >> $GITHUB_ENV
fi
# 动态仓库寻找文件
if [[ -z "$FOUND_REPO" ]]; then
DYNAMIC_URL="${REPOS["Dynamic"]}"
DYNAMIC_OWNER=$(echo "$DYNAMIC_URL" | sed -E 's#https://api.github.com/repos/([^/]+)/.*#\1#')
if check_repo "$DYNAMIC_OWNER" "$DYNAMIC_URL"; then
echo "MANIFEST_REPO=$DYNAMIC_OWNER" >> $GITHUB_ENV
echo "MANIFEST_BRANCH=$FOUND_BRANCH" >> $GITHUB_ENV
fi
fi
if [[ -z "$FOUND_REPO" || ! -s "$XML_PATH" ]]; then
echo "❌ 无法在动态仓库中找到 ${FILE}.xml"
exit 1
fi
# 解析 revision 字符串
REVISION=$(grep -oP '<project[^>]+revision="\K[^"]+' "$XML_PATH" | head -n1 || true)
echo "解析 FILE 获取 CPU 和 ANDROID_VERSION..."
# 提取 CPU
CPU=$(echo "$REVISION" | sed -E 's#^(oneplus|realme|oppo)/([^_]+).*#\2#')
# 提取 ANDROID_VERSION
ANDROID_VERSION=$(echo "$REVISION" | grep -oP '\d{1,2}\.\d{1,2}(\.\d{1,2})?')
if [[ -n "$CPU" && -n "$ANDROID_VERSION" ]]; then
echo "✅ CPU=$CPU, ANDROID_VERSION=$ANDROID_VERSION"
echo "CPU=$CPU" >> $GITHUB_ENV
echo "ANDROID_VERSION=$ANDROID_VERSION" >> $GITHUB_ENV
# 获取短位 Android 版本号
echo "ANDROID_SHORT_VERSION=${ANDROID_VERSION%%.*}" >> $GITHUB_ENV
else
echo "❌ 无法从 revision 中提取 CPU 或 ANDROID_VERSION"
exit 1
fi
echo "解析 README.md 获取 CPUD 和 BUILD_METHOD..."
if [[ -s "$README_PATH" ]]; then
BUILD_LINE=$(grep -m1 'oplus_build_kernel.sh' "$README_PATH" || true)
if [[ -n "$BUILD_LINE" ]]; then
CPUD=$(echo "$BUILD_LINE" | awk '{print $(NF-1)}')
BUILD_METHOD=$(echo "$BUILD_LINE" | awk '{print $NF}')
echo "✅ CPUD=$CPUD, BUILD_METHOD=$BUILD_METHOD"
echo "CPUD=$CPUD" >> $GITHUB_ENV
echo "BUILD_METHOD=$BUILD_METHOD" >> $GITHUB_ENV
else
echo "❌ README.md 中未找到构建命令"
fi
else
echo "❌ README.md 下载失败或为空"
fi
# 传递组合信息
echo "value=${FILE_BASE}_Android${ANDROID_VERSION}" >> "$GITHUB_OUTPUT"
- name: Debug Show Selected Inputs
run: |
echo "-----------------------"
echo "Selected CPU: ${{ env.CPU }}"
echo "Selected CPUD: ${{ env.CPUD }}"
echo "Selected ANDROID_VERSION: ${{ env.ANDROID_VERSION }}"
echo "Selected BUILD_METHOD: ${{ env.BUILD_METHOD }}"
echo "Selected FILE: ${{ github.event.inputs.FILE }}"
echo "Selected SUSFS_CI: ${{ github.event.inputs.SUSFS_CI }}"
echo "Custom SUSFS_META: ${{ github.event.inputs.SUSFS_META }}"
echo "Custom BUILD_TIME: ${{ github.event.inputs.BUILD_TIME }}"
echo -n "BUILD_TIME Unicode: "
python3 -c "import unicodedata; print(''.join(f'\033[31mU+{ord(c):04X}\033[0m ' if c.isspace() or unicodedata.category(c)=='Cf' else f'U+{ord(c):04X} ' for c in '''${{ github.event.inputs.BUILD_TIME }}'''))"
echo "Custom SUFFIX: ${{ github.event.inputs.SUFFIX }}"
echo -n "SUFFIX Unicode: "
python3 -c "import unicodedata; print(''.join(f'\033[31mU+{ord(c):04X}\033[0m ' if c.isspace() or unicodedata.category(c)=='Cf' else f'U+{ord(c):04X} ' for c in '''${{ github.event.inputs.SUFFIX }}'''))"
echo "Selected LSM: ${{ github.event.inputs.LSM }}"
echo "Selected NETFILTER: ${{ github.event.inputs.NETFILTER }}"
echo "Selected BBR_ECN: ${{ github.event.inputs.BBR_ECN }}"
echo "Selected SUSFS_DEV: ${{ github.event.inputs.SUSFS_DEV }}"
echo "Selected FAST_BUILD: ${{ github.event.inputs.FAST_BUILD }}"
echo "Selected SCHED: ${{ github.event.inputs.SCHED }}"
echo "Selected ZRAM: ${{ github.event.inputs.ZRAM }}"
echo "Selected UNICODE_BYPASS: ${{ github.event.inputs.UNICODE_BYPASS }}"
echo "-----------------------"
- name: Check Disk Space
run: df -h
- name: Create and Enable 3G Swap
run: |
sudo swapoff -a
sudo fallocate -l 3G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h
- name: Set Cache Environment
if: ${{ github.event.inputs.BUILD_NOCCACHE == 'false' }}
run: |
echo "CCACHE_DIR=$HOME/.ccache_${{ github.event.inputs.FILE }}" >> $GITHUB_ENV
mkdir -p "$HOME/.ccache_${{ github.event.inputs.FILE }}"
echo "set: $HOME/.ccache_${{ github.event.inputs.FILE }}"
- name: Configure Git
run: |
git config --global user.name "Numbersf"
git config --global user.email "263623064@qq.com"
- name: Install Dependencies + APTC
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: python3 git curl ccache libelf-dev build-essential flex bison libssl-dev libncurses-dev liblz4-tool zlib1g-dev libxml2-utils rsync unzip gawk dos2unix
execute_install_scripts: true
- name: Restore Ccache
if: ${{ github.event.inputs.BUILD_NOCCACHE == 'false' }}
uses: actions/cache@v3
with:
path: ${{ env.CCACHE_DIR }}
key: ccache-${{ runner.os }}-${{ github.ref_name }}-${{ github.event.inputs.FILE }}-${{ env.BUILD_METHOD }}-${{ github.event.inputs.FAST_BUILD == 'true' && 'alpha' || 'beta' }}-16
- name: Initialize Ccache
if: ${{ github.event.inputs.BUILD_NOCCACHE == 'false' }}
run: |
INIT_FLAG="${{ env.CCACHE_DIR }}/.ccache_initialized"
if command -v ccache >/dev/null 2>&1; then
if [ ! -f "$INIT_FLAG" ]; then
echo "初始化 ccache (${{ env.CCACHE_DIR }})..."
mkdir -p "${{ env.CCACHE_DIR }}"
ccache -M ${{ env.CCACHE_MAXSIZE }}
touch "$INIT_FLAG"
echo "✅ ccache 初始化完成"
else
echo "✅ ccache 已初始化,跳过"
fi
else
echo "❌ 未安装 ccache,跳过"
fi
ccache -s
- name: Install Repo Tool
run: |
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/repo
chmod a+x ~/repo
sudo mv ~/repo /usr/local/bin/repo
- name: Initialize Repo and Sync
env:
FILE: ${{ github.event.inputs.FILE }}
run: |
mkdir kernel_workspace && cd kernel_workspace
mkdir -p .repo/manifests
cp "$GITHUB_WORKSPACE/.repo/manifests_fallback/${FILE}.xml" ".repo/manifests/${FILE}.xml"
MANIFEST_REPO="${{ env.MANIFEST_REPO }}"
MANIFEST_BRANCH="${{ env.MANIFEST_BRANCH }}"
CPU="${{ env.CPU }}"
echo "MANIFEST_REPO=$MANIFEST_REPO"
echo "MANIFEST_BRANCH=$MANIFEST_BRANCH"
BASE_URL="https://github.com/${MANIFEST_REPO}/kernel_manifest.git"
echo "使用 $MANIFEST_REPO 的分支 $MANIFEST_BRANCH 初始化仓库..."
repo init -u "$BASE_URL" -b "$MANIFEST_BRANCH" -m "${FILE}.xml" --depth=1 --no-clone-bundle --no-tags
repo sync -c -j$(nproc) --no-clone-bundle --no-tags --force-sync
for dir in kernel_platform/common kernel_platform/msm-kernel; do
if [ -e "$dir/BUILD.bazel" ]; then
sed -i '/^[[:space:]]*"protected_exports_list"[[:space:]]*:[[:space:]]*"android\/abi_gki_protected_exports_aarch64",$/d' "$dir/BUILD.bazel"
fi
rm -f "$dir/android/abi_gki_protected_exports_"* 2>/dev/null || echo "No protected exports in $dir"
done
- name: Kernel Version Handling
run: |
cd kernel_workspace/kernel_platform
# 获取内核 Android 版本号(KANDROID_VERSION)以及内核版本号(KERNEL_VERSION)
for f in ./common/build.config.constants ./common/build.config.common; do
if [ -f "$f" ]; then
BRANCH=$(grep -m1 '^BRANCH=' "$f" | cut -d= -f2)
[ -n "$BRANCH" ] && break
fi
done
if [ -n "$BRANCH" ]; then
echo "KANDROID_VERSION=${BRANCH%-*}" >> $GITHUB_ENV
echo "KERNEL_VERSION=${BRANCH#*-}" >> $GITHUB_ENV
else
echo "No BRANCH found in build.config files"
fi
# 从 Makefile 获取完整内核版本号(TKERNEL_VERSION)以及可选的修改内核等级
ORIG_VERSION=$(awk '/^VERSION =/ {v=$3} /^PATCHLEVEL =/ {p=$3} /^SUBLEVEL =/ {s=$3} END {print v"."p"."s}' ./common/Makefile)
# 强制修改 SUBLEVEL(内核等级)
SUBLEVEL_INPUT="${{ github.event.inputs.SUBLEVEL }}"
if [ -n "$SUBLEVEL_INPUT" ]; then
echo "修改 SUBLEVEL 为 $SUBLEVEL_INPUT"
sed -i "s/^\(SUBLEVEL[[:space:]]*=[[:space:]]*\).*/\1$SUBLEVEL_INPUT/" ./common/Makefile
else
echo "未指定 SUBLEVEL,保持默认"
fi
# 读取修改后的版本
NEW_VERSION=$(awk '/^VERSION =/ {v=$3} /^PATCHLEVEL =/ {p=$3} /^SUBLEVEL =/ {s=$3} END {print v"."p"."s}' ./common/Makefile)
if [ "$ORIG_VERSION" != "$NEW_VERSION" ]; then
echo "Kernel Version:$ORIG_VERSION->$NEW_VERSION"
echo "TKERNEL_VERSION=$NEW_VERSION" >> $GITHUB_ENV
else
echo "Kernel Version:$ORIG_VERSION No changes"
echo "TKERNEL_VERSION=$ORIG_VERSION" >> $GITHUB_ENV
fi
# 内核版本的数字转换(对比用)
echo "KV1=${BRANCH#*-}" | cut -d. -f1 >> $GITHUB_ENV
echo "KV2=${BRANCH#*-}" | tr -d '.' >> $GITHUB_ENV
echo "KV3=${NEW_VERSION}" | tr -d '.' >> $GITHUB_ENV
# 自定义内核后缀
- name: Custom Kernel Suffix if set
if: ${{ github.event.inputs.SUFFIX != '' }}
run: |
cd kernel_workspace
SUFFIX="${{ github.event.inputs.SUFFIX }}"
KANDROID_VERSION="${{ env.KANDROID_VERSION }}"
FAST_BUILD="${{ github.event.inputs.FAST_BUILD }}"
for path in \
kernel_platform/common/scripts/setlocalversion \
kernel_platform/msm-kernel/scripts/setlocalversion \
kernel_platform/external/dtc/scripts/setlocalversion; do
[ -f "$path" ] || continue
echo "Modifying: $path"
# Remove -dirty
sed -i 's/ -dirty//g' "$path"
sed -i '$i res=$(echo "$res" | sed '\''s/-dirty//g'\'')' "$path"
if grep -q 'KERNELVERSION.*scm_version' "$path"; then
echo "Detected NEW setlocalversion format"
sed -i "s|echo \"\${KERNELVERSION}.*scm_version}\"|echo \"\${KERNELVERSION}-${KANDROID_VERSION}-${SUFFIX}\"|" "$path"
elif grep -q 'echo "\$res"' "$path"; then
echo "Detected OLD setlocalversion format"
if [ "$FAST_BUILD" = "true" ]; then
echo "FAST_BUILD enabled: using static res"
sed -i "s/^res=.*/res=\"-${KANDROID_VERSION}-${SUFFIX}\"/" "$path"
else
echo "Standard build: injecting suffix via cut/echo"
if [[ -f ./kernel_platform/build_with_bazel.py ]]; then
echo "使用官方脚本编译且当使用 build_with_bazel 时,可能受特殊符号数量限制,编译失败请修改"
echo "When using the official script and building with build_with_bazel, the build may fail due to a limit on the number of special characters. Please modify the configuration if that happens."
fi
tac "$path" | sed "0,/echo \"\\\$res\"/s//res=\\\$(echo \\\$res | cut -d- -f1-2)-${SUFFIX}; echo \"\\\$res\";/" | tac > "$path.tmp" && mv "$path.tmp" "$path"
fi
else
echo "Unknown format, appending echo manually"
echo "echo \"\$res-${SUFFIX}\"" >> "$path"
fi
chmod +x "$path"
done
git add -A
git commit -m "Custom suffix & removed -dirty"
# 伪官方格式的随机后缀(仅在 SUFFIX 未设置时生效)*
- name: Custom Kernel Random Suffix if empty
if: ${{ github.event.inputs.SUFFIX == '' }}
run: |
cd kernel_workspace
KANDROID_VERSION="${{ env.KANDROID_VERSION }}"
FAST_BUILD="${{ github.event.inputs.FAST_BUILD }}"
# 生成随机数字和随机hash
RANDOM_DIGIT=$(od -An -N1 -tu1 < /dev/urandom | tr -d '[:space:]' | awk '{print $1 % 11}')
RANDOM_HASH=$(od -An -N7 -tx1 /dev/urandom | tr -d ' \n')
RANDOM_SUFFIX="${RANDOM_DIGIT}-o-g${RANDOM_HASH}"
for path in \
kernel_platform/common/scripts/setlocalversion \
kernel_platform/msm-kernel/scripts/setlocalversion \
kernel_platform/external/dtc/scripts/setlocalversion; do
[ -f "$path" ] || continue
echo "Modifying: $path"
# Remove -dirty
sed -i 's/ -dirty//g' "$path"
sed -i '$i res=$(echo "$res" | sed '\''s/-dirty//g'\'')' "$path"
if grep -q 'KERNELVERSION.*scm_version' "$path"; then
echo "Detected NEW setlocalversion format"
sed -i "s|echo \"\${KERNELVERSION}.*scm_version}\"|echo \"\${KERNELVERSION}-${KANDROID_VERSION}-${RANDOM_SUFFIX}\"|" "$path"
elif grep -q 'echo "\$res"' "$path"; then
echo "Detected OLD setlocalversion format"
if [ "$FAST_BUILD" = "true" ]; then
echo "FAST_BUILD enabled: using static res with random suffix"
sed -i "s/^res=.*/res=\"-${KANDROID_VERSION}-${RANDOM_SUFFIX}\"/" "$path"
else
echo "Standard build: injecting random suffix via cut/echo"
tac "$path" | sed "0,/echo \"\\\$res\"/s//res=\\\$(echo \\\$res | cut -d- -f1-2)-${RANDOM_SUFFIX}; echo \"\\\$res\";/" | tac > "$path.tmp" && mv "$path.tmp" "$path"
fi
else
echo "Unknown format, appending echo manually"
echo "echo \"\$res-${RANDOM_SUFFIX}\"" >> "$path"
fi
chmod +x "$path"
done
git add -A
git commit -m "Random suffix & remove -dirty"
- name: Add KernelSU Next
run: |
cd kernel_workspace/kernel_platform
curl -LSs "https://raw.githubusercontent.com/pershoot/KernelSU-Next/refs/heads/dev-susfs/kernel/setup.sh" | bash -s dev-susfs
cd KernelSU-Next
KSU_VERSION=$(expr $(curl -sI "https://api.github.com/repos/KernelSU-Next/KernelSU-Next/commits?sha=next&per_page=1" | grep -i "link:" | sed -n 's/.*page=\([0-9]*\)>; rel="last".*/\1/p') "+" 30000)
echo "KSUVER=$KSU_VERSION" >> $GITHUB_ENV
sed -i "s/KSU_VERSION_FALLBACK := 1/KSU_VERSION_FALLBACK := $KSU_VERSION/g" kernel/Kbuild
KSU_GIT_TAG=$(curl -sL "https://api.github.com/repos/KernelSU-Next/KernelSU-Next/tags" | grep -o '"name": *"[^"]*"' | head -n 1 | sed 's/"name": "//;s/"//')
sed -i "s/KSU_VERSION_TAG_FALLBACK := v0.0.1/KSU_VERSION_TAG_FALLBACK := $KSU_GIT_TAG/g" kernel/Kbuild
- name: Apply Patches KernelSU Next
env:
FILE: ${{ github.event.inputs.FILE }}
run: |
cd kernel_workspace
if [ "${{ github.event.inputs.SUSFS_META }}" != "-1" ]; then
SUSFS_META="${{ github.event.inputs.SUSFS_META }}"
git clone https://gitlab.com/simonpunk/susfs4ksu.git -b gki-${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}${{ github.inputs.SUSFS_DEV == 'true' && '-dev' || '' }}
cd susfs4ksu
[ -n "$SUSFS_META" ] && git checkout "$SUSFS_META" || echo "SUSFS_META 为空,使用最新上游 SUSFS"
cd ..
fi
git clone https://github.com/ShirkNeko/SukiSU_patch.git
git clone https://github.com/Numbersf/Action-Build.git
cd kernel_platform
if [ "${{ github.event.inputs.SUSFS_META }}" != "-1" ]; then
echo "正在拉取susfs补丁"
cp ../susfs4ksu/kernel_patches/50_add_susfs_in_gki-${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}.patch ./common/
cp ../susfs4ksu/kernel_patches/fs/* ./common/fs/
cp ../susfs4ksu/kernel_patches/include/linux/* ./common/include/linux/
fi
if [ "${{ github.event.inputs.ZRAM }}" = "true" ]; then
echo "正在拉取zram补丁"
cp -r ../SukiSU_patch/other/zram/lz4k/include/linux/* ./common/include/linux/
cp -r ../SukiSU_patch/other/zram/lz4k/lib/* ./common/lib/
cp -r ../SukiSU_patch/other/zram/lz4k/crypto/* ./common/crypto/
cp -r ../SukiSU_patch/other/zram/lz4k_oplus ./common/lib/
fi
cd ./common
GKI_V="${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}"
SUBLEVEL=$(grep '^SUBLEVEL *=' Makefile | head -n1 | cut -d= -f2 | tr -d ' ')
if [ "$GKI_V" == "android13-5.15" ] && [ "$SUBLEVEL" -lt 123 ]; then
echo "修复内核版本为5.15.0~5.15.123仅支持旧版C库造成的一些bug"
cp ../../Action-Build/patches/fix_5.15.legacy ./fix_5.15.legacy.patch
patch -p1 < fix_5.15.legacy.patch
echo "fix_5.15_patch完成"
fi
if [[ "${{ env.KV2 }}" == "66" && "${{ env.KV3 }}" -le 6630 && "${{ github.event.inputs.SUSFS_META }}" != "-1" ]]; then
TRUSTY_EXISTS="false"
if grep -q 'common-modules/trusty' "$GITHUB_WORKSPACE/.repo/manifests_fallback/${FILE}.xml"; then
TRUSTY_EXISTS="true"
fi
echo "trusty_exists=$TRUSTY_EXISTS" >> $GITHUB_OUTPUT
if [[ "$TRUSTY_EXISTS" == "false" ]]; then
echo "修复内核版本为6.6.0~6.6.30的机型源码及清单中缺失TrustyOS导致的susfs报错"
sed -i 's/-32,12 +32,38/-32,11 +32,37/g' 50_add_susfs_in_gki-${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}.patch
sed -i '/#include <trace\/hooks\/fs.h>/d' 50_add_susfs_in_gki-${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}.patch
fi
fi
if [ "${{ github.event.inputs.SUSFS_META }}" != "-1" ]; then
# Fake Patch to fix failures
fake_patched=0
if [ "$GKI_V" = "android15-6.6" ]; then
if ! grep -qxF $'\tunsigned int nr_subpages = __PAGE_SIZE / PAGE_SIZE;' ./fs/proc/task_mmu.c; then
echo "未找到 nr_subpages,正在进行补丁修复"
sed -i -e '/int ret = 0, copied = 0;/a \\tunsigned int nr_subpages \= __PAGE_SIZE \/ PAGE_SIZE;' -e '/int ret = 0, copied = 0;/a \\tpagemap_entry_t \*res = NULL;' ./fs/proc/task_mmu.c
fake_patched=1
fi
fi
if [ "$GKI_V" = "android12-5.10" ] || [ "$GKI_V" = "android13-5.15" ] || [ "$GKI_V" = "android14-6.1" ]; then
if ! grep -qxF $'\tif (!vma_pages(vma))' ./fs/proc/task_mmu.c; then
echo "未找到 vma_pages,正在进行补丁修复"
fake_patched=1
fi
fi
echo "正在打susfs补丁"
patch -p1 < 50_add_susfs_in_gki-${{ env.KANDROID_VERSION }}-${{ env.KERNEL_VERSION }}.patch || true
echo "susfs_patch完成"
# Revert
if [ "$fake_patched" = 1 ]; then
if [ "$GKI_V" = "android15-6.6" ]; then
if grep -qxF $'\tunsigned int nr_subpages = __PAGE_SIZE / PAGE_SIZE;' ./fs/proc/task_mmu.c; then
sed -i -e '/unsigned int nr_subpages \= __PAGE_SIZE \/ PAGE_SIZE;/d' -e '/pagemap_entry_t \*res = NULL;/d' ./fs/proc/task_mmu.c
fi
fi
if [ "$GKI_V" = "android12-5.10" ] || [ "$GKI_V" = "android13-5.15" ] || [ "$GKI_V" = "android14-6.1" ]; then
if grep -qxF $'\t\tgoto show_pad;' ./fs/proc/task_mmu.c; then
sed -i -e 's/goto show_pad;/return 0;/' ./fs/proc/task_mmu.c
fi
fi
fi
fi
# OGKI转换GKI,无需修改 dtbo 开机
- name: Apply Convert HMBIRD_OGKI to HMBIRD_GKI
if: ${{ fromJSON(env.KV1) >= 6 && fromJSON(env.KV2) >= 66 && github.event.inputs.SCHED == 'false' }}
run: |
PATCH_DIR="${GITHUB_WORKSPACE}/kernel_workspace/Action-Build/patches"
cd kernel_workspace/kernel_platform/common
for p in ./kernel/sched/hmbird* ./vendor/oplus/kernel/cpu/sched_ext/hmbird*; do
[ -d "$p" ] && {
echo "源码中风驰代码已经存在,启用二次回退"
exit 0
}
done
sed -i '1iobj-y += hmbird_patch.o' drivers/Makefile
echo "正在打OGKI转换GKI补丁"
patch -p1 -F 3 < "${PATCH_DIR}/hmbird_patch.patch" || true
echo "OGKI转换GKI_patch完成"
- name: Apply UNICODE_BYPASS
if: ${{ github.event.inputs.UNICODE_BYPASS == 'true' }}
run: |
PATCH_DIR="${GITHUB_WORKSPACE}/kernel_workspace/Action-Build/patches"
cd kernel_workspace/kernel_platform/common
if [ "$KV1" -lt 6 ]; then
patch -p1 --forward < "${PATCH_DIR}/unicode_bypass_fix_6.1-.patch" || true
else
patch -p1 --forward < "${PATCH_DIR}/unicode_bypass_fix_6.1+.patch" || true
fi
- name: Apply ZRAM
if: ${{ github.event.inputs.ZRAM == 'true' }}
run: |
PATCH_DIR="${GITHUB_WORKSPACE}/kernel_workspace/SukiSU_patch/other/zram/zram_patch/${{ env.KERNEL_VERSION }}"
cd kernel_workspace/kernel_platform/common
echo "正在打lz4kd补丁"
patch -p1 -F 3 < "${PATCH_DIR}/lz4kd.patch" || true
echo 'lz4kd_patch完成'
echo "正在打lz4k_oplus补丁"
patch -p1 -F 3 < "${PATCH_DIR}/lz4k_oplus.patch" || true
echo 'lz4k_oplus_patch完成'
- name: Apply SCHED
env:
FILE: ${{ github.event.inputs.FILE }}
if: ${{ github.event.inputs.SCHED == 'true' }}
run: |
cd kernel_workspace/kernel_platform/common
git clone https://github.com/Numbersf/SCHED_PATCH.git -b $CPU || { echo "❌ CPU 分支不存在,风驰内核暂未支持你的机型,请关闭后重试"; exit 11; }
echo "正在拉取风驰补丁"
cp ./SCHED_PATCH/fengchi_${FILE}.patch ./
if [[ -f "fengchi_${FILE}.patch" ]]; then
echo "正在打风驰补丁"
dos2unix "fengchi_${FILE}.patch"
patch -p1 -F 3 < "fengchi_${FILE}.patch"
echo "fengchi_patch完成"
else
echo "❌ 未匹配到补丁,风驰内核暂未支持你的机型,请关闭后重试"
exit 12
fi
- name: Apply LSM_BBG
if: ${{ github.event.inputs.LSM == 'true' }}
run: |
cd kernel_workspace/kernel_platform/common
echo "正在启用内核级基带保护支持…"
curl -LSs https://raw.githubusercontent.com/vc-teahouse/Baseband-guard/main/setup.sh | bash
sed -i '/^config LSM$/,/^help$/{ /^[[:space:]]*default/ { /baseband_guard/! s/selinux/selinux,baseband_guard/ } }' ./security/Kconfig
# 配置信息,带*为附加项目,具有一定危险性和不确定性
- name: Add Configuration Settings
run: |
cd kernel_workspace/kernel_platform/common
CONFIG_FILE=./arch/arm64/configs/gki_defconfig
KERNEL_VERSION="${{ env.KERNEL_VERSION }}"
# KSUN配置
echo "CONFIG_KSU=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_KPROBES_HOOK=n" >> "$CONFIG_FILE"
# SUSFS配置
if [ "${{ github.event.inputs.SUSFS_META }}" != "-1" ]; then
echo "CONFIG_KSU_SUSFS=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SUS_PATH=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SUS_MAP=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SUS_MOUNT=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SUS_KSTAT=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SPOOF_UNAME=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_ENABLE_LOG=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_HIDE_KSU_SUSFS_SYMBOLS=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_SPOOF_CMDLINE_OR_BOOTCONFIG=y" >> "$CONFIG_FILE"
echo "CONFIG_KSU_SUSFS_OPEN_REDIRECT=y" >> "$CONFIG_FILE"
else
echo "CONFIG_KSU_SUSFS=n" >> "$CONFIG_FILE"
fi
# TMPFS配置*
echo "CONFIG_TMPFS_XATTR=y" >> "$CONFIG_FILE"
echo "CONFIG_TMPFS_POSIX_ACL=y" >> "$CONFIG_FILE"
# BBR & ECN配置*
if [ "${{ github.event.inputs.BBR_ECN }}" = "true" ]; then
echo "CONFIG_TCP_CONG_ADVANCED=y" >> "$CONFIG_FILE"
echo "CONFIG_TCP_CONG_BBR=y" >> "$CONFIG_FILE"
echo "CONFIG_NET_SCH_FQ=y" >> "$CONFIG_FILE"
echo "CONFIG_TCP_CONG_BIC=n" >> "$CONFIG_FILE"
echo "CONFIG_TCP_CONG_WESTWOOD=n" >> "$CONFIG_FILE"
echo "CONFIG_TCP_CONG_HTCP=n" >> "$CONFIG_FILE"
echo "CONFIG_IP_ECN=y" >> "$CONFIG_FILE"
echo "CONFIG_TCP_ECN=y" >> "$CONFIG_FILE"
echo "CONFIG_IPV6_ECN=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_NF_TARGET_ECN=y" >> "$CONFIG_FILE"
fi
# ZRAM配置*
if [ "${{ github.event.inputs.ZRAM }}" = "true" ]; then
echo "CONFIG_CRYPTO_LZ4HC=y" >> "$CONFIG_FILE"
echo "CONFIG_CRYPTO_LZ4K=y" >> "$CONFIG_FILE"
echo "CONFIG_CRYPTO_LZ4KD=y" >> "$CONFIG_FILE"
echo "CONFIG_CRYPTO_842=y" >> "$CONFIG_FILE"
echo "CONFIG_CRYPTO_LZ4K_OPLUS=y" >> "$CONFIG_FILE"
echo "CONFIG_ZRAM_WRITEBACK=y" >> "$CONFIG_FILE"
fi
# LSM配置*
if [ "${{ github.event.inputs.LSM }}" = "true" ]; then
echo "CONFIG_BBG=y" >> "$CONFIG_FILE"
fi
# IPSET & IPv6_NAT配置*
if [[ "${CPU}" == sm* && "${{ github.event.inputs.NETFILTER }}" == "true" ]]; then
echo "CONFIG_BPF_STREAM_PARSER=y" >> "$CONFIG_FILE"
echo "CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y" >> "$CONFIG_FILE"
echo "CONFIG_NETFILTER_XT_SET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_MAX=65534" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_BITMAP_IP=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_BITMAP_IPMAC=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_BITMAP_PORT=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IP=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IPMARK=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IPPORT=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IPPORTIP=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IPPORTNET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_IPMAC=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_MAC=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_NETPORTNET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_NET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_NETNET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_NETPORT=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_HASH_NETIFACE=y" >> "$CONFIG_FILE"
echo "CONFIG_IP_SET_LIST_SET=y" >> "$CONFIG_FILE"
echo "CONFIG_IP6_NF_NAT=y" >> "$CONFIG_FILE"
echo "CONFIG_IP6_NF_TARGET_MASQUERADE=y" >> "$CONFIG_FILE"
fi
# 修复构建问题
if [ "$KERNEL_VERSION" = "6.1" ] && [[ "$CPU" == mt* ]]; then
echo "CONFIG_DEBUG_INFO_BTF=n" >> "$CONFIG_FILE"
fi
# 移除构建审查
sed -i 's/check_defconfig//' ./build.config.gki
- name: Fix IPv6_NAT Error
if: ${{ github.event.inputs.NETFILTER == 'true' }}
run: |
PATCH_DIR="${GITHUB_WORKSPACE}/kernel_workspace/Action-Build/patches"
cd kernel_workspace/kernel_platform/common
if [[ "${CPU}" == sm* ]]; then
echo "修复启用IPv6 NAT后可能出现的设备误报…"
patch -p1 -F 3 < "${PATCH_DIR}/IPv6_NAT_FIX.patch"
else
echo "你的设备不支持 IPv6 NAT,跳过此步骤。"
fi
# Custom kernel build time, without adding #1 SMP PREEMPT 自定义内核构建时间,不要加入#1 SMP PREEMPT
- name: Custom BUILD_TIME
shell: bash
run: |
INPUT_TIME="${{ github.event.inputs.BUILD_TIME }}"
if [[ -n "$INPUT_TIME" && "$INPUT_TIME" != "F" && "$INPUT_TIME" != "f" ]]; then
DATESTR="$INPUT_TIME"
echo "Using input BUILD_TIME: $DATESTR"
else
DATESTR="$(TZ='UTC' date +'%a %b %d %T %Z %Y')"
echo "Using UTC time as fallback: $DATESTR"
fi
echo "KBUILD_BUILD_TIMESTAMP=${DATESTR}" >> "$GITHUB_ENV"
echo "KBUILD_BUILD_VERSION=1" >> "$GITHUB_ENV"
cd kernel_workspace/kernel_platform/
for f in common/scripts/mkcompile_h msm-kernel/scripts/mkcompile_h; do
if [ -f "$f" ]; then
echo "Patching mkcompile_h with BUILD_TIME=$DATESTR"
if grep -q 'UTS_VERSION=' "$f"; then
perl -pi -e "s{UTS_VERSION=\"\\\$\\(.*?\\)\"}{UTS_VERSION=\"#1 SMP PREEMPT $DATESTR\"}" "$f"
else
perl -0777 -pi -e "s{cat <<EOF}{cat <<EOF\n#undef UTS_VERSION\n#define UTS_VERSION \"#1 SMP PREEMPT $DATESTR\" } unless /UTS_VERSION/" "$f"
fi
fi
done
- name: Enable lto=thin For FAST
if: ${{ (env.KERNEL_VERSION == '5.10' || env.KERNEL_VERSION == '5.15') && github.event.inputs.FAST_BUILD == 'true' }}
run: |
cd kernel_workspace/kernel_platform
DEFCONFIG=./common/arch/arm64/configs/gki_defconfig
echo "Enabling ThinLTO in $DEFCONFIG"
sed -i 's/^CONFIG_LTO=n/CONFIG_LTO=y/' "$DEFCONFIG"
sed -i 's/^CONFIG_LTO_CLANG_FULL=y/CONFIG_LTO_CLANG_THIN=y/' "$DEFCONFIG"
sed -i 's/^CONFIG_LTO_CLANG_NONE=y/CONFIG_LTO_CLANG_THIN=y/' "$DEFCONFIG"
grep -q '^CONFIG_LTO_CLANG_THIN=y' "$DEFCONFIG" || echo 'CONFIG_LTO_CLANG_THIN=y' >> "$DEFCONFIG"
- name: Disable GPUEB
if: ${{ env.KERNEL_VERSION == '5.10' && startsWith(env.CPU, 'mt') }}
run: |
echo "Disabling GPUEB for MTK kernel 5.10"
sed -i '/obj-y.*gpueb/d' kernel_workspace/kernel-5.10/drivers/gpu/mediatek/Makefile
- name: Build Kernel FAST
if: ${{ github.event.inputs.FAST_BUILD == 'true' }}
id: fast_build
run: |
KERNEL_VERSION="${{ env.KERNEL_VERSION }}"
cd kernel_workspace/kernel_platform
# 自动检测 LLVM_IAS
if [[ -f ./common/build.config.arm ]] && grep -q '^LLVM_IAS=1' ./common/build.config.arm; then
USE_LLVM_IAS=true
else
USE_LLVM_IAS=false
fi
# 从 build.config.common 读取 CLANG_PREBUILT_BIN
CLANG_PREBUILT_BIN=$(grep '^CLANG_PREBUILT_BIN=' ./common/build.config.common | cut -d'=' -f2 || true)
if [[ -z "$CLANG_PREBUILT_BIN" ]]; then
echo "⚠️ CLANG_PREBUILT_BIN 未在 build.config.common 中找到,回退至官方构建脚本"
echo "fallback=true" >> "$GITHUB_OUTPUT"
echo "请考虑关闭 FAST_BUILD 并提交问题"
exit 0
fi
# 优先尝试从 CLANG_PREBUILT_BIN 提取 clang-r 版本
if [[ "$CLANG_PREBUILT_BIN" =~ (clang-r[0-9a-z]+) ]]; then
CLANG_VERSION="${BASH_REMATCH[1]}"
else
# 如果未匹配到,尝试从 build.config.constants 提取
if [[ -f ./common/build.config.constants ]]; then
CLANG_VERSION=$(grep '^CLANG_VERSION=' ./common/build.config.constants | cut -d'=' -f2 || true)
fi
fi
if [[ -z "$CLANG_VERSION" ]]; then
echo "⚠️ 未能从 CLANG_PREBUILT_BIN 或 build.config.constants 获取到 Clang 版本,回退至官方构建脚本"
echo "fallback=true" >> "$GITHUB_OUTPUT"
echo "请考虑关闭 FAST_BUILD 并提交问题"
exit 0
fi
# 替换成新的 CLANG_VERSION 值
CLANG_PREBUILT_BIN=${CLANG_PREBUILT_BIN/\$\{CLANG_VERSION\}/$CLANG_VERSION}
# 获取 CLANG_PREBUILT_BIN 的第一个目录名,赋值给 CLANG_DIR
CLANG_DIR=$(echo "$CLANG_PREBUILT_BIN" | cut -d'/' -f1)
# 获取 CLANG_PREBUILT_BIN 的上一级目录名,赋值给 CLANG_PATH
CLANG_PATH=$(basename "$(dirname "$CLANG_PREBUILT_BIN")")
echo "✅ CLANG_VERSION=$CLANG_VERSION"
echo "✅ CLANG_DIR=$CLANG_DIR"
echo "✅ CLANG_PATH=$CLANG_PATH"
echo "✅ USE_LLVM_IAS=$USE_LLVM_IAS"
export PATH="$GITHUB_WORKSPACE/kernel_workspace/kernel_platform/$CLANG_PREBUILT_BIN:$PATH"
export PATH="/usr/lib/ccache:$PATH"
export CC="ccache clang"
sudo apt install -y libelf-dev ccache
cd ./common
MAKE_ARGS="LLVM=1 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
RUSTC=../../prebuilts/rust/linux-x86/1.73.0b/bin/rustc \
PAHOLE=../../prebuilts/kernel-build-tools/linux-x86/bin/pahole \
LD=ld.lld HOSTLD=ld.lld KCFLAGS+=-Wno-error"
if [[ "$USE_LLVM_IAS" == "true" ]]; then
MAKE_ARGS="LLVM_IAS=1 $MAKE_ARGS"
fi
make -j$(nproc --all) O=out $MAKE_ARGS gki_defconfig
make -j$(nproc --all) O=out $MAKE_ARGS
ccache -s
- name: Fallback to Build Kernel
if: ${{ github.event.inputs.FAST_BUILD == 'false' || steps.fast_build.outputs.fallback == 'true' }}
run: |
cd kernel_workspace
if [ -f ./kernel_platform/build_with_bazel.py ]; then
./kernel_platform/oplus/bazel/oplus_modules_variant.sh ${{ env.CPUD }} ${{ env.BUILD_METHOD }}
./kernel_platform/build_with_bazel.py -t ${{ env.CPUD }} ${{ env.BUILD_METHOD }}
else
LTO=thin SYSTEM_DLKM_RE_SIGN=0 BUILD_SYSTEM_DLKM=0 KMI_SYMBOL_LIST_STRICT_MODE=0 \
./kernel_platform/oplus/build/oplus_build_kernel.sh ${{ env.CPUD }} ${{ env.BUILD_METHOD }}
fi
- name: Make AnyKernel3
run: |
git clone https://github.com/Numbersf/AnyKernel3 --depth=1
rm -rf ./AnyKernel3/.git
mkdir -p kernel_workspace/kernel_platform/out/Final-Image-Find/
image_path=$(find "./kernel_workspace/kernel_platform/common/out/" -name "Image" | head -n 1)
if [ -n "$image_path" ]; then
echo "使用 make 编译的统一路径,成功找到 Image 文件"
else
image_path=$(find "./kernel_workspace/kernel_platform/out/" -name "Image" | head -n 1)
if [ -n "$image_path" ]; then
echo "使用官方脚本编译,成功找到 Image 文件"
else
echo "未找到 Image 文件,构建失败" >&2
exit 1
fi
fi
if [ -n "$image_path" ] && [ -f "$image_path" ]; then
echo "Image file finally located at: $image_path"
cp "$image_path" ./AnyKernel3/Image
cp "$image_path" kernel_workspace/kernel_platform/out/Final-Image-Find/Image
fi
- name: Download Latest SUSFS Module from CI
if: ${{ github.event.inputs.SUSFS_CI == 'CI' && github.event.inputs.SUSFS_META != '-1' }}
continue-on-error: true
run: |
LATEST_RUN_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/sidex15/susfs4ksu-module/actions/runs?status=success" | \
jq -r '.workflow_runs[] | select(.head_branch == "v1.5.2+") | .id' | head -n 1)
if [ -z "$LATEST_RUN_ID" ]; then
echo "No successful run found for branch v1.5.2+"
else
ARTIFACT_URL=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/sidex15/susfs4ksu-module/actions/runs/$LATEST_RUN_ID/artifacts" | jq -r '.artifacts[0].archive_download_url')
if [ -n "$ARTIFACT_URL" ]; then
curl -L -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -o ksu_module_susfs_1.5.2+_CI.zip "$ARTIFACT_URL"
cp ksu_module_susfs_1.5.2+_CI.zip ./AnyKernel3/
else
echo "Failed to fetch artifact URL"
fi
fi
- name: Download Latest SUSFS Module from Release
if: ${{ github.event.inputs.SUSFS_CI == 'Release' && github.event.inputs.SUSFS_META != '-1' }}
continue-on-error: true
run: |
wget -O ksu_module_susfs_1.5.2+_Release.zip https://github.com/sidex15/ksu_module_susfs/releases/latest/download/ksu_module_susfs_1.5.2+.zip
cp ksu_module_susfs_1.5.2+_Release.zip ./AnyKernel3/
- name: Upload AnyKernel3
uses: actions/upload-artifact@v4
with:
name: AnyKernel3_KernelSU_Next_${{ env.KSUVER }}_${{ steps.extract_info.outputs.value }}(${{ env.TKERNEL_VERSION }})${{ steps.suffix.outputs.value }}
path: ./AnyKernel3/*
- name: Download and Unzip ZRAM
if: ${{ github.event.inputs.ZRAM == 'true' }}
id: zram_find
run: |
set -e
sudo apt install -y unzip
echo "尝试获取 ZRAM 模块 zip 下载链接..."
retries=3