Files
pangolin/scripts/build-libbox.sh
T
wangjia b23377acde build(scripts): 各端 libbox 构建脚本修正 + 自动部署产物
排查 Android 打包"libbox.aar not found / Unresolved reference nekohasekai"踩坑:
- scripts/build-libbox.sh:
  · 构建后自动部署产物到工程引用位置(android→app/kernel/dist/android/libbox.aar;
    apple→client/{macos,ios}/Frameworks/Libbox.xcframework),不再留 /tmp 让人手动拷
  · android 自动挑 NDK ≥28(未设 ANDROID_NDK_HOME 时):官方 build_libbox 拉 cronet-go,
    其 libcronet.a 在 NDK 27 lld 链接报 unknown relocation(315)失败
  · 头注释补全前置(NDK≥28 / JDK17 / gomobile 入 PATH)与产物路径
- app/kernel/build-android.sh:补 -javapkg io.nekohasekai —— 缺它产出默认包名 `libbox`,
  与 Kotlin 的 io.nekohasekai.libbox 对不上、APK Kotlin 编译失败
- build.gradle:注释指明两条构建途径 + 包名必须 io.nekohasekai.libbox

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 07:53:35 +08:00

84 lines
4.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# build-libbox.sh — 把 sing-box 编成嵌入式核心库(方案B / docs/vpn-core-embedding.md)
#
# 产物:
# apple → Libbox.xcframework (macOS System Extension / iOS Packet Tunnel 链接)
# android→ Libbox.aar (VpnService 集成)
#
# 关键:用 sagernet 的 gomobile **fork**(非上游 golang.org/x/mobile)。
# sing-box 版本必须与节点对齐(当前节点 1.13.13)。
#
# 前置:
# - Go(PATH 中);gomobile/gobind 由本脚本自动 go install 到 $(go env GOPATH)/bin 并加 PATH。
# - Android 还需 Android NDK ≥ 28(未设 ANDROID_NDK_HOME 则自动挑 SDK 里最高版)。
# NDK 27 会因 cronet-go 预编译库链接失败(unknown relocation 315)。JDK 17 用于 bind 末段 javac。
#
# 产物自动部署到工程引用位置(均 gitignore,故每次重建或换 worktree 都要重跑):
# apple → client/macos/Frameworks/Libbox.xcframework + client/ios/Frameworks/Libbox.xcframework
# android→ app/kernel/dist/android/libbox.aar(包名 io.nekohasekai.libbox,build.gradle 读这里)
#
# 用法:
# bash scripts/build-libbox.sh apple macos # 只编 macOS(快)
# bash scripts/build-libbox.sh apple # 全 Apple(ios+sim+tvos+macos,慢)
# bash scripts/build-libbox.sh android # Android aar(需 NDK ≥ 28)
# SINGBOX_VERSION=v1.13.13 WORK=/tmp/x bash scripts/build-libbox.sh apple macos
set -euo pipefail
SINGBOX_VERSION="${SINGBOX_VERSION:-v1.13.13}" # 与节点 sing-box 对齐
TARGET="${1:-apple}" # apple | android
PLATFORM="${2:-}" # macos | ios | "" (全 Apple)
WORK="${WORK:-/tmp/pangolin-libbox}"
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
command -v go >/dev/null || { echo "✗ 需要 Go"; exit 1; }
# ── Android: 选 NDK ─────────────────────────────────────────────────────────
# ⚠️ 官方 build_libbox 会拉 cronet-go(Tailscale 依赖),其预编译 libcronet.a 含新版
# 重定位类型,NDK 27 的 lld 链接报 "unknown relocation (315)" 而失败。**必须 NDK ≥ 28。**
# 未显式设 ANDROID_NDK_HOME 时,自动从 SDK 挑最高版本 NDK。
if [ "$TARGET" = "android" ] && [ -z "${ANDROID_NDK_HOME:-}" ]; then
SDK="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-$HOME/Library/Android/sdk}}"
if [ -d "$SDK/ndk" ]; then
NDK_PICK="$(ls -d "$SDK"/ndk/*/ 2>/dev/null | sort | tail -1)"
[ -n "$NDK_PICK" ] && export ANDROID_NDK_HOME="${NDK_PICK%/}" ANDROID_HOME="$SDK"
fi
fi
[ "$TARGET" = "android" ] && echo " NDK = ${ANDROID_NDK_HOME:-<未找到!gomobile 会失败>}android 需 ≥ 2827 会链接失败)"
echo "==> [1/3] 安装 sagernet/gomobile fork v0.1.12(非上游)"
go install github.com/sagernet/gomobile/cmd/gomobile@v0.1.12
go install github.com/sagernet/gomobile/cmd/gobind@v0.1.12
export PATH="$PATH:$(go env GOPATH)/bin"
gomobile init
echo "==> [2/3] 拉 sing-box $SINGBOX_VERSION 源码"
mkdir -p "$WORK"
rm -rf "$WORK/sing-box"
git clone --depth 1 --branch "$SINGBOX_VERSION" https://github.com/SagerNet/sing-box.git "$WORK/sing-box"
cd "$WORK/sing-box"
echo "==> [3/3] 用官方 build_libbox 编核心库"
if [ "$TARGET" = "apple" ]; then
if [ -n "$PLATFORM" ]; then
go run ./cmd/internal/build_libbox -target apple -platform "$PLATFORM"
else
go run ./cmd/internal/build_libbox -target apple
fi
echo "✅ 产物: $WORK/sing-box/Libbox.xcframework"
# 部署到工程引用位置(client/{macos,ios}/Frameworks/Libbox.xcframework,均 gitignore)。
for fw in "$REPO_ROOT/client/macos/Frameworks" "$REPO_ROOT/client/ios/Frameworks"; do
mkdir -p "$fw"
rm -rf "$fw/Libbox.xcframework"
cp -R "$WORK/sing-box/Libbox.xcframework" "$fw/"
echo " → 已部署 $fw/Libbox.xcframework"
done
else
go run ./cmd/internal/build_libbox -target android
echo "✅ 产物: $WORK/sing-box/Libbox.aar"
# 部署到 build.gradle 引用位置(app/kernel/dist/android/libbox.aar,gitignore)。
# ⚠️ 注意大小写/文件名:gradle 读的是小写 libbox.aar。
mkdir -p "$REPO_ROOT/app/kernel/dist/android"
cp "$WORK/sing-box/Libbox.aar" "$REPO_ROOT/app/kernel/dist/android/libbox.aar"
echo " → 已部署 $REPO_ROOT/app/kernel/dist/android/libbox.aar(包名 io.nekohasekai.libbox"
fi