我在bazel的doc中找不到关于keystore
的规则,或者在android_binary
的参数中找不到关于签名的任何参数。那么如何构建一个带签名的发布apk?
答案 0 :(得分:1)
目前,Bazel不支持签署apk。 我们可以在文档中看到:
android_binary
创建一个name_unsigned.apk
:上述文件的未签名版本,可以在发布给公众之前使用发布密钥进行签名。
这意味着您应该使用其他工具使用apksigner对此未签名的apk进行签名。请查看Android文档中的Build an unsigned APK and sign it manually。
答案 1 :(得分:1)
我戴了一个快速的尺码,它将为您签名。但是,需要注意的一件事是,您将无法在输出签名的APK上使用mobile-install
,这是非常不幸的(仍在寻找解决方法)。
def signed_android_binray(
name,
android_binary,
keystore,
alias,
password):
"""
This macro signs given android_binary with the given keystore
Example usage:
load("//bzl:apksigner.bzl","signed_android_binray")
signed_android_binray(
name = "signed-foo-app",
android_binary = ":foo-app",
keystore = "//path/to/keystore:my-keystore",
alias = mykeystore,
pass = foo123,
)
"""
unsigned_android_binary = android_binary + "_unsigned.apk"
output_name = "{}_signed.apk".format(name)
native.genrule(
name = name,
srcs = [
unsigned_android_binary,
keystore,
],
tools = [
"@androidsdk//:apksigner",
],
outs = [
output_name,
],
cmd = """
$(location @androidsdk//:apksigner) sign \
--ks $(location {}) \
--ks-key-alias {} \
--ks-pass pass:{} \
--v1-signing-enabled true \
--v1-signer-name CERT \
--v2-signing-enabled true \
--out $(location {}) \
$(location {})
""".format(keystore, alias, password output_name, unsigned_android_binary),
)
答案 2 :(得分:0)
这个问题是在bazel-discuss mailing list上提出的,它还包含一个解决方案和一些背景信息。
答案 3 :(得分:0)
我没有足够的stackoverflow声誉来评论Steren的答案,但答案的第一部分是不正确的。 Bazel确实支持签名APK。事实上,android_binary的每个版本都会生成一个签名的APK,但它会使用硬编码的调试密钥进行签名。
Bazel故意不提供用户指定密钥的机制,因为Bazel不应该用于使用释放密钥进行签名。这将要求您的发布密钥在您的工作区中,因此可能会被检入源代码管理。那将是非常糟糕的做法。