Skip to content

Commit 681e697

Browse files
committed
refactor(build): 重构构建脚本以支持KPM和APK的一键构建
重构build.sh脚本,使其支持同时构建KPM模块和Android APK 添加用户友好的路径配置提示和错误检查 引入Gradle自动下载功能 优化输出信息和部署说明
1 parent dd9c6e1 commit 681e697

1 file changed

Lines changed: 99 additions & 73 deletions

File tree

build.sh

Lines changed: 99 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,120 @@
11
#!/bin/bash
2-
# =============================================================================
3-
# build.sh — One-click build script for SVCModule KPM
4-
# =============================================================================
5-
set -e
2+
set -euo pipefail
63

74
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
8-
KPM_DIR="$SCRIPT_DIR/kpm"
9-
BUILD_DIR="$KPM_DIR/build"
10-
OUTPUT="$BUILD_DIR/svc_monitor.kpm"
115

12-
# Colors
136
RED='\033[0;31m'
147
GREEN='\033[0;32m'
158
YELLOW='\033[1;33m'
169
NC='\033[0m'
1710

18-
echo -e "${GREEN}============================================${NC}"
19-
echo -e "${GREEN} SVCModule KPM Build Script${NC}"
20-
echo -e "${GREEN} Target: ARM64 / kernel 5.10.43${NC}"
21-
echo -e "${GREEN}============================================${NC}"
11+
cat <<'EOF'
12+
====================================================================
13+
【你只需要改这 2 个地方】(或改成导出环境变量也行)
14+
15+
1) KP_DIR:KernelPatch 源码目录(必须是绝对路径)
16+
例:/Users/<username>/Desktop/GithubProject/SVC_Call/KernelPatch
17+
18+
2) ANDROID_SDK:Android SDK 目录(必须是绝对路径)
19+
例:/Users/<username>/Library/Android/sdk
20+
21+
可选:
22+
3) JAVA_HOME:JDK 17 的 Contents/Home(如果系统找不到会要求你手动设置)
23+
例:/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home
24+
25+
不想改文件的话,也可以直接在终端执行:
26+
export KP_DIR=".../KernelPatch"
27+
export ANDROID_SDK=".../Android/sdk"
28+
export JAVA_HOME=".../jdk17/Contents/Home" # 如需要
29+
bash build.sh
30+
====================================================================
31+
EOF
32+
33+
echo -e "${GREEN}====================================================${NC}"
34+
echo -e "${GREEN} SVC_Call One-Click Build (KPM + APK)${NC}"
35+
echo -e "${GREEN}====================================================${NC}"
2236
echo ""
2337

24-
# ---- Check toolchain ----
25-
CROSS_COMPILE="${CROSS_COMPILE:-aarch64-linux-gnu-}"
26-
CC="${CC:-${CROSS_COMPILE}gcc}"
27-
LD="${LD:-${CROSS_COMPILE}ld}"
28-
29-
# Try to find compiler
30-
if ! command -v "$CC" &>/dev/null; then
31-
# Try Android NDK
32-
if [ -n "$NDK_HOME" ]; then
33-
CLANG="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/clang"
34-
if [ -x "$CLANG" ]; then
35-
CC="$CLANG --target=aarch64-linux-android31"
36-
LD="$NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld"
37-
echo -e "${GREEN}[OK]${NC} Using NDK clang: $CLANG"
38-
else
39-
echo -e "${RED}[ERROR]${NC} NDK clang not found at: $CLANG"
40-
exit 1
41-
fi
42-
else
43-
echo -e "${RED}[ERROR]${NC} Cross-compiler not found: $CC"
44-
echo ""
45-
echo "Please install one of:"
46-
echo " 1. sudo apt install gcc-aarch64-linux-gnu"
47-
echo " 2. Set NDK_HOME to Android NDK path"
48-
echo " 3. Set CROSS_COMPILE to your toolchain prefix"
49-
exit 1
50-
fi
51-
else
52-
echo -e "${GREEN}[OK]${NC} Compiler: $CC"
38+
echo -e "${YELLOW}!!! 需要你改的路径(很重要) !!!${NC}"
39+
KP_DIR="${KP_DIR:-/path/to/KernelPatch}"
40+
ANDROID_SDK="${ANDROID_SDK:-/Users/bytedance/Library/Android/sdk}"
41+
echo " KP_DIR = $KP_DIR"
42+
echo " ANDROID_SDK = $ANDROID_SDK"
43+
echo ""
44+
45+
if [ "$KP_DIR" = "/path/to/KernelPatch" ] || [ ! -d "$KP_DIR" ]; then
46+
echo -e "${RED}[ERROR]${NC} KP_DIR 未配置或目录不存在:$KP_DIR"
47+
echo "请把 build.sh 顶部的 KP_DIR 改成你的 KernelPatch 源码路径,或导出环境变量:"
48+
echo " export KP_DIR=/abs/path/to/KernelPatch"
49+
exit 1
50+
fi
51+
if [ ! -d "$ANDROID_SDK" ]; then
52+
echo -e "${RED}[ERROR]${NC} ANDROID_SDK 目录不存在:$ANDROID_SDK"
53+
echo "请把 build.sh 顶部的 ANDROID_SDK 改成你的 Android SDK 路径,或导出环境变量:"
54+
echo " export ANDROID_SDK=/abs/path/to/Android/sdk"
55+
exit 1
56+
fi
57+
58+
if [ -z "${JAVA_HOME:-}" ]; then
59+
if command -v /usr/libexec/java_home >/dev/null 2>&1; then
60+
JAVA_HOME="$(/usr/libexec/java_home -v 17 2>/dev/null || true)"
61+
export JAVA_HOME
62+
fi
63+
fi
64+
if [ -z "${JAVA_HOME:-}" ] || [ ! -d "$JAVA_HOME" ]; then
65+
echo -e "${RED}[ERROR]${NC} 未找到 JDK 17(JAVA_HOME 为空或不存在)"
66+
echo "请安装 JDK 17 并导出:"
67+
echo " export JAVA_HOME=/path/to/jdk17/Contents/Home"
68+
exit 1
5369
fi
70+
export PATH="$JAVA_HOME/bin:$PATH"
5471

