diff options
author | 2016-06-10 22:43:39 +0000 | |
---|---|---|
committer | 2016-06-13 08:11:26 +0000 | |
commit | 5b815a54f3d3d2290fc5a9eaf96f938425fa047a (patch) | |
tree | 7edaaae463ab4bffd9fb7df8e035ab9a9b90a3c6 /src | |
parent | 82e992e7ada86b937cd76367a959b041962370e5 (diff) |
Adds a step before creating the resource apk (ap_) to swap out the application
tag's name attribute to the Instant Run application class.
--
MOS_MIGRATED_REVID=124606107
Diffstat (limited to 'src')
3 files changed, 102 insertions, 28 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 e36b28d2e3..135192fb55 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 @@ -180,12 +180,12 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { : NativeLibs.fromPrecompiledObjects(ruleContext, depsByArchitecture); // TODO(bazel-team): Resolve all the different cases of resource handling so this conditional - // can go away: recompile from android_resources, and recompile from - // android_binary attributes. + // can go away: recompile from android_resources, and recompile from android_binary attributes. ApplicationManifest applicationManifest; - ResourceApk splitResourceApk; - ResourceApk incrementalResourceApk; ResourceApk resourceApk; + ResourceApk incrementalResourceApk; + ResourceApk instantRunResourceApk; + ResourceApk splitResourceApk; if (LocalResourceContainer.definesAndroidResources(ruleContext.attributes())) { // Retrieve and compile the resources defined on the android_binary rule. LocalResourceContainer.validateRuleContext(ruleContext); @@ -211,6 +211,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { } applicationManifest = ruleManifest.mergeWith(ruleContext, resourceDeps); + resourceApk = applicationManifest.packWithDataAndResources( ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), ruleContext, @@ -231,8 +232,11 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_PROCESSED_MANIFEST), ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_ZIP)); ruleContext.assertNoErrors(); - incrementalResourceApk = applicationManifest.addStubApplication(ruleContext) - .packWithDataAndResources(ruleContext + + incrementalResourceApk = applicationManifest + .addMobileInstallStubApplication(ruleContext) + .packWithDataAndResources( + ruleContext .getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), ruleContext, false, /* isLibrary */ @@ -252,9 +256,34 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { null, /* manifestOut */ null /* mergedResourcesOut */); ruleContext.assertNoErrors(); + + instantRunResourceApk = applicationManifest + .addInstantRunStubApplication(ruleContext) + .packWithDataAndResources( + getDxArtifact(ruleContext, "android_instant_run.ap_"), + ruleContext, + false, /* isLibrary */ + resourceDeps, + null, /* Artifact rTxt */ + null, /* Artifact symbolsTxt */ + ruleContext.getTokenizedStringListAttr("resource_configuration_filters"), + ruleContext.getTokenizedStringListAttr("nocompress_extensions"), + ruleContext.attributes().get("crunch_png", Type.BOOLEAN), + ruleContext.getTokenizedStringListAttr("densities"), + applicationId, + versionCode, + versionName, + true, /* incremental */ + ProguardHelper.getProguardConfigArtifact(ruleContext, "instant_run"), + null, /* mainDexProguardCfg */ + null, /* manifestOut */ + null /* mergedResourcesOut */); + ruleContext.assertNoErrors(); + splitResourceApk = applicationManifest .createSplitManifest(ruleContext, "android_resources", false) - .packWithDataAndResources(getDxArtifact(ruleContext, "android_resources.ap_"), + .packWithDataAndResources( + getDxArtifact(ruleContext, "android_resources.ap_"), ruleContext, false, /* isLibrary */ resourceDeps, @@ -273,7 +302,9 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { null, /* manifestOut */ null /* mergedResourcesOut */); ruleContext.assertNoErrors(); + } else { + if (!ruleContext.attributes().get("crunch_png", Type.BOOLEAN)) { ruleContext.throwWithRuleError("Setting crunch_png = 0 is not supported for android_binary" + " rules which depend on android_resources rules."); @@ -286,38 +317,54 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { throw new RuleErrorException(); } applicationManifest = resourcesManifest.mergeWith(ruleContext, resourceDeps); + // Always recompiling resources causes AndroidTest to fail in certain circumstances. if (shouldRegenerate(ruleContext, resourceDeps)) { resourceApk = applicationManifest.packWithResources( ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_RESOURCES_APK), ruleContext, resourceDeps, - true, + true, /* createSource */ ProguardHelper.getProguardConfigArtifact(ruleContext, ""), createMainDexProguardSpec(ruleContext)); + ruleContext.assertNoErrors(); } else { - resourceApk = applicationManifest.useCurrentResources(ruleContext, + resourceApk = applicationManifest.useCurrentResources( + ruleContext, ProguardHelper.getProguardConfigArtifact(ruleContext, ""), createMainDexProguardSpec(ruleContext)); + ruleContext.assertNoErrors(); } + incrementalResourceApk = applicationManifest - .addStubApplication(ruleContext) + .addMobileInstallStubApplication(ruleContext) .packWithResources( ruleContext.getImplicitOutputArtifact( AndroidRuleClasses.ANDROID_INCREMENTAL_RESOURCES_APK), ruleContext, resourceDeps, - false, + false, /* createSource */ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental"), null /* mainDexProguardConfig */); ruleContext.assertNoErrors(); + instantRunResourceApk = applicationManifest + .addInstantRunStubApplication(ruleContext) + .packWithResources( + getDxArtifact(ruleContext, "android_instant_run.ap_"), + ruleContext, + resourceDeps, + false, /* createSource */ + ProguardHelper.getProguardConfigArtifact(ruleContext, "instant_run"), + null /* mainDexProguardConfig */); + ruleContext.assertNoErrors(); + splitResourceApk = applicationManifest .createSplitManifest(ruleContext, "android_resources", false) .packWithResources(getDxArtifact(ruleContext, "android_resources.ap_"), ruleContext, resourceDeps, - false, + false, /* createSource */ ProguardHelper.getProguardConfigArtifact(ruleContext, "incremental_split"), null /* mainDexProguardConfig */); ruleContext.assertNoErrors(); @@ -337,7 +384,6 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { Artifact proguardMapping = ruleContext.getPrerequisiteArtifact( "proguard_apply_mapping", Mode.TARGET); - return createAndroidBinary( ruleContext, filesBuilder, @@ -351,6 +397,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { applicationManifest, resourceApk, incrementalResourceApk, + instantRunResourceApk, splitResourceApk, /* shrinkResources */ true, resourceClasses, @@ -372,6 +419,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { ApplicationManifest applicationManifest, ResourceApk resourceApk, ResourceApk incrementalResourceApk, + ResourceApk instantRunResourceApk, ResourceApk splitResourceApk, boolean shrinkResources, JavaTargetAttributes resourceClasses, @@ -481,7 +529,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { .useParameterFile(ParameterFileType.UNQUOTED).build(ruleContext)); Artifact stubData = ruleContext.getImplicitOutputArtifact( - AndroidRuleClasses.STUB_APPLICATION_DATA); + AndroidRuleClasses.MOBILE_INSTALL_STUB_APPLICATION_DATA); Artifact stubDex = getStubDex(ruleContext, javaSemantics, false); ruleContext.assertNoErrors(); @@ -638,7 +686,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { false, // text proto androidCommon, resourceClasses, - resourceApk, + instantRunResourceApk, nativeLibs, debugKeystore); @@ -650,7 +698,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { true, // text proto androidCommon, resourceClasses, - resourceApk, + instantRunResourceApk, nativeLibs, debugKeystore); 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 abd3135b06..a299489829 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 @@ -122,8 +122,10 @@ public final class AndroidRuleClasses { fromTemplates("%{name}_symbols/local-R.txt"); public static final ImplicitOutputsFunction ANDROID_PROCESSED_MANIFEST = fromTemplates("%{name}_processed_manifest/AndroidManifest.xml"); - public static final SafeImplicitOutputsFunction STUB_APPLICATON_MANIFEST = - fromTemplates("%{name}_files/stub/AndroidManifest.xml"); + public static final SafeImplicitOutputsFunction MOBILE_INSTALL_STUB_APPLICATON_MANIFEST = + fromTemplates("%{name}_files/mobile_install/AndroidManifest.xml"); + public static final SafeImplicitOutputsFunction INSTANT_RUN_STUB_APPLICATON_MANIFEST = + fromTemplates("%{name}_files/instant_run/AndroidManifest.xml"); public static final SafeImplicitOutputsFunction FULL_DEPLOY_MARKER = fromTemplates("%{name}_files/full_deploy_marker"); public static final SafeImplicitOutputsFunction INCREMENTAL_DEPLOY_MARKER = @@ -146,7 +148,7 @@ public final class AndroidRuleClasses { // This needs to be in its own directory because ApkBuilder only has a function (-rf) for source // folders but not source files, and it's easiest to guarantee that nothing gets put beside this // file in the ApkBuilder invocation in this manner - public static final SafeImplicitOutputsFunction STUB_APPLICATION_DATA = + public static final SafeImplicitOutputsFunction MOBILE_INSTALL_STUB_APPLICATION_DATA = fromTemplates("%{name}_files/stub_application_data/stub_application_data.txt"); public static final SafeImplicitOutputsFunction DEX_MANIFEST = fromTemplates("%{name}_files/dexmanifest.txt"); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java index 4eace34227..296f4aff14 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java @@ -102,23 +102,24 @@ public final class ApplicationManifest { } } - public ApplicationManifest addStubApplication(RuleContext ruleContext) + public ApplicationManifest addMobileInstallStubApplication(RuleContext ruleContext) throws InterruptedException { - Artifact stubManifest = - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.STUB_APPLICATON_MANIFEST); + Artifact stubManifest = ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.MOBILE_INSTALL_STUB_APPLICATON_MANIFEST); SpawnAction.Builder builder = new SpawnAction.Builder() .setExecutable(ruleContext.getExecutablePrerequisite("$stubify_manifest", Mode.HOST)) - .setProgressMessage("Injecting stub application") - .setMnemonic("InjectStubApplication") + .setProgressMessage("Injecting mobile install stub application") + .setMnemonic("InjectMobileInstallStubApplication") + .addArgument("--mode=mobile_install") .addArgument("--input_manifest") .addInputArgument(manifest) .addArgument("--output_manifest") .addOutputArgument(stubManifest) .addArgument("--output_datafile") - .addOutputArgument( - ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.STUB_APPLICATION_DATA)); + .addOutputArgument(ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.MOBILE_INSTALL_STUB_APPLICATION_DATA)); String overridePackage = getOverridePackage(ruleContext); if (overridePackage != null) { @@ -131,6 +132,27 @@ public final class ApplicationManifest { return new ApplicationManifest(stubManifest); } + public ApplicationManifest addInstantRunStubApplication(RuleContext ruleContext) + throws InterruptedException { + + Artifact stubManifest = ruleContext.getImplicitOutputArtifact( + AndroidRuleClasses.INSTANT_RUN_STUB_APPLICATON_MANIFEST); + + SpawnAction.Builder builder = new SpawnAction.Builder() + .setExecutable(ruleContext.getExecutablePrerequisite("$stubify_manifest", Mode.HOST)) + .setProgressMessage("Injecting instant run stub application") + .setMnemonic("InjectInstantRunStubApplication") + .addArgument("--mode=instant_run") + .addArgument("--input_manifest") + .addInputArgument(manifest) + .addArgument("--output_manifest") + .addOutputArgument(stubManifest); + + ruleContext.registerAction(builder.build(ruleContext)); + + return new ApplicationManifest(stubManifest); + } + public static ApplicationManifest fromRule(RuleContext ruleContext) { return new ApplicationManifest(ruleContext.getPrerequisiteArtifact("manifest", Mode.TARGET)); } @@ -216,7 +238,8 @@ public final class ApplicationManifest { Mode.TARGET, FileProvider.class)).build(); - return createApk(resourceApk, + return createApk( + resourceApk, ruleContext, false, /* isLibrary */ resourceDeps, @@ -273,7 +296,8 @@ public final class ApplicationManifest { if (ruleContext.hasErrors()) { return null; } - return createApk(resourceApk, + return createApk( + resourceApk, ruleContext, isLibrary, resourceDeps, |