142

我已经用 apktool 解码了一个 APK(因为原始源代码丢失了),所以我可以解决布局 xml 文件的一些问题。然后我用 apktool 重建了它,当我尝试在我的设备上安装它时(使用 adb:adb install appname.apk)它给了我这个错误:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

然而,原始的 apk 是由密钥库(在 Eclipse IDE 上)签名的,这个不是,我怎样才能用它在 Eclipse 之外的原始 keystone 文件正确签名!?

4

6 回答 6

346

使用创建密钥

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

然后使用以下命令对 apk 进行签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

在这里查看更多信息

于 2014-07-18T21:14:11.313 回答
103

自动化流程:

使用此工具(使用来自 Google 的新 apksigner):

https://github.com/patrickfav/uber-apk-signer

免责声明:我是开发者:)

手动流程:

第 1 步:生成密钥库(仅一次)

您需要生成一次密钥库并使用它来签署您的unsignedapk。使用JDK 提供keytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

第 2 步或第 4 步:压缩对齐

zipalign %ANDROID_HOME%/sdk/build-tools/24.0.2/如果您想将 apk 上传到 Play 商店,这是一个由 Android SDK 提供的工具,例如,这是一个强制性的优化步骤。

zipalign -p 4 my.apk my-aligned.apk

注意:使用旧的时,jarsigner您需要在签名后进行zipalign。使用新apksigner方法时,请在签名之前进行(我知道,这很令人困惑)。在 apksigner 之前调用 zipalign 可以正常工作,因为 apksigner 保留 APK 对齐和压缩(与 jarsigner 不同)。

您可以验证对齐方式

zipalign -c 4 my-aligned.apk

第 3 步:签名和验证

使用 build-tools 24.0.2 及更早版本

使用jarsigner它,就像 keytool 一样,随 JDK 发行版一起提供%JAVA_HOME%/bin/并像这样使用它:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

并且可以验证

jarsigner -verify -verbose my_application.apk

使用构建工具 24.0.3 和更新版本

Android 7.0 引入了 APK 签名方案 v2,这是一种新的应用程序签名方案,可提供更快的应用程序安装时间和更多保护,防止未经授权的 APK 文件更改(有关详细信息,请参阅此处此处)。因此,Google 实现了自己的 apk 签名器,称为apksigner(duh!) 脚本文件可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/(.jar 位于/lib子文件夹中)中找到。像这样使用它

apksigner sign --ks-key-alias alias_name --ks my.keystore my-app.apk

并且可以验证

apksigner verify my-app.apk

官方文档可以在这里找到。

于 2016-10-15T21:00:00.993 回答
17

最快的方法是使用调试密钥库签名:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

或在 Windows 上:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
于 2016-09-19T01:31:40.840 回答
6

您使用 jarsigner 对 APK 进行签名。您不必使用原始密钥库进行签名,只需生成一个新密钥库即可。阅读详细信息:http: //developer.android.com/guide/publishing/app-signing.html

于 2012-06-08T02:33:44.157 回答
4

更新的答案

检查https://shatter-box.com/knowledgebase/android-apk-signing-tool-apk-signer/

旧答案

检查apk-signer一个很好的方式来签署你的应用程序

于 2013-03-04T09:53:42.070 回答
4

对于那些不想为每个项目创建一个 bat 文件来编辑,或者不想记住与 keytools 和 jarsigner 程序相关的所有命令而只想在一个进程中完成它的人来说,使用这个程序:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

我构建它是因为我厌倦了每次都必须键入所有文件位置的冗长过程。

该程序可以保存您的配置,因此下次启动它时,您只需点击“生成”,它就会为您处理。就是这样。

无需安装,它是完全可移植的,并将其配置保存在同一文件夹中的 CSV 文件中。

于 2016-08-14T20:01:54.883 回答