【问题标题】:How to Sign an Already Compiled Apk如何签署已编译的 Apk
【发布时间】:2012-06-07 10:51:12
【问题描述】:

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

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

【问题讨论】:

  • 是的,证书的全部意义在于阻止人们这样做......如果您没有原始证书,您将不得不重新生成一个
  • 仅此而已,我有原始证书,但解码/重新构建 apk 将其删除。

标签: android android-install-apk apk


【解决方案1】:

使用

创建密钥
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

check here for more info

【讨论】:

  • 这应该是答案,27 票反对原始答案的 3 票,加油!
  • 如果您这样做并尝试安装 APK,您最终可能会遇到 INSTALL_FAILED_DUPLICATE_PERMISSION 错误。当无法覆盖原始 APK(例如系统或内置应用程序)时会发生这种情况
  • @Couitchy adb shell pm install -r /data/tmp/myapk.apk
  • 如果您不想费心创建密钥,您可以使用调试密钥:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass安卓
  • 使用jarsignerapksigner有区别吗?一个需要先签名然后压缩对齐,另一个需要压缩对齐然后签名
【解决方案2】:

自动化流程:

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

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

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

手动流程:

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

您需要生成一次密钥库并使用它来签署您的unsigned apk。 使用%JAVA_HOME%/bin/中的keytoolprovided by the JDK

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

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

zipalign which is a tool provided by the Android SDK 在例如%ANDROID_HOME%/sdk/build-tools/24.0.2/ 是一个必须的优化步骤,如果你想将 apk 上传到 Play 商店。

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

注意:当使用旧的jarsigner 时,您需要在AFTER 签名后压缩对齐。使用新的apksigner 方法时,您会在BEFORE 签名之前进行(我知道这很令人困惑)。 Invoking zipalign before apksigner works fine 因为 apksigner 保留 APK 对齐和压缩(与 jarsigner 不同)。

您可以验证对齐方式

zipalign -c 4 my-aligned.apk

第 3 步:签名和验证

使用 24.0.2 及更早版本的构建工具

使用jarsigner,就像在%JAVA_HOME%/bin/ 中找到的keytool comes with the JDK distribution 并像这样使用它:

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 文件更改(有关详细信息,请参阅herehere)。因此,谷歌实现了他们的own apk signer called apksigner(呵呵!) 可以在%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

The official documentation can be found here.

【讨论】:

  • 感谢 uber-apk-signer!很棒的工具!
  • 对于 build-tools 24.0.3 调用 zipalign 的正确方法是: zipalign -p 4 my.apk my-aligned.apk
  • 感谢您的描述!首先尝试了 uber-apk-signer 但失败可能是因为我在我的系统上安装了 openJDK 而不是 oracles“官方”java。所以我尝试了手动方式,也失败了(仍然是同样的错误[INSTALL_PARSE_FAILED_NO_CERTIFICATES])。使用 uber-apk-signer 进行验证让我有了更深入的了解 signature VERIFY FAILED [...] ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]。是的,android 4.2.2,SHA256 不存在?想法?
  • @antiplex 请在 github 中报告问题,而不是 SO
  • @for3st 你的意思是我的问题可能不是由于我对 apk 签名的了解有限,而是由于某种形式的 uber-apk-signer 不兼容?但即便如此,手动方式也会失败,这似乎与您的工具无关......
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 链接已损坏
    【解决方案5】:

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

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

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

    这个程序可以保存你的配置,所以下次你启动它时,你只需要点击生成它就会为你处理它。就是这样。

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

    【讨论】:

    • 对我不起作用。没有证书被添加到 APK。好像什么都没做。甚至不要要求提供别名密码。
    【解决方案6】:

    更新答案

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

    旧答案

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2013-05-30
    • 2017-01-27
    • 2014-02-22
    • 2011-11-23
    • 2015-12-22
    相关资源
    最近更新 更多