diff options
author | Luke Edgar <lukeedgar@google.com> | 2022-08-15 17:46:16 +0100 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-08-16 16:41:57 +0000 |
commit | 30ea6a2f84072839b8df14f54405d73c313c391a (patch) | |
tree | 20745870825af14876057d953d70460354c1b87d | |
parent | 368729bb97973ff02505f4b0da1a7adce85b807c (diff) | |
download | base-30ea6a2f84072839b8df14f54405d73c313c391a.tar.gz |
Avoid including empty directories in AARs
Bug: 232117952
Test: PrefabPublishingTest
Change-Id: I3547e3274ce4c5f6a5b6524584c1b744b645acd5
4 files changed, 51 insertions, 21 deletions
diff --git a/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/BundleAar.kt b/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/BundleAar.kt index 484e28872b..f076b22a85 100644 --- a/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/BundleAar.kt +++ b/build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/BundleAar.kt @@ -142,8 +142,7 @@ abstract class BundleAar : Zip(), VariantAwareTask { creationConfig.artifacts.get( InternalArtifactType.DATA_BINDING_BASE_CLASS_LOG_ARTIFACT), prependToCopyPath( - DataBindingBuilder.DATA_BINDING_CLASS_LOG_ROOT_FOLDER_IN_AAR - ) + DataBindingBuilder.DATA_BINDING_CLASS_LOG_ROOT_FOLDER_IN_AAR) ) } @@ -394,11 +393,14 @@ abstract class BundleAar : Zip(), VariantAwareTask { } companion object { - private fun prependToCopyPath(pathSegment: String) = Action { copySpec: CopySpec -> - copySpec.eachFile { fileCopyDetails: FileCopyDetails -> - fileCopyDetails.relativePath = - fileCopyDetails.relativePath.prepend(pathSegment) - } - } + + private fun prependToCopyPath(pathSegment: String, includeEmptyDirs: Boolean = false) = + Action { copySpec: CopySpec -> + copySpec.includeEmptyDirs = includeEmptyDirs + copySpec.eachFile { fileCopyDetails: FileCopyDetails -> + fileCopyDetails.relativePath = + fileCopyDetails.relativePath.prepend(pathSegment) + } + } } } diff --git a/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/application/AarPublishTest.kt b/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/application/AarPublishTest.kt index 552d4b8bca..80e6ad83a0 100644 --- a/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/application/AarPublishTest.kt +++ b/build-system/integration-test/application/src/test/java/com/android/build/gradle/integration/application/AarPublishTest.kt @@ -16,11 +16,15 @@ package com.android.build.gradle.integration.application +import com.android.SdkConstants import com.android.build.gradle.integration.common.fixture.GradleTestProject import com.android.build.gradle.integration.common.fixture.app.MinimalSubProject import com.android.build.gradle.integration.common.fixture.app.MultiModuleTestProject +import com.android.build.gradle.integration.common.fixture.testprojects.PluginType +import com.android.build.gradle.integration.common.fixture.testprojects.createGradleProject import com.android.build.gradle.options.BooleanOption import com.android.utils.FileUtils +import com.google.wireless.android.sdk.stats.GradleBuildProject import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -30,18 +34,30 @@ import java.util.zip.ZipFile /* * Tests to verify that AARs produced from library modules in build/output/aar are in a state -* which can be published e.g to public repository like Maven. +* which can be published +* e.g. to a public repository like Maven, AAR contains expected file structure. */ class AarPublishTest { @get:Rule - val project = GradleTestProject.builder().fromTestApp( - MultiModuleTestProject.builder() - .subproject( - ":library", MinimalSubProject.lib("com.example.library") - .appendToBuild("android.buildTypes.debug.testCoverageEnabled true") - ).build() - ).create() + val project = createGradleProject { + subProject(":library") { + plugins.add(PluginType.ANDROID_LIB) + android { + defaultCompileSdk() + namespace = "com.example.library" + buildTypes { + named("debug") { + testCoverageEnabled = true + } + } + addFile("src/main/res/values/strings.xml", + "<resources>\n" + + "<string name=\"one\">Some string</string>\n" + + "</resources>") + } + } + } @get:Rule val temporaryDirectory = TemporaryFolder() @@ -55,7 +71,6 @@ class AarPublishTest { val libraryPublishedAar = FileUtils.join(librarySubproject.outputDir, "aar", "library-debug.aar") val tempTestData = temporaryDirectory.newFolder("testData") - val buildConfigClasspath = "com/example/library/BuildConfig.class" val extractedJar = File(tempTestData, "classes.jar") // Extracts the zipped BuildConfig.class in library-debug.aar/classes.jar to // the extractedBuildConfigClass temporary file, so it can be later loaded @@ -81,4 +96,18 @@ class AarPublishTest { } } } + + @Test + fun aarContainsAllowedRootDirectories() { + project.execute("library:assembleDebug") + project.getSubproject(":library").assertThatAar(GradleTestProject.ApkType.DEBUG.buildType) { + containsFile("/AndroidManifest.xml") + containsFile("/R.txt") + containsFile("/classes.jar") + containsFile("/res/values/values.xml") + containsFile("META-INF/com/android/build/gradle/aar-metadata.properties") + // Regression test for b/232117952 + doesNotContain("/values/") + } + } } diff --git a/build-system/integration-test/native/src/test/java/com/android/build/gradle/integration/ndk/PrefabPublishingTest.kt b/build-system/integration-test/native/src/test/java/com/android/build/gradle/integration/ndk/PrefabPublishingTest.kt index 62bf6eb2de..892d456a1d 100644 --- a/build-system/integration-test/native/src/test/java/com/android/build/gradle/integration/ndk/PrefabPublishingTest.kt +++ b/build-system/integration-test/native/src/test/java/com/android/build/gradle/integration/ndk/PrefabPublishingTest.kt @@ -212,6 +212,9 @@ class PrefabPublishingTest( containsFile("prefab/prefab.json") containsFile("prefab/modules/$gradleModuleName/module.json") containsFile("prefab/modules/${gradleModuleName}_static/module.json") + // Regression test for b/232117952 + doesNotContain("/modules/$gradleModuleName/") + doesNotContain("/modules/$gradleModuleName/include/$gradleModuleName/") } } diff --git a/gmaven/src/test/resources/com/android/tools/test/gmaven-aars.txt b/gmaven/src/test/resources/com/android/tools/test/gmaven-aars.txt index 9886730e33..2f2fe602c3 100644 --- a/gmaven/src/test/resources/com/android/tools/test/gmaven-aars.txt +++ b/gmaven/src/test/resources/com/android/tools/test/gmaven-aars.txt @@ -17,7 +17,6 @@ androidx/databinding/databinding-adapters res/ res/values/ res/values/values.xml - values/ androidx/databinding/databinding-ktx AndroidManifest.xml @@ -44,7 +43,6 @@ androidx/databinding/databinding-runtime res/ res/values/ res/values/values.xml - values/ androidx/databinding/viewbinding AndroidManifest.xml @@ -77,7 +75,6 @@ com/android/databinding/adapters res/ res/values/ res/values/values.xml - values/ com/android/databinding/library AndroidManifest.xml @@ -95,7 +92,6 @@ com/android/databinding/library res/ res/values/ res/values/values.xml - values/ com/android/databinding/viewbinding AndroidManifest.xml |