Skip to content

Commit 6949b89

Browse files
IvanKobzarevfmassa
andauthored
[android] android gradle project for ops (#2897)
* [android] android gradle project for ops * Change CMakeLists to latest PyTorch * Use mobilenet_v3 models for detection Don't need to have two variants of the model anymore, but I'm not removing it for now * Fix orientation when angle = 0 * [android][test_app] Fix YUV decoding * Use smaller version of mobilenet model * Divide inputs by 255 again * [android] assets mobilenetv3 Co-authored-by: Francisco Massa <[email protected]>
1 parent aa26498 commit 6949b89

30 files changed

+1447
-0
lines changed

android/.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
local.properties
2+
**/*.iml
3+
.gradle
4+
gradlew*
5+
gradle/wrapper
6+
.idea/*
7+
.externalNativeBuild
8+
build

android/build.gradle

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
allprojects {
2+
buildscript {
3+
ext {
4+
minSdkVersion = 21
5+
targetSdkVersion = 28
6+
compileSdkVersion = 28
7+
buildToolsVersion = '28.0.3'
8+
9+
coreVersion = "1.2.0"
10+
extJUnitVersion = "1.1.1"
11+
runnerVersion = "1.2.0"
12+
rulesVersion = "1.2.0"
13+
junitVersion = "4.12"
14+
15+
androidSupportAppCompatV7Version = "28.0.0"
16+
fbjniJavaOnlyVersion = "0.0.3"
17+
soLoaderNativeLoaderVersion = "0.8.0"
18+
}
19+
20+
repositories {
21+
google()
22+
mavenCentral()
23+
jcenter()
24+
}
25+
26+
dependencies {
27+
classpath 'com.android.tools.build:gradle:3.3.2'
28+
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:${GRADLE_BINTRAY_PLUGIN_VERSION}"
29+
classpath "com.github.dcendents:android-maven-gradle-plugin:${ANDROID_MAVEN_GRADLE_PLUGIN_VERSION}"
30+
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.9.8"
31+
}
32+
}
33+
34+
repositories {
35+
google()
36+
jcenter()
37+
}
38+
}
39+
40+
ext.deps = [
41+
jsr305: 'com.google.code.findbugs:jsr305:3.0.1',
42+
]
43+

android/gradle.properties

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
ABI_FILTERS=armeabi-v7a,arm64-v8a,x86,x86_64
2+
3+
VERSION_NAME=0.0.1-SNAPSHOT
4+
GROUP=org.pytorch
5+
MAVEN_GROUP=org.pytorch
6+
POM_URL=https://github.com/pytorch/vision/
7+
POM_SCM_URL=https://github.com/pytorch/vision.git
8+
POM_SCM_CONNECTION=scm:git:https://github.com/pytorch/vision
9+
POM_SCM_DEV_CONNECTION=scm:git:[email protected]:pytorch/vision.git
10+
POM_LICENSE_NAME=BSD 3-Clause
11+
POM_LICENSE_URL=https://github.com/pytorch/vision/blob/master/LICENSE
12+
POM_ISSUES_URL=https://github.com/pytorch/vision/issues
13+
POM_LICENSE_DIST=repo
14+
POM_DEVELOPER_ID=pytorch
15+
POM_DEVELOPER_NAME=pytorch
16+
syncWithMavenCentral=true
17+
18+
GRADLE_BINTRAY_PLUGIN_VERSION=1.8.0
19+
GRADLE_VERSIONS_PLUGIN_VERSION=0.15.0
20+
ANDROID_MAVEN_GRADLE_PLUGIN_VERSION=2.1
21+
22+
# Gradle internals
23+
android.useAndroidX=true
24+
android.enableJetifier=true
25+
26+
testAppAllVariantsEnabled=false
27+
28+
org.gradle.jvmargs=-Xmx4096m
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
apply plugin: 'com.github.dcendents.android-maven'
2+
3+
version = VERSION_NAME
4+
group = GROUP
5+
project.archivesBaseName = POM_ARTIFACT_ID
6+
7+
install {
8+
repositories.mavenInstaller {
9+
pom.project {
10+
name POM_NAME
11+
artifactId POM_ARTIFACT_ID
12+
packaging POM_PACKAGING
13+
description POM_DESCRIPTION
14+
url projectUrl
15+
16+
scm {
17+
url scmUrl
18+
connection scmConnection
19+
developerConnection scmDeveloperConnection
20+
}
21+
22+
licenses {
23+
license {
24+
name = POM_LICENSE_NAME
25+
url = POM_LICENSE_URL
26+
distribution = POM_LICENSE_DIST
27+
}
28+
}
29+
30+
developers {
31+
developer {
32+
id developerId
33+
name developerName
34+
}
35+
}
36+
}
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
2+
import java.nio.file.Files
3+
import java.nio.file.Paths
4+
import java.io.FileOutputStream
5+
import java.util.zip.ZipFile
6+
7+
// Android tasks for Javadoc and sources.jar generation
8+
9+
afterEvaluate { project ->
10+
if (POM_PACKAGING == 'aar') {
11+
task androidJavadoc(type: Javadoc, dependsOn: assembleDebug) {
12+
source += files(android.sourceSets.main.java.srcDirs)
13+
failOnError false
14+
// This task will try to compile *everything* it finds in the above directory and
15+
// will choke on text files it doesn't understand.
16+
exclude '**/BUCK'
17+
exclude '**/*.md'
18+
}
19+
20+
task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
21+
classifier = 'javadoc'
22+
from androidJavadoc.destinationDir
23+
}
24+
25+
task androidSourcesJar(type: Jar) {
26+
classifier = 'sources'
27+
from android.sourceSets.main.java.srcDirs
28+
}
29+
30+
android.libraryVariants.all { variant ->
31+
def name = variant.name.capitalize()
32+
task "jar${name}"(type: Jar, dependsOn: variant.javaCompileProvider) {
33+
from variant.javaCompileProvider.get().destinationDir
34+
}
35+
36+
androidJavadoc.doFirst {
37+
classpath += files(android.bootClasspath)
38+
classpath += files(variant.javaCompileProvider.get().classpath.files)
39+
// This is generated by `assembleDebug` and holds the JARs generated by the APT.
40+
classpath += fileTree(dir: "$buildDir/intermediates/bundles/debug/", include: '**/*.jar')
41+
42+
// Process AAR dependencies
43+
def aarDependencies = classpath.filter { it.name.endsWith('.aar') }
44+
classpath -= aarDependencies
45+
aarDependencies.each { aar ->
46+
// Extract classes.jar from the AAR dependency, and add it to the javadoc classpath
47+
def outputPath = "$buildDir/tmp/aarJar/${aar.name.replace('.aar', '.jar')}"
48+
classpath += files(outputPath)
49+
50+
// Use a task so the actual extraction only happens before the javadoc task is run
51+
dependsOn task(name: "extract ${aar.name}").doLast {
52+
extractEntry(aar, 'classes.jar', outputPath)
53+
}
54+
}
55+
}
56+
}
57+
58+
artifacts.add('archives', androidJavadocJar)
59+
artifacts.add('archives', androidSourcesJar)
60+
}
61+
62+
if (POM_PACKAGING == 'jar') {
63+
task javadocJar(type: Jar, dependsOn: javadoc) {
64+
classifier = 'javadoc'
65+
from javadoc.destinationDir
66+
}
67+
68+
task sourcesJar(type: Jar, dependsOn: classes) {
69+
classifier = 'sources'
70+
from sourceSets.main.allSource
71+
}
72+
73+
artifacts.add('archives', javadocJar)
74+
artifacts.add('archives', sourcesJar)
75+
}
76+
}
77+
78+
// Utility method to extract only one entry in a zip file
79+
private def extractEntry(archive, entryPath, outputPath) {
80+
if (!archive.exists()) {
81+
throw new GradleException("archive $archive not found")
82+
}
83+
84+
def zip = new ZipFile(archive)
85+
zip.entries().each {
86+
if (it.name == entryPath) {
87+
def path = Paths.get(outputPath)
88+
if (!Files.exists(path)) {
89+
Files.createDirectories(path.getParent())
90+
Files.copy(zip.getInputStream(it), path)
91+
}
92+
}
93+
}
94+
zip.close()
95+
}

