如何签署已编译的Apk

时间:2012-06-07 10:51:12

标签: android android-install-apk apk

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

原来的apk然后是由一个密钥库(在eclipse IDE上)签名的,这个不是,我怎么能用它在Eclipse之外的原始keystone文件正确签名呢?

5 个答案:

答案 0 :(得分:211)

使用

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

答案 1 :(得分:49)

自动流程:

使用此工具(使用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:Zipalign

例如,{p> zipalign which is a tool provided by the Android SDK如果您要将apk上传到Play商店,则%ANDROID_HOME%/sdk/build-tools/24.0.2/是必需的优化步骤。

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

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

您可以验证

的对齐方式
zipalign -c 4 my-aligned.apk

第3步:签署&验证

使用构建工具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 Signature Scheme v2,这是一种新的应用签名方案,可提供更快的应用安装时间,并提供更多保护,防止对APK文件进行未经授权的更改(有关详细信息,请参阅herehere)。因此,Google实施了他们的own apk signer called apksigner(呃!) 脚本文件可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/中找到(.jar位于/lib子文件夹中)。像这样使用它

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

可以通过

进行验证
apksigner verify my-app.apk

The official documentation can be found here.

答案 2 :(得分:10)

最快的方法是使用debug keystore进行签名:

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

更新回答

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

旧答案

检查apk-signer签署应用的好方法