diff options
author | ajmichael <ajmichael@google.com> | 2017-06-29 04:14:19 +0200 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-06-29 09:34:03 +0200 |
commit | 393e843eabac50c01e245ca6c357c10085d08b5b (patch) | |
tree | bd758100d203779ef92f52c35badc15047a33a3c | |
parent | b5873507768ae6a3995480dc820ab904841d2a9a (diff) |
Remove resource_extractor from android_sdk rule.
resource_extractor has nothing to do with the Android SDK. Once upon a time, it
was needed for jack support, so it was colocated with the jack attributes in
android_sdk. Nowadays, it is used as a necessary step before singlejar can run
to build the APK.
RELNOTES: None
PiperOrigin-RevId: 160479247
11 files changed, 49 insertions, 57 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index efe7c54973..28d635d4a2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -532,11 +532,13 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact zipAlignedApk = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_BINARY_APK); Artifact signingKey = androidSemantics.getApkDebugSigningKey(ruleContext); + FilesToRunProvider resourceExtractor = + ruleContext.getExecutablePrerequisite("$resource_extractor", Mode.HOST); ApkActionsBuilder.create("apk") .setClassesDex(finalDexes) .addInputZip(resourceApk.getArtifact()) - .setJavaResourceZip(dexingOutput.javaResourceJar) + .setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor) .addInputZips(nativeLibsZips) .setNativeLibs(nativeLibs) .setUnsignedApk(unsignedApk) @@ -598,7 +600,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ApkActionsBuilder.create("incremental apk") .setClassesDex(stubDex) .addInputZip(incrementalResourceApk.getArtifact()) - .setJavaResourceZip(dexingOutput.javaResourceJar) + .setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor) .addInputZips(nativeLibsZips) .setJavaResourceFile(stubData) .setSignedApk(incrementalApk) @@ -693,7 +695,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact javaSplitApk = getDxArtifact(ruleContext, "java_resources.apk"); ApkActionsBuilder.create("split Java resource apk") .addInputZip(javaSplitApkResources) - .setJavaResourceZip(dexingOutput.javaResourceJar) + .setJavaResourceZip(dexingOutput.javaResourceJar, resourceExtractor) .setSignedApk(javaSplitApk) .setSigningKey(signingKey) .registerActions(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java index 3fd71a9867..9566dd3dc0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java @@ -396,12 +396,7 @@ public final class AndroidRuleClasses { .add(attr("apkbuilder", LABEL).cfg(HOST).allowedFileTypes(ANY_FILE).exec()) .add(attr("apksigner", LABEL).mandatory().cfg(HOST).allowedFileTypes(ANY_FILE).exec()) .add(attr("zipalign", LABEL).mandatory().cfg(HOST).allowedFileTypes(ANY_FILE).exec()) - .add( - attr("resource_extractor", LABEL) - .cfg(HOST) - .allowedFileTypes(ANY_FILE) - .exec() - .mandatory()) + .add(attr("resource_extractor", LABEL).cfg(HOST).allowedFileTypes(ANY_FILE).exec()) .add( attr(":java_toolchain", LABEL) .useOutputLicenses() @@ -908,6 +903,13 @@ public final class AndroidRuleClasses { .nonconfigurable("defines an aspect of configuration") .mandatoryProviders( ImmutableList.of(ConfigFeatureFlagProvider.SKYLARK_IDENTIFIER))) + // The resource extractor is used at the binary level to extract java resources from the + // deploy jar so that they can be added to the APK. + .add( + attr("$resource_extractor", LABEL) + .cfg(HOST) + .exec() + .value(env.getToolsLabel("//tools/android:resource_extractor"))) .advertiseProvider(JavaCompilationArgsProvider.class) .build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java index 164989c8a2..4d1f89fb62 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java @@ -56,8 +56,6 @@ public class AndroidSdk implements RuleConfiguredTargetFactory { FilesToRunProvider mainDexListCreator = ruleContext.getExecutablePrerequisite( "main_dex_list_creator", Mode.HOST); FilesToRunProvider zipalign = ruleContext.getExecutablePrerequisite("zipalign", Mode.HOST); - FilesToRunProvider resourceExtractor = - ruleContext.getExecutablePrerequisite("resource_extractor", Mode.HOST); Artifact frameworkAidl = ruleContext.getPrerequisiteArtifact("framework_aidl", Mode.HOST); TransitiveInfoCollection aidlLib = ruleContext.getPrerequisite("aidl_lib", Mode.TARGET); Artifact androidJar = ruleContext.getPrerequisiteArtifact("android_jar", Mode.HOST); @@ -90,8 +88,7 @@ public class AndroidSdk implements RuleConfiguredTargetFactory { apkBuilder, apkSigner, proguard, - zipalign, - resourceExtractor)) + zipalign)) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER)) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java index 30880f0e5d..0a73a954f5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkProvider.java @@ -45,8 +45,7 @@ public abstract class AndroidSdkProvider implements TransitiveInfoProvider { @Nullable FilesToRunProvider apkBuilder, FilesToRunProvider apkSigner, FilesToRunProvider proguard, - FilesToRunProvider zipalign, - FilesToRunProvider resourceExtractor) { + FilesToRunProvider zipalign) { return new AutoValue_AndroidSdkProvider( buildToolsVersion, @@ -65,8 +64,7 @@ public abstract class AndroidSdkProvider implements TransitiveInfoProvider { apkBuilder, apkSigner, proguard, - zipalign, - resourceExtractor); + zipalign); } /** @@ -133,7 +131,5 @@ public abstract class AndroidSdkProvider implements TransitiveInfoProvider { public abstract FilesToRunProvider getZipalign(); - public abstract FilesToRunProvider getResourceExtractor(); - AndroidSdkProvider() {} } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java index 7734c34292..5f8e1de21b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkActionsBuilder.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesSupplierImpl; @@ -38,6 +39,7 @@ public class ApkActionsBuilder { private Artifact classesDex; private ImmutableList.Builder<Artifact> inputZips = new ImmutableList.Builder<>(); private Artifact javaResourceZip; + private FilesToRunProvider resourceExtractor; private Artifact javaResourceFile; private NativeLibs nativeLibs = NativeLibs.EMPTY; private Artifact unsignedApk; @@ -86,14 +88,13 @@ public class ApkActionsBuilder { } /** - * Sets the file where Java resources are taken. - * - * <p>The contents of this zip will will be put directly into the APK except for files that are - * filtered out by the {@link com.android.sdklib.build.ApkBuilder} which seem to not be resources, - * e.g. files with the extension {@code .class}. + * Adds a zip to be added to the APK and an executable that filters the zip to extract the + * relevant contents first. */ - public ApkActionsBuilder setJavaResourceZip(Artifact javaResourceZip) { + public ApkActionsBuilder setJavaResourceZip( + Artifact javaResourceZip, FilesToRunProvider resourceExtractor) { this.javaResourceZip = javaResourceZip; + this.resourceExtractor = resourceExtractor; return this; } @@ -299,13 +300,14 @@ public class ApkActionsBuilder { // The javaResourceZip contains many files that are unwanted in the APK such as .class files. Artifact extractedJavaResourceZip = AndroidBinary.getDxArtifact(ruleContext, "extracted_" + javaResourceZip.getFilename()); - ruleContext.registerAction(new SpawnAction.Builder() - .setExecutable(AndroidSdkProvider.fromRuleContext(ruleContext).getResourceExtractor()) - .setMnemonic("ResourceExtractor") - .setProgressMessage("Extracting Java resources from deploy jar for " + apkName) - .addInputArgument(javaResourceZip) - .addOutputArgument(extractedJavaResourceZip) - .build(ruleContext)); + ruleContext.registerAction( + new SpawnAction.Builder() + .setExecutable(resourceExtractor) + .setMnemonic("ResourceExtractor") + .setProgressMessage("Extracting Java resources from deploy jar for " + apkName) + .addInputArgument(javaResourceZip) + .addOutputArgument(extractedJavaResourceZip) + .build(ruleContext)); if (ruleContext.getFragment(AndroidConfiguration.class).compressJavaResources()) { compressedApkActionBuilder diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java index e153a60c41..6461a03db0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkManifestAction.java @@ -56,7 +56,6 @@ public final class ApkManifestAction extends AbstractFileWriteAction { .add(sdk.getMainDexClasses()) .add(sdk.getMainDexListCreator().getExecutable()) .add(sdk.getProguard().getExecutable()) - .add(sdk.getResourceExtractor().getExecutable()) .add(sdk.getShrinkedAndroidJar()) .add(sdk.getZipalign().getExecutable()) .addAll(jars) @@ -79,7 +78,7 @@ public final class ApkManifestAction extends AbstractFileWriteAction { /** * @param owner The action owner. * @param outputFile The artifact to write the proto to. - * @param textOutput Whether to make the + * @param textOutput Whether to write the output as a text proto. * @param sdk The Android SDK. * @param jars All the jars that would be merged and dexed and put into an APK. * @param resourceApk The ResourceApk for the .ap_ that contains the resources that would go into @@ -220,11 +219,11 @@ public final class ApkManifestAction extends AbstractFileWriteAction { private String getArtifactPath(Artifact artifact) { return artifact.getExecPathString(); } - + private String getArtifactPath(FilesToRunProvider filesToRunProvider) { return filesToRunProvider.getExecutable().getExecPathString(); } - + private ApkManifestOuterClass.AndroidSdk createAndroidSdk(AndroidSdkProvider sdk) { ApkManifestOuterClass.AndroidSdk.Builder sdkProto = @@ -240,7 +239,6 @@ public final class ApkManifestAction extends AbstractFileWriteAction { sdkProto.setMainDexClasses(getArtifactPath(sdk.getMainDexClasses())); sdkProto.setMainDexListCreator(getArtifactPath(sdk.getMainDexListCreator())); sdkProto.setProguard(getArtifactPath(sdk.getProguard())); - sdkProto.setResourceExtractor(getArtifactPath(sdk.getResourceExtractor())); sdkProto.setShrinkedAndroidJar(getArtifactPath(sdk.getShrinkedAndroidJar())); sdkProto.setZipalign(getArtifactPath(sdk.getZipalign())); sdkProto.setBuildToolsVersion(sdk.getBuildToolsVersion()); diff --git a/src/main/protobuf/apk_manifest.proto b/src/main/protobuf/apk_manifest.proto index f638450381..2f8b25b41d 100644 --- a/src/main/protobuf/apk_manifest.proto +++ b/src/main/protobuf/apk_manifest.proto @@ -41,14 +41,13 @@ message AndroidSdk { string main_dex_classes = 11; string main_dex_list_creator = 12; string proguard = 13; - string resource_extractor = 14; string shrinked_android_jar = 15; string zipalign = 16; string build_tools_version = 17; // assume latest if not set string apksigner = 18; // Deprecated tag numbers. - reserved 6, 9, 10; + reserved 6, 9, 10, 14; } // Information about a resource referenced from AndroidManifest.xml. diff --git a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java index 151466a026..cb6e0c667a 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/mock/BazelAnalysisMock.java @@ -187,7 +187,6 @@ public final class BazelAnalysisMock extends AnalysisMock { " main_dex_classes = ':mainDexClasses.rules',", " main_dex_list_creator = ':main_dex_list_creator',", " proguard = ':ProGuard',", - " resource_extractor = ':resource_extractor',", " shrinked_android_jar = ':shrinkedAndroid.jar',", " zipalign = ':zipalign',", ")", diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java index 58086d46da..3ed9a39ee1 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java @@ -432,7 +432,6 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor'", ")", "java_library(", " name = 'aidl_runtime',", @@ -492,7 +491,6 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor'", ")", "java_library(", " name = 'aidl_runtime',", @@ -665,7 +663,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { private void actualSignerToolTests(String apkSigningMethod, String signV1, String signV2) throws Exception { - scratch.file("sdk/BUILD", + scratch.file( + "sdk/BUILD", "android_sdk(", " name = 'sdk',", " aapt = 'aapt',", @@ -680,8 +679,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " main_dex_list_creator = 'main_dex_list_creator',", " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", - " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor')"); + " zipalign = 'zipalign')"); scratch.file("java/com/google/android/hello/BUILD", "android_binary(name = 'hello',", " srcs = ['Foo.java'],", @@ -2145,7 +2143,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testMainDexListWithAndroidSdk() throws Exception { - scratch.file("sdk/BUILD", + scratch.file( + "sdk/BUILD", "android_sdk(", " name = 'sdk',", " aapt = 'aapt',", @@ -2160,8 +2159,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " main_dex_list_creator = 'main_dex_list_creator',", " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", - " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor')"); + " zipalign = 'zipalign')"); scratch.file("java/a/BUILD", "android_binary(", @@ -2181,7 +2179,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testMainDexAaptGenerationSupported() throws Exception { - scratch.file("sdk/BUILD", + scratch.file( + "sdk/BUILD", "android_sdk(", " name = 'sdk',", " build_tools_version = '24.0.0',", @@ -2197,8 +2196,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " main_dex_list_creator = 'main_dex_list_creator',", " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", - " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor')"); + " zipalign = 'zipalign')"); scratch.file("java/a/BUILD", "android_binary(", @@ -2889,7 +2887,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { .containsAllOf("--nocompress_suffixes", ".apk", ".so") .inOrder(); } - + @Test public void testAndroidBinaryWithTestOnlySetsTestOnly() throws Exception { scratch.file( diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java index 7ba05dafc2..ab4a1c1eac 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java @@ -567,7 +567,8 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase { @Test public void testAidlLibAddsProguardSpecs() throws Exception { - scratch.file("sdk/BUILD", + scratch.file( + "sdk/BUILD", "android_sdk(name = 'sdk',", " aapt = 'aapt',", " adb = 'adb',", @@ -582,8 +583,7 @@ public class AndroidLibraryTest extends AndroidBuildViewTestCase { " main_dex_list_creator = 'main_dex_list_creator',", " proguard = 'proguard',", " shrinked_android_jar = 'shrinked_android_jar',", - " zipalign = 'zipalign',", - " resource_extractor = 'resource_extractor')", + " zipalign = 'zipalign')", "java_library(name = 'aidl_lib',", " srcs = ['AidlLib.java'],", " proguard_specs = ['aidl_lib.cfg'])"); diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java index 4abdc5c4e7..2c68717cb3 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/ApkManifestActionTest.java @@ -67,8 +67,7 @@ public class ApkManifestActionTest { null, // apkBuilder, optional createFilesToRunProvider("apkSigner"), createFilesToRunProvider("proguard"), - createFilesToRunProvider("zipalign"), - createFilesToRunProvider("resourceExtractor")); + createFilesToRunProvider("zipalign")); Iterable<Artifact> jars1 = ImmutableList.of( createArtifact("/workspace/java/test/output_jar1"), |