zoukankan      html  css  js  c++  java
  • 使用apktool、jarsigner反编译并重新签名apk

    问题来源:

                  使用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)(说明:压缩优化,参考https://blog.csdn.net/fulushan/article/details/80841649)

                 zipalign_command="/usr/local/sdk/build-tools/25.0.3/zipalign"

                 $zipalign_command -v 4 signed_target_name.apk  zipalign_signed_target_name.apk   

    最后这个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

  • 相关阅读:
    HDU 5821 Ball (贪心)
    hdu 5826 physics (物理数学,积分)
    HDU 5831 Rikka with Parenthesis II (贪心)
    HDU 2669 Romantic (扩展欧几里得定理)
    POJ 2442 Sequence
    HDU 3779 Railroad(记忆化搜索)
    博客园首页新随笔联系管理订阅 随笔- 524 文章- 0 评论- 20 hdu-5810 Balls and Boxes(概率期望)
    hdu 5813 Elegant Construction (构造)
    hdu 5818 Joint Stacks (优先队列)
    C#字段和属性
  • 原文地址:https://www.cnblogs.com/zndxall/p/9628475.html
Copyright © 2011-2022 走看看