mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-14 20:48:00 +00:00
### Description <!-- Describe your changes. --> ### Motivation and Context <!-- - Why is this change required? What problem does it solve? - If it fixes an open issue, please link to the issue here. -->
241 lines
7.7 KiB
Groovy
241 lines
7.7 KiB
Groovy
apply plugin: 'com.android.library'
|
|
apply plugin: 'maven-publish'
|
|
|
|
def jniLibsDir = System.properties['jniLibsDir']
|
|
def buildDir = System.properties['buildDir']
|
|
def headersDir = System.properties['headersDir']
|
|
def publishDir = System.properties['publishDir']
|
|
def minSdkVer = System.properties['minSdkVer']
|
|
def targetSdkVer = System.properties['targetSdkVer']
|
|
boolean enableTrainingApis = (System.properties['ENABLE_TRAINING_APIS'] ?: "0") == "1"
|
|
def releaseVersionSuffix = System.properties['releaseVersionSuffix'] ?: ""
|
|
// Expected format for qnnVersion: major.minor.patch (e.g., 2.26.0)
|
|
// QNN package version does not follow Semantic Versioning (SemVer) format.
|
|
// For non qnn builds, qnnVersion will be null
|
|
def qnnVersion = System.properties['qnnVersion']
|
|
|
|
// Since Android requires higher numbers indicating more recent versions
|
|
// This function assumes ORT version number will be in the format of A.B.C[-rc/beta/alpha.D] such as 1.20.0 or 1.20.0-rc.1
|
|
// We generate version code A[0{0,1}]B[0{0,1}]C[0{0,1}]{1,2,3,4}D[01-99]
|
|
// for example '1.20.0' -> 12000400, '1.20.0-rc.1 ' -> 12000301
|
|
// '1.20.0-beta.1' -> 12000201, '1.20.0-alpha.1' -> 12000101
|
|
def getVersionCode(String version) {
|
|
String[] versionAndRelSufx = version.split('-')
|
|
String[] codes = versionAndRelSufx[0].split('\\.')
|
|
// This will have problem if we have 3 digit [sub]version number, such as 1.7.199
|
|
// but it is highly unlikely to happen
|
|
String versionCodeStr = String.format("%d%02d%02d", codes[0] as int, codes[1] as int, codes[2] as int)
|
|
|
|
if (versionAndRelSufx.length > 1) {
|
|
String suffixType = versionAndRelSufx[1].split('\\.')[0]
|
|
String suffixNumber = versionAndRelSufx[1].split('\\.')[1]
|
|
def suffixMap = ['alpha': '1', 'beta': '2', 'rc': '3']
|
|
versionCodeStr += suffixMap[suffixType] + String.format("%02d", suffixNumber as int)
|
|
} else {
|
|
versionCodeStr += "400" // For a normal release version without suffix, get the highest version code
|
|
}
|
|
println "Version code for $version is $versionCodeStr"
|
|
return versionCodeStr as int
|
|
}
|
|
|
|
project.buildDir = buildDir
|
|
def project_version = rootProject.file('../VERSION_NUMBER').text.trim()
|
|
project.version = releaseVersionSuffix ? "${project_version}${releaseVersionSuffix}" : project_version
|
|
project.group = "com.microsoft.onnxruntime"
|
|
|
|
def tmpArtifactId = enableTrainingApis ? project.name + "-training" : project.name
|
|
def mavenArtifactId = tmpArtifactId + '-android' + (qnnVersion != null ? '-qnn' : '')
|
|
|
|
//should the mavenArtifactId be read from the packageName variable as
|
|
//that's how it's used in the build_aar_copy_artifacts.sh while copying the artifacts
|
|
|
|
def defaultDescription = 'ONNX Runtime is a performance-focused inference engine for ONNX (Open Neural Network ' +
|
|
'Exchange) models. This package contains the Android (aar) build of ONNX Runtime. It includes support for all ' +
|
|
'types and operators, for ONNX format models. All standard ONNX models can be executed with this package.'
|
|
def trainingDescription = 'The onnxruntime-training android package is designed to efficiently train and infer a ' +
|
|
'wide range of ONNX models on edge devices, such as mobile phones, tablets, and other portable devices with ' +
|
|
'a focus on minimizing resource usage and maximizing accuracy.' +
|
|
'See https://github.com/microsoft/onnxruntime-training-examples/tree/master/on_device_training for more details.'
|
|
def qnnDescription = 'ONNX Runtime is a performance-focused inference engine for ONNX (Open Neural Network ' +
|
|
'Exchange) models. This package contains the Android (aar) build of ONNX Runtime with the QNN Execution Provider.' +
|
|
'It includes support for all types and operators, for ONNX format models. All standard ONNX models can be executed' +
|
|
'with this package.'
|
|
|
|
buildscript {
|
|
repositories {
|
|
google()
|
|
mavenCentral()
|
|
}
|
|
dependencies {
|
|
classpath 'com.android.tools.build:gradle:7.4.2'
|
|
|
|
// NOTE: Do not place your application dependencies here; they belong
|
|
// in the individual module build.gradle files
|
|
}
|
|
}
|
|
|
|
allprojects {
|
|
repositories {
|
|
google()
|
|
mavenCentral()
|
|
}
|
|
}
|
|
|
|
android {
|
|
compileSdkVersion 34
|
|
|
|
defaultConfig {
|
|
minSdkVersion minSdkVer
|
|
targetSdkVersion targetSdkVer
|
|
versionCode = getVersionCode(project.version)
|
|
versionName = project.version
|
|
|
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
}
|
|
|
|
android {
|
|
lintOptions {
|
|
abortOnError false
|
|
}
|
|
}
|
|
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled false
|
|
debuggable false
|
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
|
}
|
|
}
|
|
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
|
|
sourceSets {
|
|
main {
|
|
jniLibs.srcDirs = [jniLibsDir]
|
|
java {
|
|
srcDirs = ['src/main/java', 'src/main/android']
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace 'ai.onnxruntime'
|
|
}
|
|
|
|
task sourcesJar(type: Jar) {
|
|
archiveClassifier = "sources"
|
|
from android.sourceSets.main.java.srcDirs
|
|
}
|
|
|
|
task javadoc(type: Javadoc) {
|
|
source = android.sourceSets.main.java.srcDirs
|
|
classpath += project.files(android.getBootClasspath())
|
|
}
|
|
|
|
task javadocJar(type: Jar, dependsOn: javadoc) {
|
|
archiveClassifier = 'javadoc'
|
|
from javadoc.destinationDir
|
|
}
|
|
|
|
artifacts {
|
|
archives javadocJar
|
|
archives sourcesJar
|
|
}
|
|
|
|
dependencies {
|
|
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
|
|
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
|
|
testImplementation 'com.google.protobuf:protobuf-java:3.21.7'
|
|
}
|
|
|
|
publishing {
|
|
publications {
|
|
maven(MavenPublication) {
|
|
groupId = project.group
|
|
artifactId = mavenArtifactId
|
|
version = project.version
|
|
|
|
// Three artifacts, the `aar`, the sources and the javadoc
|
|
artifact("$buildDir/outputs/aar/${project.name}-release.aar")
|
|
artifact javadocJar
|
|
artifact sourcesJar
|
|
|
|
pom {
|
|
name = qnnVersion != null ? 'onnxruntime-qnn' : (enableTrainingApis ? 'onnxruntime-training' : 'onnx-runtime')
|
|
description = qnnVersion != null ? qnnDescription : (enableTrainingApis ? trainingDescription : defaultDescription)
|
|
|
|
url = 'https://microsoft.github.io/onnxruntime/'
|
|
licenses {
|
|
license {
|
|
name = 'MIT License'
|
|
url = 'https://opensource.org/licenses/MIT'
|
|
}
|
|
}
|
|
organization {
|
|
name = 'Microsoft'
|
|
url = 'http://www.microsoft.com'
|
|
}
|
|
scm {
|
|
connection = 'scm:git:git://github.com:microsoft/onnxruntime.git'
|
|
developerConnection = 'scm:git:ssh://github.com/microsoft/onnxruntime.git'
|
|
url = 'http://github.com/microsoft/onnxruntime'
|
|
}
|
|
developers {
|
|
developer {
|
|
id = 'onnxruntime'
|
|
name = 'ONNX Runtime'
|
|
email = 'onnxruntime@microsoft.com'
|
|
}
|
|
}
|
|
|
|
if (qnnVersion != null) {
|
|
println "Modifying the POM XML to include QNN dependency"
|
|
withXml {
|
|
def dependencynode = asNode().appendNode('dependencies').appendNode('dependency')
|
|
dependencynode.appendNode('groupId', 'com.qualcomm.qti')
|
|
dependencynode.appendNode('artifactId', 'qnn-runtime')
|
|
dependencynode.appendNode('version', qnnVersion)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//publish to filesystem repo
|
|
repositories{
|
|
maven {
|
|
url "$publishDir"
|
|
}
|
|
}
|
|
}
|
|
|
|
// Add ORT C and C++ API headers to the AAR package, after task bundleDebugAar or bundleReleaseAar
|
|
// Such that developers using ORT native API can extract libraries and headers from AAR package without building ORT
|
|
tasks.whenTaskAdded { task ->
|
|
if (task.name.startsWith("bundle") && task.name.endsWith("Aar")) {
|
|
doLast {
|
|
addFolderToAar("addHeadersTo" + task.name, task.archivePath, headersDir, 'headers')
|
|
}
|
|
}
|
|
}
|
|
|
|
def addFolderToAar(taskName, aarPath, folderPath, folderPathInAar) {
|
|
def tmpDir = file("${buildDir}/${taskName}")
|
|
tmpDir.mkdir()
|
|
def tmpDirFolder = file("${tmpDir.path}/${folderPathInAar}")
|
|
tmpDirFolder.mkdir()
|
|
copy {
|
|
from zipTree(aarPath)
|
|
into tmpDir
|
|
}
|
|
copy {
|
|
from fileTree(folderPath)
|
|
into tmpDirFolder
|
|
}
|
|
ant.zip(destfile: aarPath) {
|
|
fileset(dir: tmpDir.path)
|
|
}
|
|
delete tmpDir
|
|
}
|