From b499d841aea85915fedf1832164d58fe93e45b06 Mon Sep 17 00:00:00 2001 From: Sahil Suri Date: Thu, 17 Apr 2025 12:55:19 +1000 Subject: [PATCH] feat: Migrate to AGP 8.1.0 --- android-core/build.gradle | 6 +-- android-core/proguard.pro | 27 +++++++++++++ android-kit-base/build.gradle | 6 +-- build.gradle | 2 +- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 2 +- kit-plugin/build.gradle | 8 ++-- .../com/mparticle/kits/KitPlugin.groovy | 38 ++++++++++++++----- scripts/maven.gradle | 28 ++++++++++---- tooling/android-plugin/build.gradle | 6 +-- tooling/common/build.gradle | 8 +++- tooling/custom-lint-rules/build.gradle | 19 ++++++---- 12 files changed, 109 insertions(+), 42 deletions(-) diff --git a/android-core/build.gradle b/android-core/build.gradle index 3943a17f5..1fe26be73 100644 --- a/android-core/build.gradle +++ b/android-core/build.gradle @@ -13,8 +13,8 @@ android { exclude 'META-INF/LICENSE' } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } String url = '\"\"' @@ -93,7 +93,7 @@ android { resultsDir buildDir.absolutePath + '/orchestrator/results' } } - lintOptions { + lint { enable 'UnknownNullness' checkDependencies = true abortOnError true diff --git a/android-core/proguard.pro b/android-core/proguard.pro index 20677c7ea..1af039519 100644 --- a/android-core/proguard.pro +++ b/android-core/proguard.pro @@ -219,4 +219,31 @@ -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; +} + +# Firebase and GMS CloudMessaging +-dontwarn com.google.android.gms.cloudmessaging.** +-dontwarn com.google.firebase.messaging.** +-keep class com.google.firebase.messaging.** { *; } + +# Java 9+ StringConcatFactory +-dontwarn java.lang.invoke.StringConcatFactory +-keep class java.lang.invoke.StringConcatFactory { *; } + +# Keep lambdas +-keepclassmembers class * { + private static synthetic *** lambda$*(...); +} + +# Keep any classes referenced but not found during R8 minification +-ignorewarnings +-keep class ** { *; } + +# Additional rules to prevent minification errors with Kotlin +-keepattributes *Annotation*, InnerClasses, Signature, EnclosingMethod +-keepclassmembers class kotlin.Metadata { + public ; +} +-keepclassmembers class * { + @kotlin.Metadata ; } \ No newline at end of file diff --git a/android-kit-base/build.gradle b/android-kit-base/build.gradle index a3884c8b8..4a78cf967 100644 --- a/android-kit-base/build.gradle +++ b/android-kit-base/build.gradle @@ -14,7 +14,7 @@ android { testBuildType 'debug' defaultConfig { - minSdkVersion 14 + minSdk 14 targetSdk 33 testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } @@ -36,8 +36,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } } diff --git a/build.gradle b/build.gradle index 45a335f60..1ef3aff0f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { ext.kotlin_version = '1.9.0' - ext.gradle_version = '7.3.1' + ext.gradle_version = '8.1.0' repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index b2e5897e7..fa545ffe0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,5 @@ android.useAndroidX=true org.gradle.daemon=true org.gradle.jvmargs=-Xmx2560m +android.defaults.buildfeatures.buildconfig=true #-XX:ThreadStackSize=4096 -XX:CompilerThreadStackSize=4096 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 60639c745..0670e6735 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon Oct 04 12:58:48 PDT 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/kit-plugin/build.gradle b/kit-plugin/build.gradle index 5d78bc289..d99a08bd2 100644 --- a/kit-plugin/build.gradle +++ b/kit-plugin/build.gradle @@ -9,13 +9,13 @@ apply from: '../scripts/maven.gradle' dependencies { implementation gradleApi() implementation localGroovy() - compileOnly "com.android.tools.build:gradle:7.3.1" - testImplementation "com.android.tools.build:gradle:4.1.3" + compileOnly "com.android.tools.build:gradle:$gradle_version" + testImplementation "com.android.tools.build:gradle:$gradle_version" } compileGroovy { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } dependencies { diff --git a/kit-plugin/src/main/groovy/com/mparticle/kits/KitPlugin.groovy b/kit-plugin/src/main/groovy/com/mparticle/kits/KitPlugin.groovy index d8d70b06b..6bea39bfd 100644 --- a/kit-plugin/src/main/groovy/com/mparticle/kits/KitPlugin.groovy +++ b/kit-plugin/src/main/groovy/com/mparticle/kits/KitPlugin.groovy @@ -6,6 +6,7 @@ import org.gradle.api.Project import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.plugins.signing.SigningExtension +import org.gradle.api.JavaVersion class KitPlugin implements Plugin { void apply(Project target) { @@ -35,7 +36,14 @@ class KitPlugin implements Plugin { androidLib.defaultConfig.buildConfigField("String", "VERSION_CODE", '\"' + dateInt + '\"') androidLib.buildTypes.release.minifyEnabled false androidLib.buildTypes.release.consumerProguardFiles 'consumer-proguard.pro' - androidLib.lintOptions.abortOnError true + androidLib.lint.abortOnError true + + // Add Java 17 compatibility + androidLib.compileOptions { + sourceCompatibility = 17 + targetCompatibility = 17 + } + androidLib.testOptions.unitTests.all { jvmArgs += ['--add-opens', 'java.base/java.lang=ALL-UNNAMED'] jvmArgs += ['--add-opens', 'java.base/java.lang.reflect=ALL-UNNAMED'] jvmArgs += ['--add-opens', 'java.base/java.util=ALL-UNNAMED'] @@ -48,6 +56,12 @@ class KitPlugin implements Plugin { target.apply(plugin: 'maven-publish') target.apply(plugin: 'signing') + // Configure publishing for AGP 8.x + androidLib.publishing { + singleVariant("release") + singleVariant("debug") + } + target.afterEvaluate { PublishingExtension publishing = target.extensions.findByName('publishing') publishing.publications.create("release", MavenPublication.class) { @@ -142,14 +156,19 @@ class KitPlugin implements Plugin { def signingKey = System.getenv("mavenSigningKeyId") def signingPassword = System.getenv("mavenSigningKeyPassword") - if (signingKey != null) { - target.extensions.add('signing.keyId', signingKey) - target.extensions.add('signing.password', signingPassword) + // Updated signing approach for Gradle 8.x + if (signingKey != null && signingPassword != null) { + target.plugins.apply('signing') - SigningExtension signing = new SigningExtension(target) - signing.required = { target.gradle.taskGraph.hasTask("publishReleasePublicationToMavenRepository") } - signing.useInMemoryPgpKeys(signingKey, signingPassword) - signing.sign publishing.publications.findByName("release") + // Configure signing options + target.signing { + def required = target.provider { + target.gradle.taskGraph.hasTask("publishReleasePublicationToMavenRepository") + } + setRequired(required) + useInMemoryPgpKeys(signingKey, signingPassword) + sign publishing.publications.findByName("release") + } } } @@ -157,5 +176,4 @@ class KitPlugin implements Plugin { target.task("publishLocal") { dependsOn "publishDebugPublicationToMavenLocal" } target.task("publishReleaseLocal") { dependsOn "publishReleasePublicationToMavenLocal" } } -} - +} \ No newline at end of file diff --git a/scripts/maven.gradle b/scripts/maven.gradle index 1ebb4eccc..1731a44e6 100644 --- a/scripts/maven.gradle +++ b/scripts/maven.gradle @@ -7,6 +7,17 @@ allprojects { ext."signing.password" = System.getenv("mavenSigningKeyPassword") } +// For AGP 8.x compatibility, configure Android library projects +if (project.plugins.findPlugin("com.android.library")) { + android { + publishing { + // Configure publishing for both variants + singleVariant("release") + singleVariant("debug") + } + } +} + afterEvaluate { publishing { publications { @@ -15,11 +26,13 @@ afterEvaluate { artifactId = project.name version = project.version if (project.plugins.findPlugin("com.android.library")) { + // For AGP 8.x, reference the component directly from components.release } else { from components.java } + // Add sources/javadoc artifacts for all project types if (project.tasks.findByName('generateJavadocsJar')) { artifact project.tasks.getByName('generateJavadocsJar') } @@ -56,15 +69,16 @@ afterEvaluate { artifactId = project.name version = project.version if (project.plugins.findPlugin("com.android.library")) { + // For AGP 8.x, reference the component directly from components.debug } else { from components.java } + // Add sources/javadoc artifacts for all project types if (project.tasks.findByName('generateJavadocsJar')) { artifact project.tasks.getByName('generateJavadocsJar') } - if (project.tasks.findByName('generateSourcesJar')) { artifact project.tasks.getByName('generateSourcesJar') } @@ -96,11 +110,11 @@ afterEvaluate { } repositories { maven { - credentials { - username System.getenv('sonatypeUsername') - password System.getenv('sonatypePassword') - } - url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username System.getenv('sonatypeUsername') + password System.getenv('sonatypePassword') + } + url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' } } } @@ -116,4 +130,4 @@ afterEvaluate { //Publishing task aliases for simpler local development task publishLocal { dependsOn "publishDebugPublicationToMavenLocal" } -task publishReleaseLocal { dependsOn "publishReleasePublicationToMavenLocal" } +task publishReleaseLocal { dependsOn "publishReleasePublicationToMavenLocal" } \ No newline at end of file diff --git a/tooling/android-plugin/build.gradle b/tooling/android-plugin/build.gradle index ee4b47d35..6eb7f296d 100644 --- a/tooling/android-plugin/build.gradle +++ b/tooling/android-plugin/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'groovy' apply plugin: 'kotlin' -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 ext { @@ -26,7 +26,7 @@ configurations { dependencies { fatJar project(':tooling:common') - compileOnly configurations.fatJar + compileOnly files(configurations.fatJar) implementation gradleApi() implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation files('libs/java-json.jar') diff --git a/tooling/common/build.gradle b/tooling/common/build.gradle index d1419a6bc..70ddb0bae 100644 --- a/tooling/common/build.gradle +++ b/tooling/common/build.gradle @@ -16,6 +16,10 @@ dependencies { } java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + jvmToolchain(17) } \ No newline at end of file diff --git a/tooling/custom-lint-rules/build.gradle b/tooling/custom-lint-rules/build.gradle index 99af1017b..4af505e5f 100755 --- a/tooling/custom-lint-rules/build.gradle +++ b/tooling/custom-lint-rules/build.gradle @@ -4,8 +4,12 @@ apply plugin: 'java-library' apply plugin: 'kotlin' apply plugin: 'com.android.lint' -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +kotlin { + jvmToolchain(17) +} buildscript { ext { @@ -39,7 +43,7 @@ dependencies { lintBuild files(jar) lintJar files('libs/mparticle-min.jar') lintJar project(':tooling:common') - implementation configurations.lintJar + implementation files(configurations.lintJar) compileOnly "com.android.tools.lint:lint-api:$lintVersion" compileOnly "com.android.tools.lint:lint-checks:$lintVersion" compileOnly 'org.codehaus.groovy:groovy-all:3.0.13' @@ -51,7 +55,7 @@ dependencies { jar { dependsOn(":tooling:common:jar") - archiveName 'lint.jar' + archiveFileName = 'lint.jar' manifest { attributes 'Manifest-Version': 1.0 attributes 'Lint-Registry-v2': 'com.mparticle.lints.MParticleIssueRegistry' @@ -74,10 +78,9 @@ rootProject.project('android-core').android.buildTypes.all { task zipSources(type: Jar) { def fileName = "$project.rootDir/android-core/build/intermediates/javac/${targetBuildType}/classes" - from(fileTree(dir: fileName)) { - destinationDir new File("$project.projectDir/libs") - archiveName "mparticle.jar" - } + from(fileTree(dir: fileName)) + destinationDirectory.set(new File("$project.projectDir/libs")) + archiveFileName.set("mparticle.jar") outputs.upToDateWhen { false } }