从命令行签署Android应用程序包

34

有人知道如何使用命令行使用新密钥库签署.aab文件吗? 这里的文档提到我们可以使用jarsigner从命令行签署我们的应用程序包。但我找不到该命令。 请问有人知道命令是什么吗?

当我上传我的bundle到Google Play时,出现了这个错误:

You uploaded an APK with an invalid signature (learn more about signing). Error from apksigner:

我尝试使用以下命令对应用程序包进行签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore xample.jks bundle.aab keystoreAlias

非常感谢。


签署Android App Bundle确实是使用jarsigner完成的,您的命令看起来很好。 您是否在Play控制台中注册了Google Play应用签名 - Pierre
@Pierre,你说得对,这是我的错误。如果我构建未签名的应用程序包,则可以签署我的应用程序包。在我的情况下,我必须重新签署应用程序包。我尝试解压缩包,删除META-INF文件夹,将其压缩回.aab文件,然后使用jarsigner重新签署。不幸的是,当我上传包到Play Console时,我遇到了上面描述的错误。你有什么建议吗?非常感谢。 - hallz12
没有明显的解决方案。您可能需要考虑联系Play控制台支持团队,以便他们可以更仔细地调查:https://support.google.com/googleplay/android-developer/?hl=en - Pierre
嗨@Pierre,感谢您的回复。您有任何链接可以提供给我吗?关于如何使用不同的密钥库重新签名Android应用程序包?这是可能的吗?谢谢! - hallz12
理想情况下,您不希望重新签名,并生成一个未经签名的捆绑包。如果不可能,那么您当前的方法看起来是合理的,我不太确定问题在哪里。从错误消息来看,Play控制台似乎认为它是APK文件。您上传的文件是否具有.aab扩展名? - Pierre
显示剩余2条评论
2个回答

46

也许你已经找到了解决方法。然而,为了帮助将来的某个人,我想说我曾经遇到过同样的问题,将哈希算法更改为SHA-256帮助我克服了这个问题。

jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore xample.jks bundle.aab keystoreAlias


这真的很有帮助。 - Vamsi

5

我在另一个情况下(或者可能是同一情况)遇到了相同的错误。

我正在尝试用一些更改重新打包*.aab捆绑包。首先,我使用zip或jar创建了一个未签名的归档文件。之后,我使用jarsigner工具对其进行了签名。我发现*.aab不是普通的zip文件,可以使用bundletool进行查看。

> java -jar bundletool.jar validate --bundle application.aab

[BT:0.12.0] Error: The App Bundle zip file contains directory zip entry 'base/' which is not allowed.
com.android.tools.build.bundletool.model.exceptions.BundleFileTypesException$DirectoryInBundleException: The App Bundle zip file contains directory zip entry 'base/' which is not allowed.
        at com.android.tools.build.bundletool.validation.BundleZipValidator.validateBundleZipEntry(BundleZipValidator.java:29)
        at com.android.tools.build.bundletool.validation.ValidatorRunner.lambda$validateBundleZipFile$1(ValidatorRunner.java:47)
        at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:406)
        at com.android.tools.build.bundletool.validation.ValidatorRunner.validateBundleZipFile(ValidatorRunner.java:46)
        at com.android.tools.build.bundletool.validation.AppBundleValidator.validateFile(AppBundleValidator.java:92)
        at com.android.tools.build.bundletool.commands.ValidateBundleCommand.execute(ValidateBundleCommand.java:78)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:92)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:46)

因此,我使用该工具创建了 *.aab 文件,并使用 jarsigner 对其进行了签名。 您需要将 base/* 子文件夹的内容压缩成一个单独的存档文件。

> java -jar bundletool.jar build-bundle --modules base.zip --output application.aab

> jarsigner -keystore $KEYSTORE -storetype $STORETYPE -storepass $STOREPASS -digestalg SHA1 -sigalg SHA256withRSA application.zip $KEYALIAS

> java -jar bundletool.jar validate --bundle application.aab

App Bundle information
------------
Feature modules:
    Feature module: base
            File: assets/META-INF/AIR/application.xml
            ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接