52

如果我有一个 apk,我可以删除当前的签名以及如何使用不同的 .keystore 文件重新签名并仍然安装应用程序吗?

更新:我设法让它与 Jorgesys 的解决方案一起使用,而我之前搞砸的地方是我解压缩了 .apk,然后在删除 META-INF 文件夹并将文件扩展名更改回 .apk 后重新压缩它。我应该做的只是用winzip打开它并删除winzip里面的文件夹。

4

7 回答 7

74

试试这个

1) 将 .apk 的扩展名更改为 .zip

2) 打开并删除文件夹 META-INF

3) 将扩展名更改为 .apk

4) 使用 jarsigner 和 zipalign 与您的新密钥库。

希望能帮助到你

于 2010-07-16T17:27:30.113 回答
30

如果您正在寻找一个快速简单的解决方案,您可以使用Google 的apksigner命令行工具,该工具在 24.0.3 及更高版本中可用。

apksigner sign --ks release.jks application.apk

您可以在开发者 Android 网站上找到有关 apksigner 工具的更多信息。

https://developer.android.com/studio/command-line/apksigner.html

或者,您也可以使用开源 apk-resigner 脚本

开源 apk-resigner 脚本https://github.com/onbiron/apk-resigner

您所要做的就是下载脚本并输入:

   ./signapk.sh application.apk keystore key-pass alias
于 2013-04-22T11:31:22.520 回答
11

请注意,如果您使用v2 签名模式(如果您在 AS 中使用 build-tools 24.0.3+,则会自动使用该模式),您不能只从 APK 中删除 META-INF 文件夹,因为 v2 会将其签名数据添加到 zip 元块中。

但是,在 build-tools 24.03 (Android 7) 中引入的Google新的 apksigner能够退出 APK。您可以重复签名命令以使用新的密钥库/证书进行签名(旧的将被删除)。

apksigner sign --ks keystore.jks signed_app.apk

无耻插件:如果您想要一个可以签署多个 apk 并具有更好日志输出的更简单的工具,请使用:https ://github.com/patrickfav/uber-apk-signer (在后台使用 Google 的 apksigner.jar)

于 2016-11-18T15:31:40.537 回答
9
zip -d my_application.apk META-INF/\*
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
于 2016-01-17T21:05:19.503 回答
7

为发布签名:$1.apk -> $1_release.apk" GeneralMills&GoogleApps#2012 第 1 步:删除任何以前的签名 将 .apk 的扩展名更改为 .zip 打开并删除文件夹 META-INF 将扩展名更改为 .apk 或命令: • zip [originalapk] 示例: • zip "$1".apk -d

第 2 步:使用 release.keystore 签名。命令: • jarsigner –verbose –keystore [keystorefile] –signedjar [unalignedapk] [originalapk] alias_name 示例: • C:\Program Files\Java\jdk1.6.0_43\bin> jarsigner -详细 -keystore release.keystore -signedjar "$1"_unaligned.apk "$1".apk release

第 3 步:对齐命令: • zipalign -f 4 [unalignedapk] [releaseapk] 示例: • C:\Users\G535940\Downloads\adt-bundle-windows-x86\adt-bundle-windows-x86\sdk\too ls> zipalign -f 4 "$1"_unaligned.apk "$1"_release.apk

第 4 步:清理命令: • rm 4 [unalignedapk] 示例: • rm "$1"_unaligned.apk

其他命令可能会有所帮助:

  1. 使用 keytool keytool -genkey -alias -keystore 生成新密钥

  2. 列出密钥 keytool -list -keystore

为 Facebook 功能生成 keyhash 的命令

命令: • keytool -exportcert -alias alias_name -keystore [keystorefile] | openssl sha1 -二进制 | openssl base64

示例: • C:\Program Files\Java\jdk1.6.0_43\bin>keytool -exportcert -alias release -keyst ore release.keystore |opens l sha1 -binary | openssl base64

注意:为了签署我们的 apk,我们已将 JDK 从 1.7 降级到 1.6.0_43 更新。

原因:从 JDK 7 开始,默认的签名算法发生了变化,要求您在签名 APK 时指定签名和摘要算法(-sigalg 和 -digestalg)。

命令:jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] [originalapk] alias_name

于 2013-04-08T08:59:44.163 回答
3

上述所有解决方案都有效。请注意为什么重新压缩时它对您不起作用:

.apk 中的一些文件需要保持存储(压缩为 0%)。这是因为 Android 将使用内存映射 (mmap) 来读取内容,而无需解压到内存中。此类文件是 .ogg 和一些图标。

于 2013-06-11T11:07:58.663 回答
3

假设您的密钥存储在 中keys.keystore,您可以运行:

$ keytool -list -keystore keys.keystore
Your keystore contains 1 entry

your_key_alias, Jan 3, 2013, PrivateKeyEntry, 
Certificate fingerprint (SHA1): 8C:C3:6A:DC:7E:B6:12:F1:4C:D5:EE:F1:AE:17:FB:90:89:73:50:53

确定您的密钥的别名。然后运行:

zip -d your_app.apk "META-INF/*"
jarsigner -verbose -keystore keys.keystore \
   -sigalg MD5withRSA -digestalg SHA1 -sigfile CERT \
   your_app.apk your_key_alias

your_app.apk使用名为 的密钥重新签名your_key_alias

从 JDK 8 开始,额外的-sigfile CERT选项似乎是必需的。

于 2016-10-13T13:27:39.790 回答