Feat: Android client Phase 0-3 full implementation
This commit is contained in:
77
android/build_zstd_android.sh
Normal file
77
android/build_zstd_android.sh
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env bash
|
||||
# build_zstd_android.sh - 为 Android 交叉编译 libzstd.a
|
||||
# 与 linux/lib/libzstd.a 版本对齐(1.5.6)
|
||||
#
|
||||
# 用法:
|
||||
# ./build_zstd_android.sh # 自动查找 NDK
|
||||
# ANDROID_NDK=/path/to/ndk ./build_zstd_android.sh
|
||||
#
|
||||
# 产出:
|
||||
# app/src/main/cpp/lib/arm64-v8a/libzstd.a
|
||||
# app/src/main/cpp/lib/armeabi-v7a/libzstd.a
|
||||
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
ZSTD_VERSION="1.5.6"
|
||||
ZSTD_TAR="zstd-${ZSTD_VERSION}.tar.gz"
|
||||
ZSTD_URL="https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/${ZSTD_TAR}"
|
||||
ZSTD_DIR="zstd-${ZSTD_VERSION}"
|
||||
|
||||
# --- 定位 NDK ---
|
||||
if [[ -z "${ANDROID_NDK:-}" ]]; then
|
||||
for candidate in \
|
||||
"$HOME/android-ndk-r27c" \
|
||||
"$HOME/Library/Android/sdk/ndk/$(ls "$HOME/Library/Android/sdk/ndk" 2>/dev/null | sort -V | tail -1)" \
|
||||
"$HOME/Android/Sdk/ndk/$(ls "$HOME/Android/Sdk/ndk" 2>/dev/null | sort -V | tail -1)"; do
|
||||
if [[ -f "${candidate}/build/cmake/android.toolchain.cmake" ]]; then
|
||||
ANDROID_NDK="$candidate"; break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
[[ -z "${ANDROID_NDK:-}" ]] && { echo "Error: ANDROID_NDK not set"; exit 1; }
|
||||
TOOLCHAIN="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
|
||||
echo "NDK: $ANDROID_NDK"
|
||||
|
||||
# --- 下载 zstd 源码 ---
|
||||
if [[ ! -d "$ZSTD_DIR" ]]; then
|
||||
echo "Downloading zstd $ZSTD_VERSION..."
|
||||
wget -q "$ZSTD_URL" -O "$ZSTD_TAR"
|
||||
tar xf "$ZSTD_TAR"
|
||||
rm "$ZSTD_TAR"
|
||||
fi
|
||||
|
||||
OUT_BASE="app/src/main/cpp/lib"
|
||||
ABIS=("arm64-v8a" "armeabi-v7a")
|
||||
for ABI in "${ABIS[@]}"; do
|
||||
BUILD_DIR="zstd_build/$ABI"
|
||||
OUT_DIR="$OUT_BASE/$ABI"
|
||||
rm -rf "$BUILD_DIR"
|
||||
echo
|
||||
echo "===== zstd $ABI ====="
|
||||
cmake \
|
||||
-B "$BUILD_DIR" -S "$ZSTD_DIR/build/cmake" \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN" \
|
||||
-DANDROID_ABI="$ABI" \
|
||||
-DANDROID_PLATFORM=android-21 \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_FLAGS="-Os -g0" \
|
||||
-DZSTD_BUILD_STATIC=ON \
|
||||
-DZSTD_BUILD_SHARED=OFF \
|
||||
-DZSTD_BUILD_PROGRAMS=OFF \
|
||||
-DZSTD_BUILD_TESTS=OFF \
|
||||
-DZSTD_LEGACY_SUPPORT=0
|
||||
cmake --build "$BUILD_DIR" --config Release -j"$(nproc 2>/dev/null || sysctl -n hw.logicalcpu)"
|
||||
mkdir -p "$OUT_DIR"
|
||||
cp "$BUILD_DIR/lib/libzstd.a" "$OUT_DIR/libzstd.a"
|
||||
# strip residual debug symbols from the archive
|
||||
STRIP="$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip"
|
||||
[[ -f "$STRIP" ]] && "$STRIP" --strip-debug "$OUT_DIR/libzstd.a"
|
||||
ls -lh "$OUT_DIR/libzstd.a"
|
||||
done
|
||||
|
||||
rm -rf zstd_build "$ZSTD_DIR"
|
||||
|
||||
echo
|
||||
echo "===== Done ====="
|
||||
echo "libzstd.a 已写入 app/src/main/cpp/lib/{arm64-v8a,armeabi-v7a}/"
|
||||
Reference in New Issue
Block a user