android/gradle_scripts/bintray.gradle

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
apply plugin: 'com.jfrog.bintray'
2+
3+
def getBintrayUsername() {
4+
return project.hasProperty('bintrayUsername') ? property('bintrayUsername') : System.getenv('BINTRAY_USERNAME')
5+
}
6+
7+
def getBintrayApiKey() {
8+
return project.hasProperty('bintrayApiKey') ? property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
9+
}
10+
11+
def getBintrayGpgPassword() {
12+
return project.hasProperty('bintrayGpgPassword') ? property('bintrayGpgPassword') : System.getenv('BINTRAY_GPG_PASSWORD')
13+
}
14+
15+
def getMavenCentralUsername() {
16+
return project.hasProperty('mavenCentralUsername') ? property('mavenCentralUsername') : System.getenv('MAVEN_CENTRAL_USERNAME')
17+
}
18+
19+
def getMavenCentralPassword() {
20+
return project.hasProperty('mavenCentralPassword') ? property('mavenCentralPassword') : System.getenv('MAVEN_CENTRAL_PASSWORD')
21+
}
22+
23+
def shouldSyncWithMavenCentral() {
24+
return project.hasProperty('syncWithMavenCentral') ? property('syncWithMavenCentral').toBoolean() : false
25+
}
26+
27+
def dryRunOnly() {
28+
return project.hasProperty('dryRun') ? property('dryRun').toBoolean() : false
29+
}
30+
31+
bintray {
32+
user = getBintrayUsername()
33+
key = getBintrayApiKey()
34+
override = false
35+
configurations = ['archives']
36+
pkg {
37+
repo = bintrayRepo
38+
userOrg = bintrayUserOrg
39+
name = bintrayName
40+
desc = bintrayDescription
41+
websiteUrl = projectUrl
42+
issueTrackerUrl = issuesUrl
43+
vcsUrl = scmUrl
44+
licenses = [ POM_LICENSE_NAME ]
45+
dryRun = dryRunOnly()
46+
override = false
47+
publish = true
48+
publicDownloadNumbers = true
49+
version {
50+
name = versionName
51+
desc = bintrayDescription
52+
gpg {
53+
sign = true
54+
passphrase = getBintrayGpgPassword()
55+
}
56+
mavenCentralSync {
57+
sync = shouldSyncWithMavenCentral()
58+
user = getMavenCentralUsername()
59+
password = getMavenCentralPassword()
60+
close = '1' // If set to 0, you have to manually click release
61+
}
62+
}
63+
}
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
apply plugin: 'signing'
2+
3+
version = VERSION_NAME
4+
group = MAVEN_GROUP
5+
6+
def isReleaseBuild() {
7+
return !VERSION_NAME.contains('SNAPSHOT')
8+
}
9+
10+
def getReleaseRepositoryUrl() {
11+
return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL
12+
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
13+
}
14+
15+
def getSnapshotRepositoryUrl() {
16+
return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL
17+
: "https://oss.sonatype.org/content/repositories/snapshots/"
18+
}
19+
20+
def getRepositoryUsername() {
21+
return hasProperty('SONATYPE_NEXUS_USERNAME') ? SONATYPE_NEXUS_USERNAME : ""
22+
}
23+
24+
def getRepositoryPassword() {
25+
return hasProperty('SONATYPE_NEXUS_PASSWORD') ? SONATYPE_NEXUS_PASSWORD : ""
26+
}
27+
28+
def getHttpProxyHost() {
29+
return project.properties['systemProp.http.proxyHost']
30+
}
31+
32+
def getHttpProxyPort() {
33+
return project.properties['systemProp.http.proxyPort']
34+
}
35+
36+
def needProxy() {
37+
return (getHttpProxyHost() != null) && (getHttpProxyPort() != null)
38+
}
39+
40+
afterEvaluate { project ->
41+
uploadArchives {
42+
repositories {
43+
mavenDeployer {
44+
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
45+
46+
pom.groupId = MAVEN_GROUP
47+
pom.artifactId = POM_ARTIFACT_ID
48+
pom.version = VERSION_NAME
49+
50+
repository(url: getReleaseRepositoryUrl()) {
51+
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
52+
if (needProxy()) {
53+
proxy(host: getHttpProxyHost(), port: getHttpProxyPort() as Integer, type: 'http')
54+
}
55+
}
56+
snapshotRepository(url: getSnapshotRepositoryUrl()) {
57+
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
58+
if (needProxy()) {
59+
proxy(host: getHttpProxyHost(), port: getHttpProxyPort() as Integer, type: 'http')
60+
}
61+
}
62+
63+
pom.project {
64+
name POM_NAME
65+
packaging POM_PACKAGING
66+
description POM_DESCRIPTION
67+
url POM_URL
68+
69+
scm {
70+
url POM_SCM_URL
71+
connection POM_SCM_CONNECTION
72+
developerConnection POM_SCM_DEV_CONNECTION
73+
}
74+
75+
licenses {
76+
license {
77+
name POM_LICENSE_NAME
78+
url POM_LICENSE_URL
79+
distribution POM_LICENSE_DIST
80+
}
81+
}
82+
83+
developers {
84+
developer {
85+
id POM_DEVELOPER_ID
86+
name POM_DEVELOPER_NAME
87+
}
88+
}
89+
}
90+
}
91+
}
92+
}
93+
94+
signing {
95+
required { isReleaseBuild() && gradle.taskGraph.hasTask('uploadArchives') }
96+
sign configurations.archives
97+
}
98+
99+
}

android/gradle_scripts/release.gradle

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
apply from: rootProject.file('gradle_scripts/android_tasks.gradle')
2+
3+
apply from: rootProject.file('gradle_scripts/release_bintray.gradle')
4+
5+
apply from: rootProject.file('gradle_scripts/gradle_maven_push.gradle')

0 commit comments

Comments
 (0)