aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Alex Humesky <ahumesky@google.com>2016-06-10 22:43:39 +0000
committerGravatar Yue Gan <yueg@google.com>2016-06-13 08:11:26 +0000
commit5b815a54f3d3d2290fc5a9eaf96f938425fa047a (patch)
tree7edaaae463ab4bffd9fb7df8e035ab9a9b90a3c6 /src
parent82e992e7ada86b937cd76367a959b041962370e5 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java80
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/ApplicationManifest.java42
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,