Bazel uses apksigner from SDK build-tools instead of embedded jar.
A followup change will remove the apksigner jar that is bundled with Bazel.
RELNOTES: Bazel Android builds use the apksigner tool from the Android SDK
build-tools. Bazel Android builds now require build-tools version 24.0.3 or
later.
--
PiperOrigin-RevId: 141181612
MOS_MIGRATED_REVID=141181612
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index f697070..87caa42 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -586,6 +586,7 @@
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/common/options",
"//src/main/protobuf:crosstool_config_java_proto",
+ "//third_party:android_common_25_0_0",
"//third_party:auto_value",
"//third_party:guava",
"//third_party:joda_time",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
index b916bdd..d609c22 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.bazel.rules.android;
+import com.android.repository.Revision;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -26,6 +27,7 @@
import com.google.devtools.build.lib.skyframe.FileSymlinkException;
import com.google.devtools.build.lib.skyframe.FileValue;
import com.google.devtools.build.lib.skyframe.InconsistentFilesystemException;
+import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.ResourceFileLoader;
import com.google.devtools.build.lib.vfs.Path;
@@ -44,6 +46,8 @@
* Implementation of the {@code android_sdk_repository} rule.
*/
public class AndroidSdkRepositoryFunction extends RepositoryFunction {
+ private static final Revision MIN_BUILD_TOOLS_REVISION = new Revision(24, 0, 3);
+
@Override
public boolean isLocal(Rule rule) {
return true;
@@ -86,6 +90,12 @@
buildToolsVersion = buildToolsDirectory;
}
+ try {
+ assertValidBuildToolsVersion(rule, buildToolsVersion);
+ } catch (EvalException e) {
+ throw new RepositoryFunctionException(e, Transience.PERSISTENT);
+ }
+
String template = getStringResource("android_sdk_repository_template.txt");
String buildFile = template
@@ -158,4 +168,26 @@
throw new RepositoryFunctionException(new IOException(error), Transience.PERSISTENT);
}
}
+
+ private static void assertValidBuildToolsVersion(Rule rule, String buildToolsVersion)
+ throws EvalException {
+ try {
+ Revision buildToolsRevision = Revision.parseRevision(buildToolsVersion);
+ if (buildToolsRevision.compareTo(MIN_BUILD_TOOLS_REVISION) < 0) {
+ throw new EvalException(
+ rule.getAttributeLocation("build_tools_version"),
+ String.format(
+ "Bazel requires Android build tools version %s or newer, %s was provided",
+ MIN_BUILD_TOOLS_REVISION,
+ buildToolsRevision));
+ }
+ } catch (NumberFormatException e) {
+ throw new EvalException(
+ rule.getAttributeLocation("build_tools_version"),
+ String.format(
+ "Bazel does not recognize Android build tools version %s",
+ buildToolsVersion),
+ e);
+ }
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
index a970d41..0ffa376 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryTest.java
@@ -44,8 +44,8 @@
"android_sdk_repository(",
" name = 'mysdk',",
" path = '/sdk',",
- " build_tools_version = '24.0.0',",
- " api_level = 24,",
+ " build_tools_version = '25.0.0',",
+ " api_level = 25,",
")");
}
diff --git a/tools/android/android_sdk_repository_template.bzl b/tools/android/android_sdk_repository_template.bzl
index 58a4345..a007d2b 100644
--- a/tools/android/android_sdk_repository_template.bzl
+++ b/tools/android/android_sdk_repository_template.bzl
@@ -188,7 +188,7 @@
annotations_jar = "tools/support/annotations.jar",
main_dex_classes = "build-tools/%s/mainDexClasses.rules" % build_tools_directory,
apkbuilder = "@bazel_tools//third_party/java/apkbuilder:embedded_apkbuilder",
- apksigner = "@bazel_tools//third_party/java/apksig:embedded_apksigner",
+ apksigner = ":apksigner",
zipalign = ":zipalign_binary",
jack = ":fail",
jill = ":fail",
@@ -206,6 +206,12 @@
runtime_deps = [":proguard_import"]
)
+ native.java_binary(
+ name = "apksigner",
+ main_class = "com.android.apksigner.ApkSignerTool",
+ runtime_deps = ["build-tools/%s/lib/apksigner.jar" % build_tools_directory],
+ )
+
native.filegroup(
name = "build_tools_libs",
srcs = native.glob([