From 6cfbf1bc0a776e3dc96c9ac3638ccb97bdadbaee Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 15:20:28 -0700 Subject: [PATCH 1/5] Just build AAR in place --- .../android/executorch_android/build.gradle | 3 ++ scripts/build_android_library.sh | 44 ++++++++----------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/extension/android/executorch_android/build.gradle b/extension/android/executorch_android/build.gradle index 913a011406d..70e18289442 100644 --- a/extension/android/executorch_android/build.gradle +++ b/extension/android/executorch_android/build.gradle @@ -27,6 +27,9 @@ android { } sourceSets { + main { + jniLibs.srcDirs = ['../../../cmake-out-android-so/'] + } androidTest { resources.srcDirs += [ 'src/androidTest/resources' ] } diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 8a385ad6876..4572b7c4618 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -12,11 +12,6 @@ if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then fi which "${PYTHON_EXECUTABLE}" -copy_src() { - cp -r extension/android/build.gradle extension/android/settings.gradle extension/android/gradlew extension/android/gradle extension/android/gradlew.bat extension/android/gradle.properties "${BUILD_AAR_DIR}" - cp -r extension/android/executorch_android "${BUILD_AAR_DIR}/executorch_android" -} - build_android_native_library() { ANDROID_ABI="$1" ANDROID_NDK="${ANDROID_NDK:-/opt/ndk}" @@ -93,40 +88,37 @@ build_android_native_library() { cmake --build "${CMAKE_OUT}"/extension/android -j "${CMAKE_JOBS}" --config "${EXECUTORCH_CMAKE_BUILD_TYPE}" # Copy artifacts to ABI specific directory - mkdir -p "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}" - cp "${CMAKE_OUT}"/extension/android/*.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" + mkdir -p "cmake-out-android-so/${ANDROID_ABI}" + cp "${CMAKE_OUT}"/extension/android/*.so "cmake-out-android-so/${ANDROID_ABI}/libexecutorch.so" # Copy QNN related so library if [ -n "$QNN_SDK_ROOT" ] && [ "$ANDROID_ABI" == "arm64-v8a" ]; then - cp "${CMAKE_OUT}"/lib/libqnn_executorch_backend.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtp.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnSystem.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV69Stub.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV73Stub.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV75Stub.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so "${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/" + cp "${CMAKE_OUT}"/lib/libqnn_executorch_backend.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtp.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnSystem.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV69Stub.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV73Stub.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV75Stub.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${QNN_SDK_ROOT}"/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so "cmake-out-android-so/${ANDROID_ABI}/" fi # Copy MTK related so library if [ -n "$NEURON_BUFFER_ALLOCATOR_LIB" ] && [ -n "$NEURON_USDK_ADAPTER_LIB" ] && [ "$ANDROID_ABI" == "arm64-v8a" ]; then - cp "${CMAKE_OUT}"/backends/mediatek/libneuron_backend.so ${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/ - cp "${NEURON_BUFFER_ALLOCATOR_LIB}" ${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/ - cp "${NEURON_USDK_ADAPTER_LIB}" ${BUILD_AAR_DIR}/executorch_android/src/main/jniLibs/${ANDROID_ABI}/ + cp "${CMAKE_OUT}"/backends/mediatek/libneuron_backend.so cmake-out-android-so/${ANDROID_ABI}/ + cp "${NEURON_BUFFER_ALLOCATOR_LIB}" cmake-out-android-so/${ANDROID_ABI}/ + cp "${NEURON_USDK_ADAPTER_LIB}" cmake-out-android-so/${ANDROID_ABI}/ fi } build_aar() { - pushd "${BUILD_AAR_DIR}" - # Rename libexecutorch_jni.so to libexecutorch.so for soname consistency - # between Java and JNI - find . -type f -name "libexecutorch_jni.so" -exec bash -c 'mv "$1" "${1/_jni/}"' bash {} \; if [ "$EXECUTORCH_CMAKE_BUILD_TYPE" == "Release" ]; then - find . -type f -name "*.so" -exec "$ANDROID_NDK"/toolchains/llvm/prebuilt/*/bin/llvm-strip {} \; + find cmake-out-android-so -type f -name "*.so" -exec "$ANDROID_NDK"/toolchains/llvm/prebuilt/*/bin/llvm-strip {} \; fi + pushd extension/android/ ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew build - cp executorch_android/build/outputs/aar/executorch_android-debug.aar executorch.aar + cp executorch_android/build/outputs/aar/executorch_android-debug.aar "${BUILD_AAR_DIR}/executorch.aar" popd } @@ -140,7 +132,7 @@ main() { fi export ANDROID_ABIS - copy_src + mkdir -p cmake-out-android-so/ for ANDROID_ABI in "${ANDROID_ABIS[@]}"; do build_android_native_library ${ANDROID_ABI} done From 6936bb0e514647b0cff41c2042aad35e6024fa63 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 15:58:06 -0700 Subject: [PATCH 2/5] Fix --- scripts/build_android_library.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 4572b7c4618..52725a38927 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -127,6 +127,7 @@ main() { BUILD_AAR_DIR="$(mktemp -d)" fi export BUILD_AAR_DIR + mkdir -p $BUILD_AAR_DIR if [ -z "$ANDROID_ABIS" ]; then ANDROID_ABIS=("arm64-v8a" "x86_64") fi From 6dc1850aa29d965243b63865fe184b50e4e2d36f Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 16:03:06 -0700 Subject: [PATCH 3/5] Fix --- scripts/build_android_library.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 52725a38927..61c19723ec1 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -118,8 +118,8 @@ build_aar() { fi pushd extension/android/ ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew build - cp executorch_android/build/outputs/aar/executorch_android-debug.aar "${BUILD_AAR_DIR}/executorch.aar" popd + cp extension/android/executorch_android/build/outputs/aar/executorch_android-debug.aar "${BUILD_AAR_DIR}/executorch.aar" } main() { From 4e879bf8a71e37430352727e9492f1ed77f56977 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 16:07:42 -0700 Subject: [PATCH 4/5] Fix instrumentation setup --- .ci/scripts/build_android_instrumentation.sh | 6 +++--- .github/workflows/_android.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.ci/scripts/build_android_instrumentation.sh b/.ci/scripts/build_android_instrumentation.sh index 5e074d9e215..747dd7063a2 100644 --- a/.ci/scripts/build_android_instrumentation.sh +++ b/.ci/scripts/build_android_instrumentation.sh @@ -12,10 +12,10 @@ if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then fi which "${PYTHON_EXECUTABLE}" -mkdir -p "${BUILD_AAR_DIR}"/executorch_android/src/androidTest/resources -cp extension/module/test/resources/add.pte "${BUILD_AAR_DIR}"/executorch_android/src/androidTest/resources +mkdir -p extension/android/executorch_android/src/androidTest/resources +cp extension/module/test/resources/add.pte extension/android/executorch_android/src/androidTest/resources -pushd "${BUILD_AAR_DIR}" +pushd extension/android ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:testDebugUnitTest ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:assembleAndroidTest popd diff --git a/.github/workflows/_android.yml b/.github/workflows/_android.yml index e29833015d3..6598b6f3b42 100644 --- a/.github/workflows/_android.yml +++ b/.github/workflows/_android.yml @@ -37,7 +37,7 @@ jobs: mkdir -p ${ARTIFACTS_DIR_NAME}/library_test_dir bash .ci/scripts/build_android_instrumentation.sh - cp ${BUILD_AAR_DIR}/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" + cp extension/android/executorch_android/build/outputs/apk/androidTest/debug/executorch_android-debug-androidTest.apk "${ARTIFACTS_DIR_NAME}/library_test_dir" mkdir -p ${ARTIFACTS_DIR_NAME}/fp32-xnnpack-custom bash examples/models/llama/install_requirements.sh From b1bb3027fb56dbec6d10f948ab898f6be6af1ce5 Mon Sep 17 00:00:00 2001 From: Hansong Zhang Date: Tue, 8 Apr 2025 16:23:47 -0700 Subject: [PATCH 5/5] Use a variable --- scripts/build_android_library.sh | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 61c19723ec1..20450218de6 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -88,27 +88,28 @@ build_android_native_library() { cmake --build "${CMAKE_OUT}"/extension/android -j "${CMAKE_JOBS}" --config "${EXECUTORCH_CMAKE_BUILD_TYPE}" # Copy artifacts to ABI specific directory - mkdir -p "cmake-out-android-so/${ANDROID_ABI}" - cp "${CMAKE_OUT}"/extension/android/*.so "cmake-out-android-so/${ANDROID_ABI}/libexecutorch.so" + local SO_STAGE_DIR="cmake-out-android-so/${ANDROID_ABI}" + mkdir -p ${SO_STAGE_DIR} + cp "${CMAKE_OUT}"/extension/android/*.so "${SO_STAGE_DIR}/libexecutorch.so" # Copy QNN related so library if [ -n "$QNN_SDK_ROOT" ] && [ "$ANDROID_ABI" == "arm64-v8a" ]; then - cp "${CMAKE_OUT}"/lib/libqnn_executorch_backend.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtp.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnSystem.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV69Stub.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV73Stub.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV75Stub.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so "cmake-out-android-so/${ANDROID_ABI}/" - cp "${QNN_SDK_ROOT}"/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so "cmake-out-android-so/${ANDROID_ABI}/" + cp "${CMAKE_OUT}"/lib/libqnn_executorch_backend.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtp.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnSystem.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV69Stub.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV73Stub.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV75Stub.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so ${SO_STAGE_DIR} + cp "${QNN_SDK_ROOT}"/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so ${SO_STAGE_DIR} fi # Copy MTK related so library if [ -n "$NEURON_BUFFER_ALLOCATOR_LIB" ] && [ -n "$NEURON_USDK_ADAPTER_LIB" ] && [ "$ANDROID_ABI" == "arm64-v8a" ]; then - cp "${CMAKE_OUT}"/backends/mediatek/libneuron_backend.so cmake-out-android-so/${ANDROID_ABI}/ - cp "${NEURON_BUFFER_ALLOCATOR_LIB}" cmake-out-android-so/${ANDROID_ABI}/ - cp "${NEURON_USDK_ADAPTER_LIB}" cmake-out-android-so/${ANDROID_ABI}/ + cp "${CMAKE_OUT}"/backends/mediatek/libneuron_backend.so ${SO_STAGE_DIR} + cp "${NEURON_BUFFER_ALLOCATOR_LIB}" ${SO_STAGE_DIR} + cp "${NEURON_USDK_ADAPTER_LIB}" ${SO_STAGE_DIR} fi }