ChatGPT解决这个技术问题 Extra ChatGPT

如何签署已编译的 Apk

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

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

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

B
Benjamin Trent

使用创建密钥

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 android
使用 jarsignerapksigner 有区别吗?一个需要先签名然后压缩对齐,另一个需要压缩对齐然后签名
T
Tortar

自动化流程:

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

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

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

手动流程:

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

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

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

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

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

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 步:签名和验证

使用 build-tools 24.0.2 及更早版本

使用 jarsigner,它与在 %JAVA_HOME%/bin/ 中找到的密钥工具 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)。因此,Google 实现了他们的 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!很棒的工具!
对于构建工具 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 不兼容?但即便如此,手动方式也会失败,这似乎与您的工具无关......
D
Doug

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

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

N
Nikolay Elenkov

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


链接已损坏
L
Luke Alderton

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

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

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

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

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


对我不起作用。没有证书被添加到 APK。好像什么都没做。甚至不要要求提供别名密码。
Y
Yogesh Rathi

更新的答案

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

旧答案

检查 apk-signer 一种为您的应用程序签名的好方法


最正确的是因为它是一个旧线程,你可以看看这个shatter-box.com/knowledgebase/…
现在不推荐使用这两个链接。不使用