diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index acb32b1..a7cd0a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - android-gradle-plugin: [8.2.0] + android-gradle-plugin: [8.2.0, 8.3.0] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/ruler-cli/src/main/java/com/spotify/ruler/cli/RulerCli.kt b/ruler-cli/src/main/java/com/spotify/ruler/cli/RulerCli.kt index 4793489..e1e19c2 100644 --- a/ruler-cli/src/main/java/com/spotify/ruler/cli/RulerCli.kt +++ b/ruler-cli/src/main/java/com/spotify/ruler/cli/RulerCli.kt @@ -151,7 +151,7 @@ class RulerCli : CliktCommand(), BaseRulerTask { ) InjectedToolApkCreator(aapt2Tool!!.toPath()) } else { - ApkCreator(File(projectPath)) + ApkCreator() } ) { createSplitApks( diff --git a/ruler-common/build.gradle.kts b/ruler-common/build.gradle.kts index f7a089d..3c924b1 100644 --- a/ruler-common/build.gradle.kts +++ b/ruler-common/build.gradle.kts @@ -41,7 +41,9 @@ val browserDist by configurations.creating { } dependencies { - implementation(Dependencies.ANDROID_GRADLE_PLUGIN) + compileOnly(Dependencies.ANDROID_GRADLE_PLUGIN) + testRuntimeOnly(Dependencies.ANDROID_GRADLE_PLUGIN) + compileOnly(Dependencies.BUNDLETOOL) compileOnly(Dependencies.PROTOBUF_CORE) compileOnly(Dependencies.ANDROID_TOOLS_COMMON) diff --git a/ruler-common/src/main/java/com/spotify/ruler/common/apk/ApkCreator.kt b/ruler-common/src/main/java/com/spotify/ruler/common/apk/ApkCreator.kt index 1f9b5c6..4330a6a 100644 --- a/ruler-common/src/main/java/com/spotify/ruler/common/apk/ApkCreator.kt +++ b/ruler-common/src/main/java/com/spotify/ruler/common/apk/ApkCreator.kt @@ -16,8 +16,6 @@ package com.spotify.ruler.common.apk import com.android.SdkConstants -import com.android.build.gradle.internal.SdkLocator -import com.android.builder.errors.DefaultIssueReporter import com.android.bundle.Commands.BuildApksResult import com.android.bundle.Devices import com.android.prefs.AndroidLocationsSingleton @@ -28,7 +26,6 @@ import com.android.tools.build.bundletool.commands.BuildApksCommand import com.android.tools.build.bundletool.device.DeviceSpecParser import com.android.tools.build.bundletool.model.Password import com.android.tools.build.bundletool.model.SigningConfiguration -import com.android.utils.StdLogger import com.spotify.ruler.common.models.DeviceSpec import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -50,7 +47,7 @@ import java.util.zip.ZipInputStream */ const val BUFFER_SIZE = 1024 -open class ApkCreator(private val rootDir: File) { +open class ApkCreator(private val androidSDKDir: File? = null) { private val rulerDebugKey = "rulerDebug.keystore" private val rulerKeystorePassword = "rulerpassword" @@ -92,20 +89,15 @@ open class ApkCreator(private val rootDir: File) { /** Finds and returns the location of the aapt2 executable. */ open fun getAapt2Location(): Path { - val sdkLocation = getAndroidSdkLocation() - val sdkHandler = AndroidSdkHandler.getInstance(AndroidLocationsSingleton, sdkLocation) + val sdkLocation = (androidSDKDir ?: File(checkNotNull(System.getenv("ANDROID_HOME")) { + "Missing 'ANDROID_HOME' environment variable" + })) + val sdkHandler = AndroidSdkHandler.getInstance(AndroidLocationsSingleton, sdkLocation.toPath()) val progressIndicator = object : ProgressIndicatorAdapter() { /* No progress reporting */ } val buildToolInfo = sdkHandler.getLatestBuildTool(progressIndicator, true) return buildToolInfo.location.resolve(SdkConstants.FN_AAPT2) } - /** Finds and returns the location of the Android SDK. */ - private fun getAndroidSdkLocation(): Path { - val logger = StdLogger(StdLogger.Level.WARNING) - val issueReporter = DefaultIssueReporter(logger) - return SdkLocator.getSdkDirectory(rootDir, issueReporter).toPath() - } - /** * Gets Ruler debug signing key from resource to sign the split apks. * Doing this step makes sure the corresponding /META-INF/BNDLTOOL.SF and *.RSA files are created in the apks. @@ -134,7 +126,7 @@ open class ApkCreator(private val rootDir: File) { } } -class InjectedToolApkCreator(private val aapt2Tool: Path) : ApkCreator(File("")) { +class InjectedToolApkCreator(private val aapt2Tool: Path) : ApkCreator() { override fun getAapt2Location(): Path = aapt2Tool } diff --git a/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkCreatorTest.kt b/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkCreatorTest.kt index 23c11af..8f2af3a 100644 --- a/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkCreatorTest.kt +++ b/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkCreatorTest.kt @@ -24,7 +24,7 @@ import java.io.File import java.nio.file.Paths class ApkCreatorTest { - private val creator = ApkCreator(File("")) + private val creator = ApkCreator() private val bundleFile = Paths.get("src", "test", "resources", "test.aab").toFile() private val deviceSpec = DeviceSpec("arm64-v8a", "en", 480, 27) diff --git a/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkSanitizerTest.kt b/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkSanitizerTest.kt index 52ba8bf..03a0549 100644 --- a/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkSanitizerTest.kt +++ b/ruler-common/src/test/kotlin/com/spotify/ruler/common/apk/ApkSanitizerTest.kt @@ -16,7 +16,6 @@ package com.spotify.ruler.common.apk -import com.android.tools.profgen.Apk import com.google.common.truth.Truth.assertThat import com.spotify.ruler.common.sanitizer.ClassNameSanitizer import com.spotify.ruler.common.sanitizer.ResourceNameSanitizer diff --git a/ruler-gradle-plugin/src/main/kotlin/com/spotify/ruler/plugin/RulerTask.kt b/ruler-gradle-plugin/src/main/kotlin/com/spotify/ruler/plugin/RulerTask.kt index f0baedd..5b28c17 100644 --- a/ruler-gradle-plugin/src/main/kotlin/com/spotify/ruler/plugin/RulerTask.kt +++ b/ruler-gradle-plugin/src/main/kotlin/com/spotify/ruler/plugin/RulerTask.kt @@ -16,6 +16,7 @@ package com.spotify.ruler.plugin +import com.android.build.gradle.BaseExtension import com.spotify.ruler.common.BaseRulerTask import com.spotify.ruler.common.apk.ApkCreator import com.spotify.ruler.common.dependency.DependencyComponent @@ -124,7 +125,8 @@ abstract class RulerTask : DefaultTask(), BaseRulerTask { override fun provideBloatyPath() = null private fun createApkFile(): Map> { - val apkCreator = ApkCreator(project.rootDir) + val android = project.extensions.findByName("android") as BaseExtension? + val apkCreator = ApkCreator(android?.sdkDirectory) val apkFile = bundleFile.asFile.get() return if (apkFile.extension == "apk") {