onnxruntime/java/build-android.gradle
Jian Chen 9ed0c7fe26
Redo "Update Gradle version 8.7 and java version 17 within onnxruntime/java" (#22923)
### 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. -->
2024-12-02 18:34:25 -08:00

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
}