From 5d820b88ef7a4c5d19c49806b8492bf1ebba7fc5 Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Sat, 15 Jul 2023 12:25:18 +0800 Subject: [PATCH] Publish pre-compiled libs for Android. (#217) --- .github/workflows/android.yaml | 144 +++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 +- build-android-arm64-v8a.sh | 9 ++- build-android-armv7-eabi.sh | 8 +- build-android-x86-64.sh | 8 +- build-android-x86.sh | 90 +++++++++++++++++++++ release.sh | 63 ++------------- 7 files changed, 260 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/android.yaml create mode 100755 build-android-x86.sh diff --git a/.github/workflows/android.yaml b/.github/workflows/android.yaml new file mode 100644 index 00000000..3f9f63b0 --- /dev/null +++ b/.github/workflows/android.yaml @@ -0,0 +1,144 @@ +name: android + +on: + push: + branches: + - master + paths: + - '.github/workflows/android.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'sherpa-onnx/jni/*' + - 'build-android*.sh' + pull_request: + branches: + - master + paths: + - '.github/workflows/android.yaml' + - 'CMakeLists.txt' + - 'cmake/**' + - 'sherpa-onnx/csrc/*' + - 'sherpa-onnx/jni/*' + - 'build-android*.sh' + + release: + types: + - published + + workflow_dispatch: + inputs: + release: + description: "Whether to release" + type: boolean + +env: + RELEASE: + |- # Release if there is a release tag name or a release flag in workflow_dispatch + ${{ github.event.release.tag_name != '' || github.event.inputs.release == 'true' }} + +concurrency: + group: android-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-android-libs: + name: Android for ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Display NDK HOME + shell: bash + run: | + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}" + ls -lh ${ANDROID_NDK_LATEST_HOME} + + - name: build android arm64-v8a + shell: bash + run: | + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME + ./build-android-arm64-v8a.sh + mkdir -p jniLibs/arm64-v8a/ + cp -v ./build-android-arm64-v8a/install/lib/*.so ./jniLibs/arm64-v8a/ + + - name: build android armv7-eabi + shell: bash + run: | + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME + ./build-android-armv7-eabi.sh + mkdir -p ./jniLibs/armeabi-v7a/ + cp -v ./build-android-armv7-eabi/install/lib/*.so ./jniLibs/armeabi-v7a/ + + - name: build android x86_64 + shell: bash + run: | + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME + ./build-android-x86-64.sh + mkdir -p ./jniLibs/x86_64 + cp -v ./build-android-x86-64/install/lib/*.so ./jniLibs/x86_64 + + - name: build android x86 + shell: bash + run: | + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME + ./build-android-x86.sh + mkdir -p ./jniLibs/x86 + cp -v ./build-android-x86/install/lib/*.so ./jniLibs/x86 + + - name: Copy files + shell: bash + run: | + SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2) + echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV" + + filename=sherpa-onnx-${SHERPA_ONNX_VERSION}-android.tar.bz2 + + tar cjvf $filename ./jniLibs + + ls -lh + + - uses: actions/upload-artifact@v2 + with: + name: sherpa-onnx-android-libs + path: ./jniLibs + + # https://huggingface.co/docs/hub/spaces-github-actions + - name: Publish to huggingface + if: github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa' && env.RELEASE == 'true' + env: + HF_TOKEN: ${{ secrets.HF_TOKEN }} + run: | + git config --global user.email "csukuangfj@gmail.com" + git config --global user.name "Fangjun Kuang" + + GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/csukuangfj/sherpa-onnx-libs huggingface + + cd huggingface + git lfs pull + + cp -v ../sherpa-onnx-*-android.tar.bz2 ./ + + git status + git lfs track "*.bz2" + + git add . + + git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-android.tar.bz2" + + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main + + - name: Release android libs + if: env.RELEASE == 'true' + uses: svenstaro/upload-release-action@v2 + with: + file_glob: true + overwrite: true + file: sherpa-onnx-*-android.tar.bz2 diff --git a/CMakeLists.txt b/CMakeLists.txt index a5d86c7c..e2d3dacf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR) project(sherpa-onnx) -set(SHERPA_ONNX_VERSION "1.5.2") +set(SHERPA_ONNX_VERSION "1.5.3") # Disable warning about # diff --git a/build-android-arm64-v8a.sh b/build-android-arm64-v8a.sh index 7090db4f..5cb071cd 100755 --- a/build-android-arm64-v8a.sh +++ b/build-android-arm64-v8a.sh @@ -42,15 +42,18 @@ fi echo "ANDROID_NDK: $ANDROID_NDK" sleep 1 +onnxruntime_version=v1.15.1 -if [ ! -f ./android-onnxruntime-libs/jni/arm64-v8a/libonnxruntime.so ]; then +if [ ! -f ./android-onnxruntime-libs/$onnxruntime_version/jni/arm64-v8a/libonnxruntime.so ]; then GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/csukuangfj/android-onnxruntime-libs pushd android-onnxruntime-libs - git lfs pull --include "jni/arm64-v8a/libonnxruntime.so" + git lfs pull --include "$onnxruntime_version/jni/arm64-v8a/libonnxruntime.so" + ln -s $onnxruntime_version/jni . + ln -s $onnxruntime_version/headers . popd fi -ls -l ./android-onnxruntime-libs/jni/arm64-v8a/libonnxruntime.so +ls -lh ./android-onnxruntime-libs/jni/arm64-v8a/libonnxruntime.so # check filesize filesize=$(ls -l ./android-onnxruntime-libs/jni/arm64-v8a/libonnxruntime.so | tr -s " " " " | cut -d " " -f 5) diff --git a/build-android-armv7-eabi.sh b/build-android-armv7-eabi.sh index ad754794..6b712f45 100755 --- a/build-android-armv7-eabi.sh +++ b/build-android-armv7-eabi.sh @@ -43,10 +43,14 @@ fi echo "ANDROID_NDK: $ANDROID_NDK" sleep 1 -if [ ! -f ./android-onnxruntime-libs/jni/armeabi-v7a/libonnxruntime.so ]; then +onnxruntime_version=v1.15.1 + +if [ ! -f ./android-onnxruntime-libs/$onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so ]; then GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/csukuangfj/android-onnxruntime-libs pushd android-onnxruntime-libs - git lfs pull --include "jni/armeabi-v7a/libonnxruntime.so" + git lfs pull --include "$onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so" + ln -s $onnxruntime_version/jni . + ln -s $onnxruntime_version/headers . popd fi diff --git a/build-android-x86-64.sh b/build-android-x86-64.sh index 9749cef6..a2aea069 100755 --- a/build-android-x86-64.sh +++ b/build-android-x86-64.sh @@ -43,10 +43,14 @@ fi echo "ANDROID_NDK: $ANDROID_NDK" sleep 1 -if [ ! -f ./android-onnxruntime-libs/jni/x86_64/libonnxruntime.so ]; then +onnxruntime_version=v1.15.1 + +if [ ! -f ./android-onnxruntime-libs/$onnxruntime_version/jni/x86_64/libonnxruntime.so ]; then GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/csukuangfj/android-onnxruntime-libs pushd android-onnxruntime-libs - git lfs pull --include "jni/x86_64/libonnxruntime.so" + git lfs pull --include "$onnxruntime_version/jni/x86_64/libonnxruntime.so" + ln -s $onnxruntime_version/jni . + ln -s $onnxruntime_version/headers . popd fi diff --git a/build-android-x86.sh b/build-android-x86.sh new file mode 100755 index 00000000..62078642 --- /dev/null +++ b/build-android-x86.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +set -ex + +dir=$PWD/build-android-x86 + +mkdir -p $dir +cd $dir + +# Note from https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-android +# (optional) remove the hardcoded debug flag in Android NDK android-ndk +# issue: https://github.com/android/ndk/issues/243 +# +# open $ANDROID_NDK/build/cmake/android.toolchain.cmake for ndk < r23 +# or $ANDROID_NDK/build/cmake/android-legacy.toolchain.cmake for ndk >= r23 +# +# delete "-g" line +# +# list(APPEND ANDROID_COMPILER_FLAGS +# -g +# -DANDROID + +if [ -z $ANDROID_NDK ]; then + ANDROID_NDK=/ceph-fj/fangjun/software/android-sdk/ndk/21.0.6113669 + # or use + # ANDROID_NDK=/ceph-fj/fangjun/software/android-ndk + # + # Inside the $ANDROID_NDK directory, you can find a binary ndk-build + # and some other files like the file "build/cmake/android.toolchain.cmake" + + if [ ! -d $ANDROID_NDK ]; then + # For macOS, I have installed Android Studio, select the menu + # Tools -> SDK manager -> Android SDK + # and set "Android SDK location" to /Users/fangjun/software/my-android + ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670 + fi +fi + +if [ ! -d $ANDROID_NDK ]; then + echo Please set the environment variable ANDROID_NDK before you run this script + exit 1 +fi + +echo "ANDROID_NDK: $ANDROID_NDK" +sleep 1 + +onnxruntime_version=v1.15.1 + +if [ ! -f ./android-onnxruntime-libs/$onnxruntime_version/jni/x86/libonnxruntime.so ]; then + GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/csukuangfj/android-onnxruntime-libs + pushd android-onnxruntime-libs + git lfs pull --include "$onnxruntime_version/jni/x86/libonnxruntime.so" + ln -s $onnxruntime_version/jni . + ln -s $onnxruntime_version/headers . + popd +fi + +ls -l ./android-onnxruntime-libs/jni/x86/libonnxruntime.so + +# check filesize +filesize=$(ls -l ./android-onnxruntime-libs/jni/x86/libonnxruntime.so | tr -s " " " " | cut -d " " -f 5) +if (( $filesize < 1000 )); then + ls -lh ./android-onnxruntime-libs/jni/x86/libonnxruntime.so + echo "Please use: git lfs pull to download libonnxruntime.so" + exit 1 +fi + +export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/android-onnxruntime-libs/jni/x86/ +export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/android-onnxruntime-libs/headers/ + +echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" +echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" + +cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ + -DSHERPA_ONNX_ENABLE_TESTS=OFF \ + -DSHERPA_ONNX_ENABLE_CHECK=OFF \ + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ + -DSHERPA_ONNX_ENABLE_JNI=ON \ + -DCMAKE_INSTALL_PREFIX=./install \ + -DANDROID_ABI="x86" \ + -DSHERPA_ONNX_ENABLE_C_API=OFF \ + -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \ + -DANDROID_PLATFORM=android-21 .. + +# make VERBOSE=1 -j4 +make -j4 +make install/strip +cp -fv android-onnxruntime-libs/jni/x86/libonnxruntime.so install/lib diff --git a/release.sh b/release.sh index b36b77a7..b8e5b620 100755 --- a/release.sh +++ b/release.sh @@ -14,9 +14,10 @@ if [ -d $dst ]; then exit 0 fi -./build-android-x86-64.sh +./build-android-arm64-v8a.sh ./build-android-armv7-eabi.sh ./build-android-x86-64.sh +./build-android-x86.sh ./build-ios.sh mkdir -p $dst/jniLibs/arm64-v8a @@ -28,6 +29,9 @@ cp -v ./build-android-armv7-eabi/install/lib/*.so $dst/jniLibs/armeabi-v7a/ mkdir -p $dst/jniLibs/x86_64 cp -v ./build-android-x86-64/install/lib/*.so $dst/jniLibs/x86_64 +mkdir -p $dst/jniLibs/x86 +cp -v ./build-android-x86/install/lib/*.so $dst/jniLibs/x86 + mkdir -p $dst/build-ios/ cp -av ./build-ios/sherpa-onnx.xcframework $dst/build-ios/ @@ -36,59 +40,6 @@ cp -av ./build-ios/ios-onnxruntime/onnxruntime.xcframework $dst/build-ios/ios-on cd $dst -tar cjvf sherpa-onnx-v${SHERPA_ONNX_VERSION}-pre-compiled-android-libs.tar.bz2 ./jniLibs +tar cjvf sherpa-onnx-v${SHERPA_ONNX_VERSION}-android.tar.bz2 ./jniLibs -tar cjvf sherpa-onnx-v${SHERPA_ONNX_VERSION}-pre-compiled-ios-libs.tar.bz2 ./build-ios - -# . -# ├── build-ios -# │   ├── ios-onnxruntime -# │   │   └── onnxruntime.xcframework -# │   │   ├── Headers -# │   │   │   ├── cpu_provider_factory.h -# │   │   │   ├── onnxruntime_c_api.h -# │   │   │   ├── onnxruntime_cxx_api.h -# │   │   │   └── onnxruntime_cxx_inline.h -# │   │   ├── Info.plist -# │   │   ├── ios-arm64 -# │   │   │   ├── libonnxruntime.a -> onnxruntime.a -# │   │   │   └── onnxruntime.a -# │   │   └── ios-arm64_x86_64-simulator -# │   │   ├── libonnxruntime.a -> onnxruntime.a -# │   │   └── onnxruntime.a -# │   └── sherpa-onnx.xcframework -# │   ├── Headers -# │   │   └── sherpa-onnx -# │   │   └── c-api -# │   │   └── c-api.h -# │   ├── Info.plist -# │   ├── ios-arm64 -# │   │   ├── libsherpa-onnx.a -> sherpa-onnx.a -# │   │   └── sherpa-onnx.a -# │   └── ios-arm64_x86_64-simulator -# │   ├── libsherpa-onnx.a -> sherpa-onnx.a -# │   └── sherpa-onnx.a -# ├── jniLibs -# │   ├── arm64-v8a -# │   │   ├── libkaldi-native-fbank-core.so -# │   │   ├── libonnxruntime.so -# │   │   ├── libsherpa-onnx-c-api.so -# │   │   ├── libsherpa-onnx-core.so -# │   │   └── libsherpa-onnx-jni.so -# │   ├── armeabi-v7a -# │   │   ├── libkaldi-native-fbank-core.so -# │   │   ├── libonnxruntime.so -# │   │   ├── libsherpa-onnx-c-api.so -# │   │   ├── libsherpa-onnx-core.so -# │   │   └── libsherpa-onnx-jni.so -# │   └── x86_64 -# │   ├── libkaldi-native-fbank-core.so -# │   ├── libonnxruntime.so -# │   ├── libsherpa-onnx-core.so -# │   └── libsherpa-onnx-jni.so -# ├── sherpa-onnx-v1.4.1-pre-compiled-android-libs.tar.bz2 -# └── sherpa-onnx-v1.4.1-pre-compiled-ios-libs.tar.bz2 -# -# 16 directories, 31 files -# -# 1.4.1 is the current version listed in ./CMakeLists.txt +tar cjvf sherpa-onnx-v${SHERPA_ONNX_VERSION}-ios.tar.bz2 ./build-ios