如果我有一个 apk,我可以删除当前的签名以及如何使用不同的 .keystore 文件重新签名并仍然安装应用程序吗?
更新:我设法让它与 Jorgesys 的解决方案一起使用,而我之前搞砸的地方是我解压缩了 .apk,然后在删除 META-INF 文件夹并将文件扩展名更改回 .apk 后重新压缩它。我应该做的只是用winzip打开它并删除winzip里面的文件夹。
试试这个
1) 将 .apk 的扩展名更改为 .zip
2) 打开并删除文件夹 META-INF
3) 将扩展名更改为 .apk
4) 使用 jarsigner 和 zipalign 与您的新密钥库。
希望能帮助到你
如果您正在寻找一个快速简单的解决方案,您可以使用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
请注意,如果您使用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)
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
为发布签名:$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
其他命令可能会有所帮助:
使用 keytool keytool -genkey -alias -keystore 生成新密钥
列出密钥 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
上述所有解决方案都有效。请注意为什么重新压缩时它对您不起作用:
.apk 中的一些文件需要保持存储(压缩为 0%)。这是因为 Android 将使用内存映射 (mmap) 来读取内容,而无需解压到内存中。此类文件是 .ogg 和一些图标。
假设您的密钥存储在 中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
选项似乎是必需的。