Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support linking onnxruntime statically for Android #1619

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
298 changes: 298 additions & 0 deletions .github/workflows/android-static.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,298 @@
# static means we link onnxruntime statically
# but we still have libsherpa-onnx-jni.so
name: android-static

on:
push:
branches:
- master
- android-link-onnxruntime-statically
paths:
- '.github/workflows/android-static.yaml'
- 'CMakeLists.txt'
- 'cmake/**'
- 'sherpa-onnx/csrc/*'
- 'sherpa-onnx/jni/*'
- 'build-android*.sh'
tags:
- 'v[0-9]+.[0-9]+.[0-9]+*'
pull_request:
branches:
- master
paths:
- '.github/workflows/android-static.yaml'
- 'CMakeLists.txt'
- 'cmake/**'
- 'sherpa-onnx/csrc/*'
- 'sherpa-onnx/jni/*'
- 'build-android*.sh'

workflow_dispatch:

concurrency:
group: android-static-${{ github.ref }}
cancel-in-progress: true

jobs:
build-android-static-libs:
name: Android static libs
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: ccache
uses: hendrikmuhs/[email protected]
with:
key: ${{ matrix.os }}-android-jni-static

- 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 BUILD_SHARED_LIBS=OFF

export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
./build-android-arm64-v8a.sh
mkdir -p jniLibs/arm64-v8a/
cp -v ./build-android-arm64-v8a-static/install/lib/*.so ./jniLibs/arm64-v8a/
rm -rf ./build-android-arm64-v8a-static/

- name: build android armv7-eabi
shell: bash
run: |
export BUILD_SHARED_LIBS=OFF

export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
./build-android-armv7-eabi.sh
mkdir -p ./jniLibs/armeabi-v7a/
cp -v ./build-android-armv7-eabi-static/install/lib/*.so ./jniLibs/armeabi-v7a/
rm -rf ./build-android-armv7-eabi-static

- name: build android x86_64
shell: bash
run: |
export BUILD_SHARED_LIBS=OFF

export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
./build-android-x86-64.sh
mkdir -p ./jniLibs/x86_64
cp -v ./build-android-x86-64-static/install/lib/*.so ./jniLibs/x86_64
rm -rf ./build-android-x86-64-static

- name: build android x86
shell: bash
run: |
export BUILD_SHARED_LIBS=OFF

export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

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
rm -rf ./build-android-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-static-link-onnxruntime.tar.bz2

tar cjvf $filename ./jniLibs

ls -lh

- uses: actions/upload-artifact@v4
with:
name: sherpa-onnx-android-libs-static
path: ./jniLibs

# https://huggingface.co/docs/hub/spaces-github-actions
- name: Publish to huggingface
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
uses: nick-fields/retry@v3
with:
max_attempts: 20
timeout_seconds: 200
shell: bash
command: |
git config --global user.email "[email protected]"
git config --global user.name "Fangjun Kuang"
du -h -d1 .
ls -lh

rm -rf huggingface
export GIT_CLONE_PROTECTION_ACTIVE=false
GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:[email protected]/csukuangfj/sherpa-onnx-libs huggingface

cd huggingface

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:[email protected]/csukuangfj/sherpa-onnx-libs main

- name: Release android libs
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
uses: svenstaro/upload-release-action@v2
with:
file_glob: true
overwrite: true
file: sherpa-onnx-*-android*.tar.bz2

build-android-aar-static:
needs: [build-android-static-libs]
name: Android AAR
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

# https://github.com/actions/setup-java
- uses: actions/setup-java@v4
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '21'

- name: Display NDK HOME
shell: bash
run: |
echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
ls -lh ${ANDROID_NDK_LATEST_HOME}

- name: Retrieve artifact
uses: actions/download-artifact@v4
with:
name: sherpa-onnx-android-libs-static
path: /tmp/jniLibs

- name: Show jni libs
shell: bash
run: |
ls -lh /tmp/jniLibs

# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 arm64-v8a
# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 armeabi-v7a
# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 x86
# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 x86_64
#
- name: Copy libs
shell: bash
run: |
for arch in arm64-v8a armeabi-v7a x86 x86_64; do
cp -v /tmp/jniLibs/$arch/* android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/$arch/
done

- name: Check libs
shell: bash
run: |
ls -lh android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/*

- name: Build aar
shell: bash
run: |
cd android/SherpaOnnxAar

./gradlew :sherpa_onnx:assembleRelease

- name: Display aar
shell: bash
run: |
cd android/SherpaOnnxAar

ls -lh ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar
cp ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar ../../

- name: Rename aar
shell: bash
run: |
SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"

mv sherpa_onnx-release.aar sherpa-onnx-static-link-onnxruntime-${SHERPA_ONNX_VERSION}.aar

- uses: actions/upload-artifact@v4
with:
name: sherpa-onnx-android-aar-static
path: ./*.aar

# https://huggingface.co/docs/hub/spaces-github-actions
- name: Publish to huggingface
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
uses: nick-fields/retry@v3
with:
max_attempts: 20
timeout_seconds: 200
shell: bash
command: |
git config --global user.email "[email protected]"
git config --global user.name "Fangjun Kuang"
du -h -d1 .
ls -lh

rm -rf huggingface
export GIT_CLONE_PROTECTION_ACTIVE=false
GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:[email protected]/csukuangfj/sherpa-onnx-libs huggingface

cd huggingface
dst=android/aar
mkdir -p $dst

cp -v ../*.aar $dst

git status
git lfs track "*.aar"

git add .

git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}.aar"

git push https://csukuangfj:[email protected]/csukuangfj/sherpa-onnx-libs main

- name: Release android aar
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
uses: svenstaro/upload-release-action@v2
with:
file_glob: true
overwrite: true
file: ./*.aar
7 changes: 1 addition & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,6 @@ if(SHERPA_ONNX_ENABLE_PYTHON AND NOT BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
endif()

if(SHERPA_ONNX_ENABLE_JNI AND NOT BUILD_SHARED_LIBS)
message(STATUS "Set BUILD_SHARED_LIBS to ON since SHERPA_ONNX_ENABLE_JNI is ON")
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
endif()

if(SHERPA_ONNX_ENABLE_GPU)
message(WARNING "\
Compiling for NVIDIA GPU is enabled. Please make sure cudatoolkit
Expand Down Expand Up @@ -157,7 +152,7 @@ message(STATUS "SHERPA_ONNX_USE_PRE_INSTALLED_ONNXRUNTIME_IF_AVAILABLE ${SHERPA_
message(STATUS "SHERPA_ONNX_ENABLE_SANITIZER: ${SHERPA_ONNX_ENABLE_SANITIZER}")
message(STATUS "SHERPA_ONNX_BUILD_C_API_EXAMPLES: ${SHERPA_ONNX_BUILD_C_API_EXAMPLES}")

if(BUILD_SHARED_LIBS)
if(BUILD_SHARED_LIBS OR SHERPA_ONNX_ENABLE_JNI)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
Expand Down
Loading
Loading