如果我有一个apk,我可以删除当前的签名,还有一些如何使用不同的.keystore文件重新签名并仍然安装应用程序?
更新:我设法让它与Jorgesys的解决方案一起工作,之前我搞砸了我解压缩.apk然后在删除META-INF文件夹并更改文件后重新解压缩它延伸回.apk。我应该做的只是用winzip打开它并删除winzip里面的文件夹。
答案 0 :(得分:67)
试试这个
1)将.apk的扩展名更改为.zip
2)打开并删除文件夹META-INF
3)将扩展名更改为.apk
4)将jarsigner和zipalign与新的密钥库一起使用。
希望有所帮助
答案 1 :(得分:26)
如果您正在寻找快速解决方案,可以使用开源apk-resigner脚本或Google的apksigner工具
开源apk-resigner脚本https://github.com/onbiron/apk-resigner
您所要做的就是下载脚本,然后输入:
./signapk.sh application.apk keystore key-pass alias
apksigner
命令行工具。apksigner sign --ks release.jks application.apk
您可以在开发者Android网站上找到有关apksigner工具的更多信息。
https://developer.android.com/studio/command-line/apksigner.html
答案 2 :(得分:8)
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
答案 3 :(得分:7)
签署发布:$ 1.apk - > $ 1_release.apk” 通用磨坊和放大器;的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 -verbose -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 -binary | openssl base64
实施例: •C:\ Program Files \ Java \ jdk1.6.0_43 \ bin> keytool -exportcert -alias release -keyst ore release.keystore |打开l sha1 -binary | openssl base64
注意: 为了签署我们的申请,我们已将JDK从1.7升级到1.6.0_43更新。
原因: 从JDK 7开始,默认的签名算法已经改变,要求您在签署APK时指定签名和摘要算法(-sigalg和-digestalg)。
命令: jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore [keystorefile] [originalapk] alias_name
答案 4 :(得分:6)
请注意,如果您使用v2 signing schema(如果您在AS中使用build-tools 24.0.3+,则会自动删除),您不能仅从APK中删除META-INF文件夹,因为v2会将其签名数据添加到zip meta block。
然而,在构建工具24.03(Android 7)中引入的谷歌new apksigner能够重新签名APK。您可以重复签名命令以使用新的密钥库/证书进行签名(旧的密钥库/证书将被删除)。apksigner sign --ks keystore.jks signed_app.apk
无耻插件:如果你想要一个更简单的工具,可以签署多个apks并使用更好的日志输出:https://github.com/patrickfav/uber-apk-signer(在后台使用Google的apksigner.jar)
答案 5 :(得分:3)
以上所有解决方案都有效。请注意为什么当您重新压缩时它不适合您:
.apk中的某些文件需要保留存储(压缩率为0%)。这是因为Android将使用内存映射(mmap)来读取内容而无需解压缩到内存中。这些文件是.ogg和一些图标。
答案 6 :(得分:1)
假设您的密钥存储在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
选项。