diff --git a/.github/workflows/android-release-artifacts.yml b/.github/workflows/android-release-artifacts.yml index 0e6879bd416..7493ba44393 100644 --- a/.github/workflows/android-release-artifacts.yml +++ b/.github/workflows/android-release-artifacts.yml @@ -16,6 +16,7 @@ on: options: - "xnnpack" - "vulkan+xnnpack" + - "qnn" schedule: - cron: 0 10 * * * @@ -24,25 +25,6 @@ concurrency: cancel-in-progress: true jobs: - check-if-aar-exists: - name: check-if-aar-exists - runs-on: ubuntu-22.04 - timeout-minutes: 10 - steps: - - name: Check if this RC version is already in S3 - shell: bash - run: | - VERSION="${{ inputs.version }}" - if [ -z "$VERSION" ]; then - echo "No version name specified. Will create a snapshot AAR" - exit 0 - fi - if curl -I "https://ossci-android.s3.amazonaws.com/executorch/release/${VERSION}/executorch.aar" | grep "200 OK"; then - echo "AAR already exists at https://ossci-android.s3.amazonaws.com/executorch/release/${VERSION}/executorch.aar" - echo "Will skip build/upload" - exit 1 - fi - build-aar: name: build-aar needs: check-if-aar-exists @@ -83,10 +65,12 @@ jobs: echo -n "$SECRET_EXECUTORCH_MAVEN_SIGNING_GPG_KEY_CONTENTS" | base64 -d > /tmp/secring.gpg + GRADLE_ARGS="" + # Update the version name in build.gradle in case of maven publish VERSION="${{ inputs.version }}" if [ ! -z "$VERSION" ]; then - sed -i "s/\(coordinates(\"org.pytorch\", \"executorch-android\", \"\)\([0-9]\+.[0-9]\+.[0-9]\+\)\(\")\)/\1$VERSION\3/" extension/android/executorch_android/build.gradle + GRADLE_ARGS+=" -DexecuTorchVersion=${VERSION}" fi FLAVOR="${{ inputs.flavor }}" @@ -94,6 +78,16 @@ jobs: export EXECUTORCH_BUILD_VULKAN=ON fi + if [[ "$FLAVOR" == "qnn" ]]; then + PYTHON_EXECUTABLE=python bash .ci/scripts/setup-qnn-deps.sh + PYTHON_EXECUTABLE=python bash .ci/scripts/build-qnn-sdk.sh + export EXECUTORCH_BUILD_QNN=ON + source backends/qualcomm/scripts/qnn_config.sh + export QNN_SDK_ROOT="/tmp/qnn/${QNN_VERSION}" + export ANDROID_ABIS=arm64-v8a + GRADLE_ARGS+=" -DqnnVersion=2.28.0" + fi + # Build AAR Package mkdir aar-out export BUILD_AAR_DIR=aar-out @@ -106,34 +100,5 @@ jobs: # Publish to maven staging UPLOAD_TO_MAVEN="${{ inputs.upload_to_maven }}" if [[ "$UPLOAD_TO_MAVEN" == "true" ]]; then - (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew :executorch_android:publishToMavenCentral) + (cd extension/android; ANDROID_HOME="${ANDROID_SDK:-/opt/android/sdk}" ./gradlew ${GRADLE_ARGS} :executorch_android:publishToMavenCentral) fi - - upload-release-aar: - name: upload-release-aar - needs: build-aar - runs-on: ubuntu-22.04 - timeout-minutes: 10 - permissions: - id-token: write - contents: read - steps: - - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1.7.0 - with: - role-to-assume: arn:aws:iam::308535385114:role/gha_executorch_upload-frameworks-android - aws-region: us-east-1 - - name: Upload AAR RC to AWS S3 - shell: bash - run: | - wget https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifacts/executorch.aar - shasum -a 256 executorch.aar > executorch.aar.sha256sums - - pip install awscli==1.32.18 - AWS_CMD="aws s3 cp" - VERSION="${{ inputs.version }}" - if [ -z "$VERSION" ]; then - VERSION="snapshot-$(date +"%Y%m%d")" - fi - ${AWS_CMD} executorch.aar s3://ossci-android/executorch/release/${VERSION}/executorch.aar --acl public-read - ${AWS_CMD} executorch.aar.sha256sums s3://ossci-android/executorch/release/${VERSION}/executorch.aar.sha256sums --acl public-read diff --git a/extension/android/executorch_android/build.gradle b/extension/android/executorch_android/build.gradle index ec37b293024..fcc3b08f377 100644 --- a/extension/android/executorch_android/build.gradle +++ b/extension/android/executorch_android/build.gradle @@ -6,12 +6,16 @@ * LICENSE file in the root directory of this source tree. */ + plugins { id "com.android.library" version "8.9.0" id "com.vanniktech.maven.publish" version "0.31.0" alias(libs.plugins.jetbrains.kotlin.android) } +def qnnVersion = System.properties['qnnVersion'] +def execuTorchVersion = System.properties['execuTorchVersion'] + android { namespace = "org.pytorch.executorch" compileSdk = 34 @@ -54,13 +58,17 @@ dependencies { androidTestImplementation 'androidx.test:rules:1.2.0' androidTestImplementation 'commons-io:commons-io:2.4' androidTestImplementation 'org.json:json:20250107' + androidTestImplementation 'org.jetbrains.kotlin:kotlin-test:1.9.23' + if (qnnVersion) { + implementation "com.qualcomm.qti:qnn-runtime:$qnnVersion" + } } mavenPublishing { publishToMavenCentral() signAllPublications() - coordinates("org.pytorch", "executorch-android", "0.7.0") + coordinates("org.pytorch", "executorch-android" + (qnnVersion ? "-qnn" : ""), execuTorchVersion ? execuTorchVersion : "0.7.0-SNAPSHOT") pom { name = "ExecuTorch Android" diff --git a/scripts/build_android_library.sh b/scripts/build_android_library.sh index 7bb26c89d9e..59fa1643e52 100755 --- a/scripts/build_android_library.sh +++ b/scripts/build_android_library.sh @@ -98,14 +98,6 @@ build_android_native_library() { # Copy QNN related so library if [ -n "$QNN_SDK_ROOT" ] && [ "$ANDROID_ABI" == "arm64-v8a" ]; then 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