From 4b7c28bbf2018c79cb981679f8e354afe0ece928 Mon Sep 17 00:00:00 2001 From: Chao Zhang Date: Thu, 4 Jun 2020 10:37:30 -0700 Subject: [PATCH] Fix build failures and bump to AGP 3.6 and Gradle 5.6.4 (#167) The build failure was likely due to the legacy errorprone gradle plugin, which was more than 3 years ago. https://plugins.gradle.org/plugin/net.ltgt.errorprone/0.0.13 I upgraded errorprone gradle plugin to a recent version, and also bump the AGP 3.6 and Gradle 5.6.4 because the errorprone version requires a minimum Gradle 5.2. https://github.com/tbroyer/gradle-errorprone-plugin/releases/tag/v0.8 I also used the maven publish integration from AGP by using components.release https://developer.android.com/studio/build/maven-publish-plugin I currently disabled `failOnError` on javadoc, as the compilation configuration is not applied to javadoc's classpath. Gradle 6 introduced the concept of resolvable and consumable, so I would recommend we revisit it when we are on Gradle 6. I tested locally by mavenPublishToLocal using a standalone sample app with android instrumentation tests. The tests can compile successfully with proper dependency. There are some minor changes: - Prompted by IDE that Closure.DELEGATE_FIRST can be inlined - New lint warnings that are SoonBlockedPrivateAPI - Some attempts to fix javadoc errors - Removed errorprone in test modules --- .gitignore | 1 + build.gradle | 15 ++- .../build.gradle | 12 --- dexmaker-mockito-inline-extended/build.gradle | 96 ++----------------- dexmaker-mockito-inline-tests/build.gradle | 12 --- dexmaker-mockito-inline/build.gradle | 96 ++----------------- dexmaker-mockito-tests/build.gradle | 12 --- .../dx/mockito/tests/BlacklistedApis.java | 6 +- dexmaker-mockito/build.gradle | 17 ++-- dexmaker-tests/build.gradle | 12 --- dexmaker/build.gradle | 15 +-- .../src/main/java/com/android/dx/Code.java | 2 +- gradle.properties | 2 + gradle/publishing.gradle | 2 +- gradle/publishing_aar.gradle | 75 +++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 121 insertions(+), 256 deletions(-) create mode 100644 gradle/publishing_aar.gradle diff --git a/.gitignore b/.gitignore index c9c63d93..3b82d01b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ local.properties *.ipr *.iws *.svn +.cxx/ diff --git a/build.gradle b/build.gradle index fcb744ce..d56882d5 100644 --- a/build.gradle +++ b/build.gradle @@ -6,10 +6,10 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' - classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.7.3" + classpath 'com.android.tools.build:gradle:3.6.0' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.15.1" } } @@ -45,5 +45,10 @@ artifactory { } task distributeBuild(type: DistributeTask) { - dependsOn ':artifactoryPublish', 'dexmaker:artifactoryPublish', 'dexmaker-mockito:artifactoryPublish', 'dexmaker-mockito-inline:artifactoryPublish', 'dexmaker-mockito-inline-extended:artifactoryPublish' + dependsOn ':artifactoryPublish', + 'dexmaker:artifactoryPublish', + 'dexmaker-mockito:artifactoryPublish', + 'dexmaker-mockito-inline:artifactoryPublish', + 'dexmaker-mockito-inline-extended:artifactoryPublish' } + diff --git a/dexmaker-mockito-inline-extended-tests/build.gradle b/dexmaker-mockito-inline-extended-tests/build.gradle index 7950bd00..460b46d2 100644 --- a/dexmaker-mockito-inline-extended-tests/build.gradle +++ b/dexmaker-mockito-inline-extended-tests/build.gradle @@ -1,15 +1,3 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } -} - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.library' android { diff --git a/dexmaker-mockito-inline-extended/build.gradle b/dexmaker-mockito-inline-extended/build.gradle index bf063d5c..123a76eb 100644 --- a/dexmaker-mockito-inline-extended/build.gradle +++ b/dexmaker-mockito-inline-extended/build.gradle @@ -1,21 +1,11 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } +plugins { + id("net.ltgt.errorprone") version "0.8" } - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'ivy-publish' -apply plugin: 'com.jfrog.artifactory' +apply from: "$rootDir/gradle/publishing_aar.gradle" version = VERSION_NAME +description = 'Extension of the Mockito Inline API to allow mocking static methods on the Android Dalvik VM' android { compileSdkVersion 28 @@ -46,81 +36,13 @@ android { } } -tasks.withType(JavaCompile) { - options.compilerArgs += ["-Xep:StringSplitter:OFF"] -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} - -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -publishing { - publications { - ivyLib(IvyPublication) { - from new org.gradle.api.internal.java.JavaLibrary(new org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact(project.getName(), 'aar', 'aar', null, new Date(), new File("$buildDir/outputs/aar/${project.getName()}-release.aar"), assemble), project.configurations.implementation.getAllDependencies()) - artifact sourcesJar - artifact javadocJar - } - - lib(MavenPublication) { - from new org.gradle.api.internal.java.JavaLibrary(new org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact(project.getName(), 'aar', 'aar', null, new Date(), new File("$buildDir/outputs/aar/${project.getName()}-release.aar"), assemble), project.configurations.implementation.getAllDependencies()) - - artifact sourcesJar - artifact javadocJar - - pom.withXml { - asNode().children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description = 'Extension of the Mockito Inline API to allow mocking static methods on the Android Dalvik VM' - url 'https://github.com/linkedin/dexmaker' - scm { - url 'https://github.com/linkedin/dexmaker' - connection 'scm:git:git://github.com/linkedin/dexmaker.git' - developerConnection 'https://github.com/linkedin/dexmaker.git' - } - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - - developers { - developer { - id 'com.linkedin' - name 'LinkedIn Corp' - email '' - } - } - } - } - - //Useful for inspecting maven artifacts in 'build/repo' after running './gradlew publish' - repositories { - maven { - url = "$rootProject.buildDir/repo" - } - } - } - } -} - repositories { - jcenter() google() + jcenter() +} + +tasks.withType(JavaCompile) { + options.errorprone.errorproneArgs.add("-Xep:StringSplitter:OFF") } dependencies { diff --git a/dexmaker-mockito-inline-tests/build.gradle b/dexmaker-mockito-inline-tests/build.gradle index 1e32e618..f09466e8 100644 --- a/dexmaker-mockito-inline-tests/build.gradle +++ b/dexmaker-mockito-inline-tests/build.gradle @@ -1,15 +1,3 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } -} - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.library' android { diff --git a/dexmaker-mockito-inline/build.gradle b/dexmaker-mockito-inline/build.gradle index 5c18e30a..f665ff26 100644 --- a/dexmaker-mockito-inline/build.gradle +++ b/dexmaker-mockito-inline/build.gradle @@ -1,21 +1,11 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } +plugins { + id("net.ltgt.errorprone") version "0.8" } - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'ivy-publish' -apply plugin: 'com.jfrog.artifactory' +apply from: "$rootDir/gradle/publishing_aar.gradle" version = VERSION_NAME +description = 'Implementation of the Mockito Inline API for use on the Android Dalvik VM' android { compileSdkVersion 28 @@ -41,80 +31,13 @@ android { } } -tasks.withType(JavaCompile) { - options.compilerArgs += ["-Xep:StringSplitter:OFF"] -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} - -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -publishing { - publications { - ivyLib(IvyPublication) { - from new org.gradle.api.internal.java.JavaLibrary(new org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact(project.getName(), 'aar', 'aar', null, new Date(), new File("$buildDir/outputs/aar/${project.getName()}-release.aar"), assemble), project.configurations.implementation.getAllDependencies()) - artifact sourcesJar - artifact javadocJar - } - - lib(MavenPublication) { - from new org.gradle.api.internal.java.JavaLibrary(new org.gradle.api.internal.artifacts.publish.DefaultPublishArtifact(project.getName(), 'aar', 'aar', null, new Date(), new File("$buildDir/outputs/aar/${project.getName()}-release.aar"), assemble), project.configurations.implementation.getAllDependencies()) - - artifact sourcesJar - artifact javadocJar - - pom.withXml { - asNode().children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST - description = 'Implementation of the Mockito Inline API for use on the Android Dalvik VM' - url 'https://github.com/linkedin/dexmaker' - scm { - url 'https://github.com/linkedin/dexmaker' - connection 'scm:git:git://github.com/linkedin/dexmaker.git' - developerConnection 'https://github.com/linkedin/dexmaker.git' - } - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } - } - - developers { - developer { - id 'com.linkedin' - name 'LinkedIn Corp' - email '' - } - } - } - } - - //Useful for inspecting maven artifacts in 'build/repo' after running './gradlew publish' - repositories { - maven { - url = "$rootProject.buildDir/repo" - } - } - } - } -} - repositories { - jcenter() google() + jcenter() +} + +tasks.withType(JavaCompile) { + options.errorprone.errorproneArgs.add("-Xep:StringSplitter:OFF") } dependencies { @@ -122,4 +45,3 @@ dependencies { implementation 'org.mockito:mockito-core:2.28.2', { exclude group: 'net.bytebuddy' } } - diff --git a/dexmaker-mockito-tests/build.gradle b/dexmaker-mockito-tests/build.gradle index 2c9aa82b..5172daf8 100644 --- a/dexmaker-mockito-tests/build.gradle +++ b/dexmaker-mockito-tests/build.gradle @@ -1,15 +1,3 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } -} - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.library' android { diff --git a/dexmaker-mockito-tests/src/main/java/com/android/dx/mockito/tests/BlacklistedApis.java b/dexmaker-mockito-tests/src/main/java/com/android/dx/mockito/tests/BlacklistedApis.java index bdf43b1c..33959d3a 100644 --- a/dexmaker-mockito-tests/src/main/java/com/android/dx/mockito/tests/BlacklistedApis.java +++ b/dexmaker-mockito-tests/src/main/java/com/android/dx/mockito/tests/BlacklistedApis.java @@ -115,7 +115,7 @@ public void copyBlacklistedFields() throws Exception { parent.measure(100, 100); } - @SuppressLint({"PrivateApi", "CheckReturnValue"}) + @SuppressLint({"PrivateApi", "CheckReturnValue", "SoonBlockedPrivateApi"}) @Test public void cannotCallBlackListedAfterSpying() { // Spying and mocking might change the View class's byte code @@ -132,7 +132,7 @@ public void cannotCallBlackListedAfterSpying() { } public static class CallBlackListedMethod { - @SuppressLint("PrivateApi") + @SuppressLint({"PrivateApi", "SoonBlockedPrivateApi"}) boolean callingBlacklistedMethodCausesException() { // Settings.Global#isValidZenMode is a blacklisted method. Resolving it should fail try { @@ -151,7 +151,7 @@ public void spiesCannotBeUsedToCallHiddenMethods() { } public static abstract class CallBlacklistedMethodAbstract { - @SuppressLint("PrivateApi") + @SuppressLint({"PrivateApi", "SoonBlockedPrivateApi"}) public boolean callingBlacklistedMethodCausesException() { // Settings.Global#isValidZenMode is a blacklisted method. Resolving it should fail try { diff --git a/dexmaker-mockito/build.gradle b/dexmaker-mockito/build.gradle index b8c28c84..2a3f80ee 100644 --- a/dexmaker-mockito/build.gradle +++ b/dexmaker-mockito/build.gradle @@ -1,15 +1,6 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } +plugins { + id("net.ltgt.errorprone") version "0.8" } - -apply plugin: "net.ltgt.errorprone" apply plugin: 'java' apply from: "$rootDir/gradle/publishing.gradle" @@ -23,6 +14,10 @@ repositories { jcenter() } +tasks.withType(JavaCompile) { + options.errorprone.errorproneArgs.add("-Xep:StringSplitter:OFF") +} + dependencies { implementation project(':dexmaker') diff --git a/dexmaker-tests/build.gradle b/dexmaker-tests/build.gradle index 7b2552ce..59062bfb 100644 --- a/dexmaker-tests/build.gradle +++ b/dexmaker-tests/build.gradle @@ -1,15 +1,3 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } -} - -apply plugin: "net.ltgt.errorprone" apply plugin: 'com.android.application' android { diff --git a/dexmaker/build.gradle b/dexmaker/build.gradle index 7e8762f8..ccc7c9d4 100644 --- a/dexmaker/build.gradle +++ b/dexmaker/build.gradle @@ -1,15 +1,6 @@ -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" - } +plugins { + id("net.ltgt.errorprone") version "0.8" } - -apply plugin: "net.ltgt.errorprone" apply plugin: 'java' apply from: "$rootDir/gradle/publishing.gradle" @@ -24,7 +15,7 @@ repositories { } tasks.withType(JavaCompile) { - options.compilerArgs += ["-Xep:StringSplitter:OFF"] + options.errorprone.errorproneArgs.add("-Xep:StringSplitter:OFF") } dependencies { diff --git a/dexmaker/src/main/java/com/android/dx/Code.java b/dexmaker/src/main/java/com/android/dx/Code.java index 8fee3fc5..c0f2759b 100644 --- a/dexmaker/src/main/java/com/android/dx/Code.java +++ b/dexmaker/src/main/java/com/android/dx/Code.java @@ -481,7 +481,7 @@ public void loadConstant(Local target, T value) { /** * Copies a class type in {@code target}. The benefit to using this method vs {@link Code#loadConstant(Local, Object)} - * is that the {@value} can itself be a generated type - {@link TypeId} allows for deferred referencing of class types. + * is that the {@code value} can itself be a generated type - {@link TypeId} allows for deferred referencing of class types. */ public void loadDeferredClassConstant(Local target, TypeId value) { loadConstantInternal(target, value); diff --git a/gradle.properties b/gradle.properties index e6fec279..19397778 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,3 +25,5 @@ org.gradle.configureondemand=false GROUP_ID=com.linkedin.dexmaker VERSION_NAME=2.25.2-SNAPSHOT + +android.useAndroidX=true diff --git a/gradle/publishing.gradle b/gradle/publishing.gradle index 4afd223c..17217316 100644 --- a/gradle/publishing.gradle +++ b/gradle/publishing.gradle @@ -22,7 +22,7 @@ publishing { pom.withXml { asNode().children().last() + { - resolveStrategy = Closure.DELEGATE_FIRST + resolveStrategy = DELEGATE_FIRST description "${ -> description }" url 'https://github.com/linkedin/dexmaker' scm { diff --git a/gradle/publishing_aar.gradle b/gradle/publishing_aar.gradle new file mode 100644 index 00000000..6dcf2967 --- /dev/null +++ b/gradle/publishing_aar.gradle @@ -0,0 +1,75 @@ +apply plugin: 'maven-publish' +apply plugin: 'ivy-publish' +apply plugin: 'com.jfrog.artifactory' + +tasks.register("sourcesJar", Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + +tasks.register("javadoc", Javadoc) { + failOnError false + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) +} + +tasks.register("javadocJar", Jar) { + dependsOn javadoc + classifier = 'javadoc' + from javadoc.destinationDir +} + +// Need afterEvaluate according to https://developer.android.com/studio/build/maven-publish-plugin +afterEvaluate { + publishing { + publications { + ivyLib(IvyPublication) { + from components.release + artifact sourcesJar + artifact javadocJar + } + + lib(MavenPublication) { + from components.release + + artifact sourcesJar + artifact javadocJar + + pom.withXml { + asNode().children().last() + { + resolveStrategy = DELEGATE_FIRST + description "${ -> description }" + url 'https://github.com/linkedin/dexmaker' + scm { + url 'https://github.com/linkedin/dexmaker' + connection 'scm:git:git://github.com/linkedin/dexmaker.git' + developerConnection 'https://github.com/linkedin/dexmaker.git' + } + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + + developers { + developer { + id 'com.linkedin' + name 'LinkedIn Corp' + email '' + } + } + } + } + + //Useful for inspecting maven artifacts in 'build/repo' after running './gradlew publish' + repositories { + maven { + url = "$rootProject.buildDir/repo" + } + } + } + } + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e0b3fb8d..0ebb3108 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists