Skip to content

Commit

Permalink
MBS-9086 Basic AGP 4.1 support (#632)
Browse files Browse the repository at this point in the history
  • Loading branch information
eugene-krivobokov committed Nov 16, 2020
1 parent 1ca576f commit fd49b29
Show file tree
Hide file tree
Showing 21 changed files with 280 additions and 137 deletions.
17 changes: 10 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ includeAnnotation?=
useCompositeBuild=true
dry_run=false
instrumentation=Ui
stacktrace?=

params?=

Expand All @@ -28,6 +29,12 @@ ifdef infra
params +=-PinfraVersion=$(infra)
endif

params +=-PtestBuildType=$(test_build_type)
params +=-Pci=$(ci)
params +=$(log_level)
params +=-PkubernetesContext=$(kubernetesContext)
params +=-PuseCompositeBuild=$(useCompositeBuild)

ifeq ($(gradle_debug),true)
params +=-Dorg.gradle.debug=true --no-daemon
endif
Expand All @@ -36,13 +43,9 @@ ifeq ($(dry_run),true)
params +=--dry-run
endif

params +=-PtestBuildType=$(test_build_type)
params +=-Pci=$(ci)
params +=$(log_level)
params +=-PkubernetesContext=$(kubernetesContext)
params +=-PuseCompositeBuild=$(useCompositeBuild)

module=test-app
ifdef stacktrace
params +=--stacktrace
endif

help:
./gradlew help $(params)
Expand Down
2 changes: 1 addition & 1 deletion buildscript/src/main/kotlin/Dependencies.kt
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ object Dependencies {
// 1.6.x <-> AGP 3.6.x
// 2.0.x <-> AGP 4.0.x
// 2.1.x <-> AGP 4.1.x
const val r8 = "com.android.tools:r8:2.0.94"
const val r8 = "com.android.tools:r8:2.1.80"
const val proguardRetrace = "net.sf.proguard:proguard-retrace:6.2.2"
const val playServicesMaps = "com.google.android.gms:play-services-maps:17.0.0"
const val appcompat = "androidx.appcompat:appcompat:${Versions.androidX}"
Expand Down
4 changes: 4 additions & 0 deletions samples/test-app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
-dontobfuscate

# Workaround for shrinked R class in test code: https://github.com/slackhq/keeper/issues/22
# Consuming the same rules from ui-testing-core is not enough. We need them in a regular APK not a test one.
-keep class com.google.android.material.R$id { *; }
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ pluginManagement {
useModule("com.avito.android:${pluginId.removePrefix("com.avito.android.")}:$infraVersion")

pluginId == "com.slack.keeper" ->
useModule("com.slack.keeper:keeper:0.6.0")
useModule("com.slack.keeper:keeper:0.7.0")
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions subprojects/android-test/ui-testing-core/proguard.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Workaround for shrinked R class in test code: https://github.com/slackhq/keeper/issues/22
-keep class com.google.android.material.R$id { *; }
2 changes: 1 addition & 1 deletion subprojects/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ android.useAndroidX=true
projectVersion=2020.31
# TODO: MBS-9285 - https://github.com/gradle/gradle/issues/12660
systemProp.kotlinVersion=1.3.72
systemProp.androidGradlePluginVersion=4.0.2
systemProp.androidGradlePluginVersion=4.1.1
# Disable console output https://github.com/autonomousapps/dependency-analysis-android-gradle-plugin/issues/202
systemProp.dependency.analysis.silent=true

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
package com.avito.android

import com.android.build.gradle.tasks.PackageAndroidArtifact
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import java.io.File

fun PackageAndroidArtifact.getApkFile(): File {
require(apkNames.size == 1) {
"Cannot get apk from $name android artifact task because apkNames.size != 1 ($apkNames). Split apk is not supported."
// TODO: Use Artifacts API
fun PackageAndroidArtifact.apkDirectory(): DirectoryProperty = outputDirectory

fun Directory.getApk(): File? {
val dir = asFile
val apks = dir.listFiles().orEmpty()
.filter {
it.extension == "apk"
}

require(apks.size < 2) {
"Multiple APK are not supported: ${dir.dumpFiles()}"
}
return apks.firstOrNull()
}

val outputDir = outputDirectory.get().asFile
fun Directory.getApkOrThrow(): File {
return requireNotNull(getApk()) {
"APK not found in ${asFile}. Files in dir: ${asFile.dumpFiles()}"
}
}

return File(outputDir, apkNames.first())
private fun File.dumpFiles(): String {
return listFiles().orEmpty()
.joinToString(prefix = "[", postfix = "]") { it.path }
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.avito.android

import com.android.build.api.component.ComponentIdentity
import com.android.build.api.dsl.AndroidSourceSet
import com.android.build.api.dsl.CommonExtension
import com.android.build.gradle.AppExtension
import com.android.build.gradle.AppPlugin
import com.android.build.gradle.BaseExtension
Expand All @@ -26,6 +29,10 @@ fun Project.withAndroidModule(block: (testedExtension: TestedExtension) -> Unit)
withAndroidLib(block)
}

@Suppress("UnstableApiUsage")
val Project.androidCommonExtension
get() = extensions.getByType(CommonExtension::class.java)

val Project.androidBaseExtension: BaseExtension
get() = extensions.getByName<BaseExtension>("android")

Expand All @@ -44,5 +51,10 @@ fun Project.isAndroidApp(): Boolean =
fun Project.isAndroidLibrary(): Boolean =
plugins.hasPlugin("com.android.library")

@Suppress("DefaultLocale")
fun TaskContainer.bundleTaskProvider(variant: ApplicationVariant): TaskProvider<*> =
named("bundle${variant.name.capitalize()}")

@Suppress("DefaultLocale", "UnstableApiUsage")
fun taskName(prefix: String, component: ComponentIdentity) =
prefix + component.flavorName.capitalize() + component.buildType.orEmpty().capitalize()
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ class RealTest {

val configFile = projectDir.file(configFileName)
configFile.writeText(cdBuildConfig)
projectDir.file("/app/build/outputs/apk/release/app-release.apk").createNewFile()
projectDir.file("/app/build/reports/mapping.txt").writeText("1")

val cdBuildResultRequest = dispatcher.captureRequest {
Expand Down Expand Up @@ -239,7 +238,6 @@ class RealTest {

val configFile = projectDir.file(configFileName)
configFile.writeText(cdBuildConfig)
projectDir.file("/app/build/outputs/apk/release/app-release.apk").createNewFile()
projectDir.file("/app/build/reports/mapping.txt").writeText("1")

dispatcher.registerMock(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import java.io.File
fun InstrumentationTestsAction.Params.Companion.createStubInstance(
mainApk: File = File(""),
testApk: File = File(""),
apkOnTargetCommit: File = File(""),
testApkOnTargetCommit: File = File(""),
instrumentationConfiguration: InstrumentationConfiguration.Data = InstrumentationConfiguration.Data.createStubInstance(),
executionParameters: ExecutionParameters = ExecutionParameters.createStubInstance(),
buildId: String = "33456",
Expand Down Expand Up @@ -46,8 +44,6 @@ fun InstrumentationTestsAction.Params.Companion.createStubInstance(
InstrumentationTestsAction.Params(
mainApk = mainApk,
testApk = testApk,
apkOnTargetCommit = apkOnTargetCommit,
testApkOnTargetCommit = testApkOnTargetCommit,
instrumentationConfiguration = instrumentationConfiguration,
executionParameters = executionParameters,
buildId = buildId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ class InstrumentationTestsAction(
data class Params(
val mainApk: File?,
val testApk: File,
val apkOnTargetCommit: File?,
val testApkOnTargetCommit: File?,
val instrumentationConfiguration: InstrumentationConfiguration.Data,
val executionParameters: ExecutionParameters,
val buildId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.android.build.gradle.api.ApplicationVariant
import com.android.build.gradle.api.TestVariant
import com.android.build.gradle.internal.dsl.DefaultConfig
import com.android.build.gradle.internal.tasks.ProguardConfigurableTask
import com.avito.android.getApkFile
import com.avito.android.apkDirectory
import com.avito.android.withAndroidApp
import com.avito.android.withAndroidLib
import com.avito.android.withAndroidModule
Expand Down Expand Up @@ -144,7 +144,7 @@ class InstrumentationTestsPlugin : Plugin<Project> {

if (extensionData.testApplicationApk == null) {
task.dependencyOn(testApkProvider) { dependentTask ->
task.testApplication.set(dependentTask.getApkFile())
task.testApplication.set(dependentTask.apkDirectory())
}
} else {
task.testApplication.set(File(extensionData.testApplicationApk))
Expand Down Expand Up @@ -189,15 +189,15 @@ class InstrumentationTestsPlugin : Plugin<Project> {

if (extensionData.applicationApk == null) {
task.dependencyOn(testedVariantPackageTask) { dependentTask ->
task.application.set(dependentTask.getApkFile())
task.application.set(dependentTask.apkDirectory())
}
} else {
task.application.set(File(extensionData.applicationApk))
}

if (extensionData.testApplicationApk == null) {
task.dependencyOn(testVariantPackageTask) { dependentTask ->
task.testApplication.set(dependentTask.getApkFile())
task.testApplication.set(dependentTask.apkDirectory())
}
} else {
task.testApplication.set(File(extensionData.testApplicationApk))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.avito.instrumentation

import com.avito.android.build_verdict.BuildVerdictTask
import com.avito.android.getApk
import com.avito.android.getApkOrThrow
import com.avito.cd.buildOutput
import com.avito.gradle.worker.inMemoryWork
import com.avito.instrumentation.configuration.ImpactAnalysisPolicy
Expand All @@ -16,12 +18,7 @@ import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.*
import org.gradle.kotlin.dsl.property
import org.gradle.workers.WorkerExecutor
import javax.inject.Inject
Expand All @@ -33,11 +30,11 @@ abstract class InstrumentationTestsTask @Inject constructor(
) : DefaultTask(), BuildVerdictTask {

@Optional
@InputFile
val application: RegularFileProperty = objects.fileProperty()
@InputDirectory
val application: DirectoryProperty = objects.directoryProperty()

@InputFile
val testApplication: RegularFileProperty = objects.fileProperty()
@InputDirectory
val testApplication: DirectoryProperty = objects.directoryProperty()

@Input
val impactAnalysisPolicy = objects.property<ImpactAnalysisPolicy>()
Expand All @@ -54,14 +51,6 @@ abstract class InstrumentationTestsTask @Inject constructor(
@InputFile
val affectedTests: RegularFileProperty = objects.fileProperty()

@Optional
@InputFile
val apkOnTargetCommit: RegularFileProperty = objects.fileProperty()

@Optional
@InputFile
val testApkOnTargetCommit: RegularFileProperty = objects.fileProperty()

@Optional
@InputFile
val applicationProguardMapping: RegularFileProperty = objects.fileProperty()
Expand Down Expand Up @@ -144,10 +133,8 @@ abstract class InstrumentationTestsTask @Inject constructor(
workerExecutor.inMemoryWork {
InstrumentationTestsAction(
InstrumentationTestsAction.Params(
mainApk = application.orNull?.asFile,
testApk = testApplication.get().asFile,
apkOnTargetCommit = apkOnTargetCommit.orNull?.asFile,
testApkOnTargetCommit = testApkOnTargetCommit.orNull?.asFile,
mainApk = application.orNull?.getApk(),
testApk = testApplication.get().getApkOrThrow(),
instrumentationConfiguration = configuration,
executionParameters = parameters.get(),
buildId = buildId.get(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,7 @@ internal class InstrumentationTestsActionIntegrationTest {
)
reportsApi.enqueueTestsForRunId(reportCoordinates, Try.Success(emptyList()))

createAction(
configuration = configuration,
apkOnTargetCommit = apk,
testApkOnTargetCommit = apk
).run()
createAction(configuration = configuration).run()

assertThat(buildFailer.lastReason).isNull()
}
Expand Down Expand Up @@ -151,12 +147,8 @@ internal class InstrumentationTestsActionIntegrationTest {

private fun createAction(
configuration: InstrumentationConfiguration.Data,
apkOnTargetCommit: File = File(""),
testApkOnTargetCommit: File = File(""),
params: InstrumentationTestsAction.Params = params(
configuration,
apkOnTargetCommit,
testApkOnTargetCommit
configuration
)
) = InstrumentationTestsAction(
params = params,
Expand All @@ -175,12 +167,8 @@ internal class InstrumentationTestsActionIntegrationTest {
)

private fun params(
instrumentationConfiguration: InstrumentationConfiguration.Data,
apkOnTargetCommit: File,
testApkOnTargetCommit: File
instrumentationConfiguration: InstrumentationConfiguration.Data
) = InstrumentationTestsAction.Params.createStubInstance(
apkOnTargetCommit = apkOnTargetCommit,
testApkOnTargetCommit = testApkOnTargetCommit,
instrumentationConfiguration = instrumentationConfiguration,
logger = logger,
outputDir = outputDir,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.avito.plugin

import com.avito.android.getApkOrThrow
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputDirectory
import java.io.File
import javax.inject.Inject

@Suppress("UnstableApiUsage")
abstract class SignApkTask @Inject constructor(objects: ObjectFactory) : SignArtifactTask(objects) {

@InputDirectory
val unsignedDirProperty: DirectoryProperty = objects.directoryProperty()

@OutputDirectory
val signedDirProperty: DirectoryProperty = objects.directoryProperty()

override fun unsignedFile(): File {
return unsignedDirProperty.get().getApkOrThrow()
}

override fun signedFile(): File {
return File(signedDirProperty.get().asFile, signedFileName())
}

private fun signedFileName(): String {
val unsignedFile = unsignedFile()

val name = unsignedFile.nameWithoutExtension.removeSuffix("-unsigned")
val extension = unsignedFile.extension

return "$name.$extension"
}

override fun hackForArtifactsApi() {
val signedFile = signedFile()
val copyOfSigned = File(unsignedDirProperty.get().asFile, signedFileName())
if (!copyOfSigned.exists()) {
copyOfSigned.createNewFile()
}
signedFile.copyTo(copyOfSigned, overwrite = true)
}
}
Loading

0 comments on commit fd49b29

Please sign in to comment.