Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 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
4 changes: 2 additions & 2 deletions .github/workflows/doc-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ jobs:

# Build javadoc:
cd extension/android
./gradlew javadoc
cp -rf build/docs/javadoc "${RUNNER_DOCS_DIR}"
./gradlew :executorch_android:javaDocReleaseGeneration
cp -rf executorch_android/build/intermediates/java_doc_dir/release/javaDocReleaseGeneration "${RUNNER_DOCS_DIR}/javadoc"
cd ../..

# If it's main branch, add noindex tag to all .html files to exclude from Google Search indexing.
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ jobs:
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
timeout: 90
script: |
FILES_NEEDS_FORMAT=$(/opt/google-java-format -n extension/android/src/main/java/org/pytorch/executorch/*.java \
examples/demo-apps/android/ExecuTorchDemo/app/src/main/java/com/example/executorchdemo/*.java \
FILES_NEEDS_FORMAT=$(/opt/google-java-format -n \
extension/android/executorch_android/src/main/java/org/pytorch/executorch/*.java \
examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/*.java \
extension/benchmark/android/benchmark/app/src/main/java/org/pytorch/minibench/*.java)
if [ -n "$FILES_NEEDS_FORMAT" ]; then
Expand Down
51 changes: 22 additions & 29 deletions build/build_android_library.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,9 @@ if [[ -z "${PYTHON_EXECUTABLE:-}" ]]; then
fi
which "${PYTHON_EXECUTABLE}"

build_jar() {
pushd extension/android
./gradlew build
popd
mkdir -p "${BUILD_AAR_DIR}/libs"
cp extension/android/build/libs/executorch.jar "${BUILD_AAR_DIR}/libs/"
copy_src() {
cp -r extension/android/build.gradle extension/android/settings.gradle extension/android/gradlew extension/android/gradle extension/android/gradlew.bat "${BUILD_AAR_DIR}"
cp -r extension/android/executorch_android "${BUILD_AAR_DIR}/executorch_android"
}

build_android_native_library() {
Expand Down Expand Up @@ -96,44 +93,40 @@ 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}/jni/${ANDROID_ABI}"
cp "${CMAKE_OUT}"/extension/android/*.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
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}/"

# 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}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtp.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnSystem.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV69Stub.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV73Stub.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/aarch64-android/libQnnHtpV75Stub.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/hexagon-v69/unsigned/libQnnHtpV69Skel.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/hexagon-v73/unsigned/libQnnHtpV73Skel.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
cp "${QNN_SDK_ROOT}"/lib/hexagon-v75/unsigned/libQnnHtpV75Skel.so "${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/"
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}/"
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}/jni/${ANDROID_ABI}/
cp "${NEURON_BUFFER_ALLOCATOR_LIB}" ${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/
cp "${NEURON_USDK_ADAPTER_LIB}" ${BUILD_AAR_DIR}/jni/${ANDROID_ABI}/
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}/
fi
}

build_aar() {
echo \<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" \
package=\"org.pytorch.executorch\"\> \
\<uses-sdk android:minSdkVersion=\"19\" /\> \
\</manifest\> > "${BUILD_AAR_DIR}/AndroidManifest.xml"
pushd "${BUILD_AAR_DIR}"
# Rename libexecutorch_jni.so to libexecutorch.so for soname consistency
# between Java and JNI
find jni -type f -name "libexecutorch_jni.so" -exec bash -c 'mv "$1" "${1/_jni/}"' bash {} \;
find . -type f -name "libexecutorch_jni.so" -exec bash -c 'mv "$1" "${1/_jni/}"' bash {} \;
if [ "$EXECUTORCH_CMAKE_BUILD_TYPE" == "Release" ]; then
find jni -type f -name "*.so" -exec "$ANDROID_NDK"/toolchains/llvm/prebuilt/*/bin/llvm-strip {} \;
find . -type f -name "*.so" -exec "$ANDROID_NDK"/toolchains/llvm/prebuilt/*/bin/llvm-strip {} \;
fi
# Zip all necessary files into the AAR file
zip -r executorch.aar libs jni/*/libexecutorch.so jni/*/libqnn*.so jni/*/libQnn*.so jni/*/libneuron_backend.so jni/*/libneuron_buffer_allocator.so jni/*/libneuronusdk_adapter.mtk.so AndroidManifest.xml
./gradlew build
cp executorch_android/build/outputs/aar/executorch_android-debug.aar executorch.aar
popd
}

Expand All @@ -149,7 +142,7 @@ main() {

ARTIFACTS_DIR_NAME="$1"

build_jar
copy_src
for ANDROID_ABI in "${ANDROID_ABIS[@]}"; do
build_android_native_library ${ANDROID_ABI}
done
Expand Down
16 changes: 8 additions & 8 deletions extension/android/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ oncall("executorch")
fb_android_library(
name = "executorch",
srcs = [
"src/main/java/org/pytorch/executorch/DType.java",
"src/main/java/org/pytorch/executorch/EValue.java",
"src/main/java/org/pytorch/executorch/Module.java",
"src/main/java/org/pytorch/executorch/NativePeer.java",
"src/main/java/org/pytorch/executorch/Tensor.java",
"src/main/java/org/pytorch/executorch/annotations/Experimental.java",
"executorch_android/src/main/java/org/pytorch/executorch/DType.java",
"executorch_android/src/main/java/org/pytorch/executorch/EValue.java",
"executorch_android/src/main/java/org/pytorch/executorch/Module.java",
"executorch_android/src/main/java/org/pytorch/executorch/NativePeer.java",
"executorch_android/src/main/java/org/pytorch/executorch/Tensor.java",
"executorch_android/src/main/java/org/pytorch/executorch/annotations/Experimental.java",
],
autoglob = False,
language = "JAVA",
Expand All @@ -23,8 +23,8 @@ fb_android_library(
fb_android_library(
name = "executorch_llama",
srcs = [
"src/main/java/org/pytorch/executorch/LlamaCallback.java",
"src/main/java/org/pytorch/executorch/LlamaModule.java",
"executorch_android/src/main/java/org/pytorch/executorch/LlamaCallback.java",
"executorch_android/src/main/java/org/pytorch/executorch/LlamaModule.java",
],
autoglob = False,
language = "JAVA",
Expand Down
42 changes: 24 additions & 18 deletions extension/android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
allprojects {
buildscript {
ext {
minSdkVersion = 21
targetSdkVersion = 34
compileSdkVersion = 34
buildToolsVersion = '33.0.1'

plugins {
id 'java-library'
}
fbjniJavaOnlyVersion = "0.5.1"
soLoaderNativeLoaderVersion = "0.10.5"
}

group 'org.pytorch.executorch'
repositories {
google()
mavenCentral()
}

repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.9.0'
classpath 'com.vanniktech:gradle-maven-publish-plugin:0.31.0'
}

}

task makeJar(type: Jar) {
dependencies {
implementation 'com.facebook.fbjni:fbjni-java-only:0.5.1'
implementation 'com.facebook.soloader:nativeloader:0.10.5'
repositories {
google()
jcenter()
mavenCentral()
}
}
75 changes: 75 additions & 0 deletions extension/android/executorch_android/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* 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"
}

android {
namespace = "org.pytorch.executorch"
compileSdk = 34

defaultConfig {
minSdk = 19

testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}

dependencies {
implementation 'com.facebook.fbjni:fbjni-java-only:0.5.1'
implementation 'com.facebook.soloader:nativeloader:0.10.5'
}

import com.vanniktech.maven.publish.SonatypeHost

mavenPublishing {
publishToMavenCentral(SonatypeHost.DEFAULT)
signAllPublications()

coordinates("org.pytorch", "executorch-android", "0.5.0-SNAPSHOT")

pom {
name = "ExecuTorch Android"
description = "ExecuTorch Android API"
inceptionYear = "2025"
url = "https://github.com/pytorch/executorch/"
licenses {
license {
name = "BSD 3-Clause"
url = "https://github.com/pytorch/executorch/blob/main/LICENSE"
distribution = "https://github.com/pytorch/executorch/blob/main/LICENSE"
}
}
developers {
developer {
id = "pytorch"
name = "pytorch"
url = "https://github.com/pytorch/executorch/"
}
}
scm {
url = "https://github.com/pytorch/executorch.git"
connection = "scm:git:https://github.com/pytorch/executorch"
developerConnection = "scm:git:[email protected]:pytorch/executorch.git"
}
}

}

repositories {
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
12 changes: 11 additions & 1 deletion extension/android/settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,20 @@
* For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.6/userguide/multi_project_builds.html in the Gradle documentation.
*/

pluginManagement {
repositories {
google()
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}

plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0'
}

rootProject.name = 'executorch'
include('src')

include('executorch_android')
Loading