55-
# ---- Build ----
56-
mkdir -p "$BUILD_DIR"
72+
export ANDROID_HOME="$ANDROID_SDK"
73+
export ANDROID_SDK_ROOT="$ANDROID_SDK"
5774

58-
SRC="$KPM_DIR/src/svc_monitor_v10.c"
59-
OBJ="$BUILD_DIR/svc_monitor.o"
60-
KPM="$BUILD_DIR/svc_monitor.kpm"
75+
TOOLS_DIR="$SCRIPT_DIR/.build_tools"
76+
GRADLE_VERSION="${GRADLE_VERSION:-8.1.1}"
77+
GRADLE_DIR="$TOOLS_DIR/gradle-$GRADLE_VERSION"
78+
GRADLE_BIN="${GRADLE_BIN:-$GRADLE_DIR/bin/gradle}"
6179

62-
CFLAGS="-Wall -Wextra -Werror=implicit-function-declaration \
63-
-std=gnu11 -O2 \
64-
-fno-common -fno-builtin -fno-stack-protector \
65-
-fno-exceptions -fno-asynchronous-unwind-tables \
66-
-fno-unwind-tables -nostdlib -nostdinc \
67-
-ffreestanding -fPIC \
68-
-I$SCRIPT_DIR/kp_headers"
80+
mkdir -p "$TOOLS_DIR"
6981

70-
echo ""
71-
echo -e "${YELLOW}[1/2]${NC} Compiling svc_monitor_v10.c ..."
72-
$CC $CFLAGS -c "$SRC" -o "$OBJ"
73-
echo -e " ${GREEN}OK${NC}$OBJ"
82+
if [ ! -x "$GRADLE_BIN" ]; then
83+
echo -e "${YELLOW}[INFO]${NC} 未找到 Gradle,自动下载:$GRADLE_VERSION"
84+
ZIP="$TOOLS_DIR/gradle-$GRADLE_VERSION-bin.zip"
85+
URL="https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip"
86+
rm -f "$ZIP"
87+
curl -L -o "$ZIP" "$URL"
88+
rm -rf "$GRADLE_DIR"
89+
unzip -q "$ZIP" -d "$TOOLS_DIR"
90+
fi
7491

75-
echo -e "${YELLOW}[2/2]${NC} Linking svc_monitor.kpm ..."
76-
$LD -shared -nostdlib -o "$KPM" "$OBJ"
77-
echo -e " ${GREEN}OK${NC}$KPM"
92+
echo -e "${YELLOW}[1/2]${NC} Building KPM (svc_monitor.kpm)..."
93+
( cd "$SCRIPT_DIR/kpm" && make clean all KP_DIR="$KP_DIR" SDK_DIR="$ANDROID_SDK" )
94+
KPM_OUT="$SCRIPT_DIR/kpm/svc_monitor.kpm"
95+
if [ ! -f "$KPM_OUT" ]; then
96+
echo -e "${RED}[ERROR]${NC} KPM 构建失败:未找到产物 $KPM_OUT"
97+
exit 1
98+
fi
99+
echo -e "${GREEN}[OK]${NC} KPM → $KPM_OUT"
100+
101+
echo -e "${YELLOW}[2/2]${NC} Building APK (app-debug.apk)..."
102+
( cd "$SCRIPT_DIR/android" && "$GRADLE_BIN" -p . :app:assembleDebug --no-daemon -Dkotlin.daemon.enabled=false )
103+
APK_OUT="$SCRIPT_DIR/android/app/build/outputs/apk/debug/app-debug.apk"
104+
if [ ! -f "$APK_OUT" ]; then
105+
echo -e "${RED}[ERROR]${NC} APK 构建失败:未找到产物 $APK_OUT"
106+
exit 1
107+
fi
108+
echo -e "${GREEN}[OK]${NC} APK → $APK_OUT"
78109

79-
# ---- Summary ----
80-
echo ""
81-
echo -e "${GREEN}============================================${NC}"
82-
echo -e "${GREEN} Build Successful!${NC}"
83-
echo -e "${GREEN}============================================${NC}"
84-
echo ""
85-
echo " Output: $KPM"
86-
echo " Size: $(du -h "$KPM" | cut -f1)"
87110
echo ""
88-
echo "To deploy on device:"
89-
echo " 1. adb push $KPM /data/local/tmp/svc_monitor.kpm"
90-
echo " 2. adb shell su -c 'kpatch <superkey> kpm load /data/local/tmp/svc_monitor.kpm'"
111+
echo -e "${GREEN}==================== DONE ====================${NC}"
112+
echo "KPM: $KPM_OUT"
113+
echo "APK: $APK_OUT"
91114
echo ""
92-
echo "To unload:"
93-
echo " adb shell su -c 'kpatch <superkey> kpm unload svc_monitor'"
115+
echo "Deploy KPM:"
116+
echo " adb push \"$KPM_OUT\" /data/local/tmp/svc_monitor.kpm"
117+
echo " adb shell su -c '/data/adb/kpatch <SUPERKEY> kpm load /data/local/tmp/svc_monitor.kpm'"
94118
echo ""
119+
echo "Install APK:"
120+
echo " adb install -r \"$APK_OUT\""

0 commit comments

Comments
 (0)