如何签署已编译的APK


120

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

但是原始apk是由密钥库(在eclipse IDE上)签名的,但不是,我该如何在Eclipse之外使用原始密钥石文件正确签名呢?


是的,证书的全部目的是阻止人们执行此操作...如果您没有原始证书,则必须重新生成一个证书
edthethird

就是这样,我拥有原始证书,但是解码/重建apk删除了它。
svarog 2012年

Answers:


284

使用创建密钥

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

在这里查看更多信息


11
这应该是答案,27个投票对3个原始投票,来吧!
凯尔2015年

1
如果执行此操作并尝试安装APK,则可能会出现INSTALL_FAILED_DUPLICATE_PERMISSION错误。当原始APK无法覆盖(例如系统或内置应用)时,就会发生这种情况
Couitchy,2016年

@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Deo博士

13
如果您不想打扰创建密钥,则可以使用以下调试密钥:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore〜/ .android / debug.keystore app.apk androiddebugkey -storepass android
Pellet

3
是否有使用之间的差异jarsignerapksigner?一个需要签名然后再进行zipaligning,而另一个需要进行zipaligning然后再进行签名
Maria Ines Parnisari

72

自动化流程:

使用此工具(使用来自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

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:签署并验证

使用构建工具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//lib子文件夹中的.jar)中找到脚本文件。这样使用

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

并可以通过

apksigner verify my-app.apk

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


6
感谢uber-apk-signer!很棒的工具!
cantoni

2
对于构建工具24.0.3,调用zipalign的正确方法是:zipalign -p 4 my.apk my-
aligned.apk

感谢您的描述!首先尝试了uber-apk-signer,但失败了,可能是因为我在系统上安装了openJDK而不是Oracle“官方” java。所以我尝试了手动方式,但也失败了(仍然是相同的错误[INSTALL_PARSE_FAILED_NO_CERTIFICATES])。与尤伯杯APK-签名验证给了我一些进一步的深入了解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 '17

@antiplex请在github中而不是在报告问题
Patrick Favre

@ for3st您的意思是我的问题可能不是由于我对apk签名的了解有限,而是由于uber-apk-signer某种形式的不兼容?但即使如此,手动方式也失败了,这似乎与您的工具无关...
antiplex

14

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

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

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

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

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

该程序可以保存您的配置,因此,下次启动它时,只需单击Generate(生成)即可为您处理。而已。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.