如何在bazel

时间:2017-04-20 07:33:31

标签: bazel

我在bazel的doc中找不到关于keystore的规则,或者在android_binary的参数中找不到关于签名的任何参数。那么如何构建一个带签名的发布apk?

4 个答案:

答案 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不应该用于使用释放密钥进行签名。这将要求您的发布密钥在您的工作区中,因此可能会被检入源代码管理。那将是非常糟糕的做法。