如何签署已编译的Apk

sva*_*rog 107 android apk android-install-apk

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

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Run Code Online (Sandbox Code Playgroud)

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

小智 254

使用创建密钥

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Run Code Online (Sandbox Code Playgroud)

然后使用以下方式签署apk:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Run Code Online (Sandbox Code Playgroud)

点击这里查看更多信息

  • 如果你不想打扰创建一个密钥你可以使用调试密钥:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore~/.android/debug.keystore app.apk androiddebugkey -storepass android (12认同)
  • 这应该是答案,27个赞成票与3个原始答案,加油! (8认同)
  • 使用`jarsigner`和`apksigner`有区别吗?一个需要签名,然后zipaligning和另一个zipaligning然后signinig (3认同)
  • 如果您执行此操作并尝试安装 APK,则可能会出现 INSTALL_FAILED_DUPLICATE_PERMISSION 错误。当原始 APK 无法被覆盖时(例如系统或内置应用程序),就会发生这种情况 (2认同)

pat*_*ckf 61

自动化流程:

使用此工具(使用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
Run Code Online (Sandbox Code Playgroud)

第2步或第4步:Zipalign

zipalign 这是Android SDK提供的工具,例如,%ANDROID_HOME%/sdk/build-tools/24.0.2/如果您想将apk上传到Play商店,则必须采用强制优化步骤.

zipalign -p 4 my.apk my-aligned.apk
Run Code Online (Sandbox Code Playgroud)

注意:使用旧版jarsigner时需要在签名进行zipalign .使用新apksigner方法时,请签名之前进行(令人困惑,我知道).在apksigner工作正常之前调用zipalign是因为apksigner保留了APK对齐和压缩(与jarsigner不同).

您可以验证对齐方式

zipalign -c 4 my-aligned.apk
Run Code Online (Sandbox Code Playgroud)

第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
Run Code Online (Sandbox Code Playgroud)

并且可以通过验证

jarsigner -verify -verbose my_application.apk
Run Code Online (Sandbox Code Playgroud)

使用构建工具24.0.3和更新版本

Android 7.0引入了APK Signature Scheme v2,这是一种新的应用程序签名方案,可提供更快的应用程序安装时间,并提供更多保护,防止对APK文件进行未经授权的更改(有关详细信息,请参阅此处此处).因此,Google实现了自己的apk签名者apksigner(duh!).脚本文件可以在%ANDROID_HOME%/sdk/build-tools/24.0.3/(.jar在/lib子文件夹中)找到.像这样使用它

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name
Run Code Online (Sandbox Code Playgroud)

并且可以通过验证

apksigner verify my-app.apk
Run Code Online (Sandbox Code Playgroud)

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

  • 感谢uber-apk-signer!很棒的工具! (5认同)
  • 对于构建工具24.0.3调用zipalign的正确方法是:zipalign -p 4 my.apk my-aligned.apk (2认同)

Pel*_*let 13

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

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android
Run Code Online (Sandbox Code Playgroud)

或在Windows上:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android
Run Code Online (Sandbox Code Playgroud)

  • jarsigner 已弃用,不应再使用。由 jarsigner 签名的 APK 不适用于最新的 Andorid 版本。 (2认同)

Nik*_*kov 6

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