Android 如何对已编译的Apk进行签名

Android 如何对已编译的Apk进行签名,android,android-install-apk,apk,Android,Android Install Apk,Apk,我用apktool解码了一个APK(因为原始源代码丢失了),所以我可以修复布局xml文件的一些问题。然后,我用apktool重新构建了它,当我尝试在我的设备上安装它时(使用adb:adb install appname.apk),它给了我以下错误: [INSTALL_PARSE_FAILED_NO_CERTIFICATES] 然而,原始的apk是由一个密钥库(在eclipse IDE上)签名的,而这一个不是,我如何在eclipse之外用它的原始密钥库文件正确地签名呢 您可以使用jarsigne

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

然而,原始的apk是由一个密钥库(在eclipse IDE上)签名的,而这一个不是,我如何在eclipse之外用它的原始密钥库文件正确地签名呢

您可以使用jarsigner来签署APK。您不必使用原始密钥库进行签名,只需生成一个新密钥库即可。阅读详细信息:

更新答案

检查

旧答案

选择一种签署应用程序的好方法

使用

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

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

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

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


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

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

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
自动化流程: 使用此工具(使用Google提供的新apksigner):

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

手动过程: 步骤1:生成密钥库(仅一次) 您需要生成一次密钥库,并使用它对您的
未签名的
apk进行签名。 使用
%JAVA\u HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app
步骤2或4:Zipalign 如果您想将apk上传到Play Store,可以在例如
%ANDROID_HOME%/sdk/build tools/24.0.2/
中找到,这是一个强制性的优化步骤

zipalign -p 4 my.apk my-aligned.apk
注意:当使用旧的
jarsigner
时,您需要在签名后进行zipalign。当使用新的
apksigner
方法时,您需要在签名之前执行此操作(我知道这很混乱)。因为apksigner保留APK对齐和压缩(与jarsigner不同)

您可以使用验证对齐

zipalign -c 4 my-aligned.apk
步骤3:签名和验证 使用构建工具24.0.2及更高版本 使用
%JAVA\u HOME%/bin/
中的键工具,并像这样使用它:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name
并且可以用

jarsigner -verify -verbose my_application.apk
apksigner verify my-app.apk
使用构建工具24.0.3及更新版本 安卓7.0引入了APK签名方案v2,这是一种新的应用程序签名方案,它提供了更快的应用程序安装时间和更多的保护,以防止对APK文件进行未经授权的更改(有关更多详细信息,请参阅和)。因此,谷歌实现了他们的(duh!) 脚本文件可以在
%ANDROID\u HOME%/sdk/build tools/24.0.3/
中找到(该.jar位于
/lib
子文件夹中)。像这样使用它

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name
并且可以用

jarsigner -verify -verbose my_application.apk
apksigner verify my-app.apk

是的,证书的全部意义在于阻止人们这样做。。。如果你没有原始证书,你必须重新生成一个。仅此而已,我有原始证书,但解码/重新构建apk将其删除。这应该是答案,27票对3票对原始答案,加油!如果执行此操作并尝试安装APK,则可能会出现安装失败\u复制\u权限错误。当无法覆盖原始APK(例如系统或内置应用程序)时,会发生这种情况@Couitchy adb shell pm install-r/data/tmp/myapk.apki如果你不想麻烦创建一个密钥,你可以使用调试密钥:jarsigner-verbose-sigalg SHA1withRSA-digestalg SHA1-keystore~/.android/debug.keystore app.apk androiddebugkey-storepass android使用
jarsigner
apksigner
之间有区别吗?一个需要签名,然后zipaligning,另一个需要zipaligning,然后signing链接已被断开最正确的,因为它是一个旧线程,您可以查看这一个,两个链接现在都已弃用。不要使用感谢优步apk签名者!伟大的工具!对于build tools 24.0.3,调用zipalign的正确方法是:zipalign-P4 my.apk my-aligned.apkThanks供您描述!首先尝试uber apk signer,但失败可能是因为我在系统上安装了openJDK,而不是oracles“官方”java。因此,我尝试了手动方式,但也失败了(仍然是相同的错误
[INSTALL\u PARSE\u failed\u NO\u CERTIFICATES]
)。通过uber apk signer进行验证,我进一步了解了签名验证失败的原因。错误:JAR signer CERT.RSA:JAR signature META-INF/CERT.RSA使用摘要算法2.16.840.1.101.3.4.2.1和签名算法1.2.840.113549.1.1.1,这在API级别[[15,17]]上不受支持。。是的,安卓4.2.2,没有吗?想法?@antiplex请在github中报告问题,而不是SOuber apk signer真是太棒了!!!不适合我。未向APK添加任何证书。好像什么都没做。甚至不要要求输入别名密码。