aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Lukacs Berki <lberki@google.com>2015-07-27 13:43:08 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-07-27 16:34:03 +0000
commit5ed29b66cf0ba9204882c094e664119d5f1d06c2 (patch)
tree2b3effa8a95054fadebe7a911e5c55dba4746c0f /src
parent01c1dea09c8508d900fa43b6472260bc3f56897b (diff)
Add a command line option to enable incremental installation for Android native libraries.
This requires changes to the stub application and the installer script, which are a-coming. -- MOS_MIGRATED_REVID=99174902
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java31
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java14
2 files changed, 39 insertions, 6 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 e617bca52d..e7c2fa501a 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
@@ -383,15 +383,20 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
if (ruleContext.hasErrors()) {
return null;
}
- ruleContext.registerAction(new ApkActionBuilder(ruleContext, androidSemantics)
+
+ ApkActionBuilder incrementalActionBuilder = new ApkActionBuilder(ruleContext, androidSemantics)
.classesDex(stubDex)
.resourceApk(incrementalResourceApk.getArtifact())
.javaResourceZip(dexingOutput.javaResourceJar)
- .nativeLibs(nativeLibs)
.sign(true)
.javaResourceFile(stubData)
- .message("Generating incremental apk")
- .build(incrementalApk));
+ .message("Generating incremental apk");
+
+ if (!ruleContext.getFragment(AndroidConfiguration.class).useIncrementalNativeLibs()) {
+ incrementalActionBuilder.nativeLibs(nativeLibs);
+ }
+
+ ruleContext.registerAction(incrementalActionBuilder.build(incrementalApk));
Artifact argsArtifact =
ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.MOBILE_INSTALL_ARGS);
@@ -399,13 +404,15 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
new WriteAdbArgsAction(ruleContext.getActionOwner(), argsArtifact));
createInstallAction(ruleContext, false, fullDeployMarker, argsArtifact,
- incrementalDexManifest, incrementalResourceApk.getArtifact(), incrementalApk, stubData);
+ incrementalDexManifest, incrementalResourceApk.getArtifact(), incrementalApk, nativeLibs,
+ stubData);
createInstallAction(ruleContext, true, incrementalDeployMarker,
argsArtifact,
incrementalDexManifest,
incrementalResourceApk.getArtifact(),
incrementalApk,
+ nativeLibs,
stubData);
NestedSetBuilder<Artifact> splitApkSetBuilder = NestedSetBuilder.stableOrder();
@@ -546,7 +553,8 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
private static void createInstallAction(RuleContext ruleContext,
boolean incremental, Artifact marker, Artifact argsArtifact,
- Artifact dexmanifest, Artifact resourceApk, Artifact apk, Artifact stubDataFile) {
+ Artifact dexmanifest, Artifact resourceApk, Artifact apk, NativeLibs nativeLibs,
+ Artifact stubDataFile) {
FilesToRunProvider adb = AndroidSdkProvider.fromRuleContext(ruleContext).getAdb();
SpawnAction.Builder builder = new SpawnAction.Builder()
.setExecutable(ruleContext.getExecutablePrerequisite("$incremental_install", Mode.HOST))
@@ -577,6 +585,17 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory {
.addInputArgument(apk);
}
+ if (ruleContext.getFragment(AndroidConfiguration.class).useIncrementalNativeLibs()) {
+ for (Map.Entry<String, Iterable<Artifact>> arch : nativeLibs.getMap().entrySet()) {
+ for (Artifact lib : arch.getValue()) {
+ builder
+ .addArgument("--native_lib")
+ .addArgument(arch.getKey() + ":" + lib.getExecPathString())
+ .addInput(lib);
+ }
+ }
+ }
+
ruleContext.registerAction(builder.build(ruleContext));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
index 0383f03191..5373533105 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidConfiguration.java
@@ -83,6 +83,14 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
category = "undocumented")
public ConfigurationDistinguisher configurationDistinguisher;
+ // For deploying incremental installation of native libraries. Do not use on the command line.
+ // The idea is that once this option works, we'll flip the default value in a config file, then
+ // once it is proven that it works, remove it from Bazel and said config file.
+ @Option(name = "android_incremental_native_libs",
+ defaultValue = "false",
+ category = "undocumented")
+ public boolean incrementalNativeLibs;
+
@Option(name = "android_crosstool_top",
defaultValue = "null",
category = "semantics",
@@ -227,6 +235,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
private final StrictDepsMode strictDeps;
private final boolean legacyNativeSupport;
private final String cpu;
+ private final boolean incrementalNativeLibs;
private final boolean fatApk;
private final ConfigurationDistinguisher configurationDistinguisher;
private final Label proguard;
@@ -235,6 +244,7 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
AndroidConfiguration(Options options) {
this.sdk = options.realSdk();
+ this.incrementalNativeLibs = options.incrementalNativeLibs;
this.strictDeps = options.strictDeps;
this.legacyNativeSupport = options.legacyNativeSupport;
this.cpu = options.cpu;
@@ -280,6 +290,10 @@ public class AndroidConfiguration extends BuildConfiguration.Fragment {
return jackSanityChecks;
}
+ public boolean useIncrementalNativeLibs() {
+ return incrementalNativeLibs;
+ }
+
@Override
public void addGlobalMakeVariables(ImmutableMap.Builder<String, String> globalMakeEnvBuilder) {
globalMakeEnvBuilder.put("ANDROID_CPU", cpu);