我已经用 apktool 解码了一个 APK(因为原始源代码丢失了),所以我可以解决布局 xml 文件的一些问题。然后我用 apktool 重建了它,当我尝试在我的设备上安装它时(使用 adb:adb install appname.apk)它给了我这个错误:
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
然而,原始的 apk 是由密钥库(在 Eclipse IDE 上)签名的,这个不是,我怎样才能用它在 Eclipse 之外的原始 keystone 文件正确签名!?
使用创建密钥
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
自动化流程:
使用此工具(使用来自 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 文件更改(有关详细信息,请参阅 here 和 here)。因此,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.
[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 不存在?想法?
最快的方法是使用调试密钥库签名:
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
您使用 jarsigner 对 APK 进行签名。您不必使用原始密钥库进行签名,只需生成一个新密钥库即可。阅读详细信息:http://developer.android.com/guide/publishing/app-signing.html
对于那些不想为每个项目创建一个 bat 文件来编辑,或者不想记住与 keytools 和 jarsigner 程序相关的所有命令而只想在一个进程中完成它的人来说,使用这个程序:
http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx
我构建它是因为我厌倦了每次都必须键入所有文件位置的冗长过程。
该程序可以保存您的配置,因此下次启动它时,您只需点击“生成”,它就会为您处理。而已。
无需安装,它是完全可移植的,并将其配置保存在同一文件夹中的 CSV 文件中。
更新的答案
检查https://shatter-box.com/knowledgebase/android-apk-signing-tool-apk-signer/
旧答案
检查 apk-signer 一种为您的应用程序签名的好方法
jarsigner
和apksigner
有区别吗?一个需要先签名然后压缩对齐,另一个需要压缩对齐然后签名