使用jarsigner对APK重签名,提示:jarsigner: 无法对 jar 进行签名: java.util.zip.ZipException: invalid entry compressed size (expected 41278 but got 42575 bytes)

网上说解决办法是:把要重签名的apk后缀改成zip,打开后删除里面的META-INF目录,然后重新改成apk后缀

我采用的上面的方法,:unzip解压apk-->删除META-INF-->zip压缩成新的apk-->签名

                     新生成的apk,此方法apk虽然可以安装成功,但是不能使用,会崩溃。

所以以我自己的经验,不建议用上面的方法

我建议用这种方式:把要重签名的apk用apktool.jar反编译,打开后删除里面的META-INF目录,然后使用apktool重编译成改成apk,这样保险点

我的流程是这样的:(网上有很多apktool.jar的下载链接,就不详些了,比如https://ibotpeaches.github.io/Apktool/install/)

(1)java -jar apktool.jar d old_name.apk    (说明:反编译给定的old_name.apk)

(2) rm old_name.apk (说明:删除旧的apk)

(2) rm -rf old_name/original/META-INF  (说明:删除原有的签名相关的文件)

(3) java -jar apktool.jar b old_name (说明:重编译apk)

(4) mv old_name/dist/old_name.apk  target_name.apk (说明:重编译生成的apk就是old_name/dist/old_name.apk)

(5)jarsigner -verbose -digestalg SHA1 -sigalg SHA1withRSA -keystore aw.key -signedjar signed_target_name.apk  target_name.apk allis_aw -storepass secret

(说明:用java自带的命令jarsigner签名,签名算法可以根据自己的情况选择,jarsigner默认使用的是SHA1-256,如果需要指定签名算法为SHA1,需要加参数-digestalg SHA1 -sigalg SHA1withRSA,否则将会出现安装失败的问题,签名以后文件中显示的是SHA1-Digest,-keystore跟你的签名证书key存储文件,-signedjar new.apk old.apk allis_aw是你的key文件的简称  -storepass接key文件的密码,参考https://blog.csdn.net/chen_xi_hao/article/details/73801631)

(6)jarsigner -certs -verify signed_target_name.apk  (说明:验证签名)

(7)$zipalign -v 4 signed_target_name.apk  zipalign_signed_target_name.apk   (说明:压缩优化,参考https://blog.csdn.net/fulushan/article/details/80841649)

最后这个zipalign_signed_target_name.apk  就是我们需要的apk ,确保签名算法满足要求,安装后可以正常使用

 

  上面的方法对于改动apk是没毛病的,比如,我们打包了一个公版的包,所有的配置的都是开发默认设置的,这时候我们有个渠道包,比如小米渠道,只需要改下里面的图标,如果我们完全再重新打包小米的渠道包,如果apk多呢,简直就是浪费时间,这时我们可以用上面的方法,反编译apk,删掉META-INF,替换掉默认图标为小米的图标,再重编译apk,再签名就可以用了,这个过程脚本不要一分钟就搞定了,大概20几秒。

  如果我们不需要改apk里的东西呢,只是想重新签名一下,比如我们会有这样的场景需要验证,apk只能是我们自己的签名才能安装,如果其他人换用其他签名就会安装失败并报错签名不可用。这个时候我们只需要重新签名apk就可以了,如果还是采用反编译,删META-INF,重编译,再签名,一个apk,我们可以忍受,多个apk呢,就有点吃力了。这个时候,我们可以采用另一种方式签名:就是把key转化成pk8和pem文件,然后一条命令就可以完成重签名了,参考https://www.cnblogs.com/zndxall/p/9857767.html

另外转一篇如何判断两个apk的签名是否一致的博客:https://blog.csdn.net/qq_31490071/article/details/72842407

重签名提示:无法对 jar 进行签名: java.util.zip.ZipException的更多相关文章

  1. Java.util.zip adding a new file overwrites entire jar?(转)

    ZIP and TAR fomats (and the old AR format) allow file append without a full rewrite. However: The Ja ...

  2. [工具向]__androidstudio签名打包apk及配置自动签名

    前言 好几天了,没怎么更新了,最近迷上了抓妖,有些懈怠了,这两天在看android的一些东西,java暂时就先放了放,昨天终于是完成了一个小阶段的任务,今天来对这两天的东西进行一下总结. *** 因为 ...

  3. C# DllImport“调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配 ”

    调用外部dll时,出现如下问题 C# DllImport“调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配.请检查 PInvoke 签名的调用约定和参数与非托管的目标 ...

  4. 苹果企业版签名分发相关问题,蒲公英签名,fir.im分发,安装ipa设置信任

    苹果企业版签名分发相关问题,蒲公英签名,fir.im分发,安装ipa设置信任蒲公英 - 高效安全的内测应用发布.管理平台https://www.pgyer.com/app/signature分发版 2 ...

  5. 托管调试助手 "PInvokeStackImbalance":的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管

    在C#中一定要检查引用时的数据类型 WinAPI 的数据类型 默认是32位的,但是引用时外部的是 Long类型默认是64位的.所以引用时需要将 long 改为 int 型. 参照 http://blo ...

  6. 对PInvoke函数函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。

    C#引入外部非托管类库时,有时候会出现“对PInvoke函数调用导致堆栈不对称.原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配”的报错. 通常在DllImport标签内加入属性Call ...

  7. Windows 签名伪造工具的使用,Python,签名

    #!/usr/bin/env python3 # LICENSE: BSD-3 # Copyright: Josh Pitts @midnite_runr import sys import stru ...

  8. 如何用jar命令对java工程进行打包

    如何用jar命令对java工程进行打包 有时候为了更方便快捷的部署和执行Java程序,要把java应用程序打包成一个jar包.而这个基础的操作有时候也很麻烦,为了方便java程序员们能够方便的打包ja ...

  9. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

随机推荐

  1. python列表操作方法

    系统的列表操作方法不加赘述,这里增添一些列表操作技巧: 1.利用sum函数把多元列表变成一元: >>> texts_filtered_stopwords [['writing', ' ...

  2. tomcat的缺少tcnative-1.dll的解决(申明:来源于网络)

    tomcat的缺少tcnative-1.dll的解决 地址:http://blog.csdn.net/topwqp/article/details/7713388

  3. 爬虫----爬虫请求库selenium

    一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...

  4. eclipse安装Hadoop-0.20.2插件

    因为在使用Hadoop-0.20.2这个古董,需要使用它自带的eclipse插件,而我最初安装的是现代的eclipse4.10.0. 在经历两天,以及以下种种尝试之后,均以失败告终: 1.网上找适合的 ...

  5. [No0000192]Vim打开和保存文件-Vim使用技巧(7)

    使用Vim打开和保存文件是最常用的操作,介绍使用edit命令通过文件路径来打开文件,使用write命令保存文件,当文件路径不存在或用户权限不匹配时,使用write命令调用外部shell程序完成操作. ...

  6. python3写入csv文件时中文为乱码

    今天修改李万的爬虫时把页面上的中文写入csv文件时,中文总是乱码.通过上网搜索得到解决.解决的办法是打开文件是需加参数 encoding='utf-8-sig' .感谢博客园的菜鸟Alex.他相关博客 ...

  7. php值callback类型和匿名函数(闭包)

    callback.callable类型 自PHP5.4起可以使用callable类型制定回调类型callback. 本文档基于同样理由使用callback类型信息. 一些函数如call_user_fu ...

  8. xcode工程编译错误:"An instance 0xca90200 of class UITableView was deallocated while key value observers were still registered with it"

    An instance 0xca90200 of class UITableView was deallocated while key value observers were still regi ...

  9. [dpdk] dpdk启动几个线程

    看别人的代码搞得有点晕,突然有点不确定,再确认一次. 使用 helloworld程序测试一下. /root/dpdk-16.07/examples/helloworld 一:  只启动一个核心. [r ...

  10. eclipse debug调试时老是被URLClassLoader这个类拦截到,不能进入到要调试的类里面去

    在使用eclipse进行试的时候,一直进入到URLClassLoader,而不能正常的进入断点,后来经过查资料,解决方法如下: 上面是百度给出的答案,我把图贴在这里,以便以后其他组的朋友遇到这个问题的 ...