#!/bin/sh # 123 · 121: Android (arm64) 용 stable-diffusion.cpp 의 sd-cli 를 소스에서 빌드해 # third_party/sdcpp/android/arm64-v8a/libsdcli.so 로 둔다 (APK 의 jniLibs 로 들어가 앱의 네이티브 라이브러리 폴더에서 실행된다 - # Android 10+ 는 앱 데이터 폴더의 파일을 실행할 수 없으므로 받아서 쓰지 않는다). # 소스: https://github.com/leejet/stable-diffusion.cpp (MIT) 커밋 고정 - Windows 실행 파일 (ai_catalog.dart 의 sdCppVersion) 과 같은 판 # CPU 만 (OpenMP 는 끈다). 두 벌 (195): # v82 (기본) = armv8.2-a + dotprod · i8mm · fp16 → libsdcli.so (빠름, S10 · 노트 10+ 등) # v80 = armv8-a (dotprod · fp16 없는 보급형 CPU, 예: Snapdragon 662) → libsdcli_v80.so # 앱은 /proc/cpuinfo 의 asimddp · fphp 를 보고 고른다 (lib/app/ai_local.dart sdCli). v82 를 v8.0 CPU 에서 돌리면 SIGILL 로 죽는다. # 사용법 (Git Bash): sh tool/build_sdcpp_android.sh [v82|v80] - Android NDK · SDK 의 cmake (tools/android-sdk) 가 필요 set -e VARIANT=${1:-v82} case "$VARIANT" in v82) ARCH=armv8.2-a+dotprod+i8mm+fp16; NAME=libsdcli.so ;; v80) ARCH=armv8-a; NAME=libsdcli_v80.so ;; *) echo "모르는 판: $VARIANT (v82 · v80)"; exit 1 ;; esac APP=$(cd "$(dirname "$0")/.." && pwd) COMMIT=228c707fde018221de74674f1c2f480a9d2b228e SHORT=228c707 NDK_ROOT=${ANDROID_NDK:-$(ls -d "$APP"/../tools/android-sdk/ndk/* | sort | tail -1)} CMAKE_DIR=$(ls -d "$APP"/../tools/android-sdk/cmake/* | sort | tail -1)/bin case "$(uname -s)" in MINGW*|MSYS*|CYGWIN*) HOST=windows-x86_64; EXE=.exe ;; Darwin) HOST=darwin-x86_64; EXE= ;; *) HOST=linux-x86_64; EXE= ;; esac TC=$NDK_ROOT/toolchains/llvm/prebuilt/$HOST/bin WORK=${SDCPP_WORK:-${TMPDIR:-/tmp}/jj_sdcpp_android} if [ ! -d "$WORK/src/.git" ]; then rm -rf "$WORK" && mkdir -p "$WORK" git clone --recursive https://github.com/leejet/stable-diffusion.cpp.git "$WORK/src" fi cd "$WORK/src" git fetch --depth 1 origin "$COMMIT" 2>/dev/null || git fetch origin git checkout -q "$COMMIT" 2>/dev/null || git checkout -q "$SHORT" git submodule update --init --recursive PATH="$CMAKE_DIR:$PATH" cmake -S . -B build-android-$VARIANT -G Ninja -DCMAKE_MAKE_PROGRAM="$CMAKE_DIR/ninja$EXE" \ -DCMAKE_TOOLCHAIN_FILE="$NDK_ROOT/build/cmake/android.toolchain.cmake" \ -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-28 -DCMAKE_BUILD_TYPE=Release \ -DGGML_OPENMP=OFF -DGGML_CPU_ARM_ARCH=$ARCH > cmake-$VARIANT.log cmake --build build-android-$VARIANT --target sd-cli -j 8 > build-$VARIANT.log 2>&1 OUT="$APP/third_party/sdcpp/android/arm64-v8a" mkdir -p "$OUT" "$TC/llvm-strip$EXE" -o "$OUT/$NAME" build-android-$VARIANT/bin/sd-cli ls -l "$OUT/$NAME"