如何在bazel中构建带有签名的发布apk

如何在bazel中构建带有签名的发布apk,bazel,Bazel,我在bazel的文档中找不到任何关于keystore的规则,或者在android\u binary的参数中找不到任何关于签名的参数。那么,我如何构建一个带有签名的发布apk呢?这个问题是在上提出的,它还包含一个解决方案和一些背景。这个问题是在上提出的,它还包含一个解决方案和一些背景。目前,Bazel不支持对apk进行签名。 正如我们在文件中看到的: android\u binary创建一个name\u unsigned.apk:上述文件的一个未签名版本,可以在向公众发布之前使用发行密钥进行签名

我在bazel的文档中找不到任何关于
keystore
的规则,或者在
android\u binary
的参数中找不到任何关于签名的参数。那么,我如何构建一个带有签名的发布apk呢?

这个问题是在上提出的,它还包含一个解决方案和一些背景。

这个问题是在上提出的,它还包含一个解决方案和一些背景。

目前,Bazel不支持对apk进行签名。 正如我们在文件中看到的:

android\u binary
创建一个
name\u unsigned.apk
:上述文件的一个未签名版本,可以在向公众发布之前使用发行密钥进行签名


这意味着您应该使用其他工具对此未签名的apk进行签名。看看Android文档。

目前,Bazel不支持签署apk。 正如我们在文件中看到的:

android\u binary
创建一个
name\u unsigned.apk
:上述文件的一个未签名版本,可以在向公众发布之前使用发行密钥进行签名


这意味着您应该使用其他工具对此未签名的apk进行签名。看看Android文档。

我没有足够的声誉来评论斯特伦的答案,但答案的第一部分是不正确的。Bazel确实支持签署APK。事实上,android_二进制文件的每一次构建都会产生一个签名的APK,不过它是用硬编码的调试密钥签名的


Bazel故意不为用户提供指定密钥的机制,因为不应使用Bazel使用释放密钥进行签名。这将要求您的发布密钥在您的工作区中,因此可能会被签入源代码管理。那将是非常糟糕的做法。

我没有足够的声誉来评论斯特伦的答案,但答案的第一部分是不正确的。Bazel确实支持签署APK。事实上,android_二进制文件的每一次构建都会产生一个签名的APK,不过它是用硬编码的调试密钥签名的


Bazel故意不为用户提供指定密钥的机制,因为不应使用Bazel使用释放密钥进行签名。这将要求您的发布密钥在您的工作区中,因此可能会被签入源代码管理。那将是非常糟糕的做法。

我戴了一个快速的genrule,可以帮你签名。但是,需要注意的是,您将无法在输出签名的APK上使用
mobile install
,这是非常不幸的(仍在寻找解决方法)


我穿了一条可以帮你签名的快速规则。但是,需要注意的是,您将无法在输出签名的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),
    )