Android 7.0多渠道打包Signature Scheme v2签名失效

更新: 文末新添了脚本打包方式,简单快捷,想直接使用的直接跳到脚本打包部分。

最近在发布应用上传市场的时候发现在 腾讯应用宝 上传失败,说是什么腾讯管家检测到app有病毒,看见这个当时我就不乐意了,索性我就安装了个管家然后预料之中没有出现所谓的病毒;这里我就不想吐槽了。最后发现是在android 7.0新出的签名机制上引发的问题;

APK Signature Scheme v2介绍
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案(v1)来签署您的应用。

场景
问题就是出在这里,当你的应用被v2签名后,如果在进一步对应用进行更改则会导致签名无效;这里我所做的修改就是打渠道包。

但凡发布过应用的都知道目前主流的渠道号方案主要有以下几种:

  1. 修改后重新打包或签名的,例如在AndroidMainfest里面添加mata-data等
  2. 修改后不需要重新签名,主要有两种:
    • 直接把apk包看成一个zip包,然后在zip包的注释段添加对应的渠道信息
    • 直接把apk包看成一个zip包,然后利用相关命令在META-INF内注入${channel}.txt 文件

其中下面两种不需要重新签名的方法,被各主要渠道广泛使用。我们就是采用的第二种方案,写成一个python脚本然后打包嗖嗖的。很显然这种方案在签名后对应用进行了修改所以导致v2签名失效。

解决方案

既然问题出现了肯定会有解决方案,不然也不会有这篇博客了。。。

方案有三种:
1. 切换v1签名方式。
2. 先打渠道信息再签名打包。
3. 使用美团的Walle

首先第一种方案固然可解燃眉之急但却不是长久之策,不过这里也提供实际操作:

打开模块级 build.gradle 文件,然后将行 v2SigningEnabled false 添加到您的版本签名配置中:

 android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }

第二种方案是比较官方的方法了,无论何时都可以使用,但是缺点就是太慢了,如果渠道比较多的就呵呵了。。。感兴趣的朋友可以感受下。。。
第三种就是美团新出的多渠道打包工具Walle

有兴趣的可以看看具体介绍:新一代开源Android渠道包生成工具Walle 里面对v2也有详细的介绍。这里我们主要介绍操作。

开工

在打包之前我们可以使用一个开源工具来检测下我们的apk签名状态:CheckAndroidV2SignatureByAPKSig

有关具体介绍大家可以看看Android-GetAPKInfo
这里我们直接操作:

首先我们先对之前发布失败的apk进行检测看看(目录为工具和apk所在目录):
使用方式: java -jar CheckAndroidV2Signature.jar v2app.apk

这里写图片描述

可以看到v1是没有问题的,但是v2确实检测失败了;所以到这里验证了v2签名果然是失效了。

接下来我们重新用Android Studio 打包一个包含v1和v2两种签名的签名包,然后使用Walle来打渠道包(为了方便使用我把工具和apk放同一个目录下):
ps:360平台比较特殊,后面单独介绍。

使用方式:
1、写入单个渠道
  java -jar walle-cli-all.jar put -c yingyongbao app.apk
2、写入多个渠道
  java -jar walle-cli-all.jar batch -c yingyongbao,360,xiaomi app.apk
3、通过指定渠道配置文件
  首先在同级目录下新建一个channel.txt文件然后写入渠道信息:如下图1-1;
  java -jar walle-cli-all.jar batch -f channel app.apk


这里写图片描述

               图1-1

这样之后就会在同级目录下生成相应的渠道包。

之后对新生成的apk进行检测:


这里写图片描述

可以看到这下v1、v2都是有效状态了。

上面提到了360平台的特殊性,因为360平台上传之前需要先进行加固,这样会导致渠道信息的获取失败,而且360加固助手不支持v2签名,这里就很蛋疼了,所以就需要特殊处理了。

360手机助手 处理
下载地址:
360jiagubao_windows_64
360jiagubao_windows_32
一、安装完最新的加固助手后,在配置信息里面将启动自动签名去掉;这里只使用它的加固功能,不需要签名,因为它的签名只支持v1。接着加固应用,生成加固后的应用。如图:


这里写图片描述

这里写图片描述

二、使用Android SDK中的zipalign - 对齐操作 - 优化
ps:(利用tools文件夹下的zipalign工具。首先调出cmd命令行,然后执行:zipalign -v 4 source.apk androidres.apk。这个方法不受API Level的限制,可以对任何版本的APK执行Align优化。
检查当前APK是否已经执行过Align优化。命令:zipalign -c -v 4 androidres.apk)

1、打开CMD,进入Android SDK -> build-tools -> 25.+目录,(这里如果没有这个文件夹,那说明你的sdk需要更新了)
2、执行命令:zipalign -v 4 [待优化.apk路径] [优化后.apk路径]
   例:zipalign -v 4 test.apk test_aglin.apk

成功后如下图:
这里写图片描述

三、使用zipalign 签名

1、打开CMD,进入Android SDK -> build-tools -> 25.+目录,这里与上面一样,没有对应目录请更新sdk。
2、执行命令:apksigner sign --ks [你的签名文件] [apk路径]
    例:apksigner sign --ks android.jks test_aglin.apk
  之后会输入签名文件密码,密码不会显示。不报什么错即成功,这里不会生成新的apk,就是上面第二步生成的apk,检测会发现签名有变化。

签名成功:
这里写图片描述

四、使用walle打渠道包:
这里的步骤就和上面打其他渠道包一样了:java -jar walle-cli-all.jar put -c 360shoujizhushou amber.apk
最后检测签名状态 java -jar CheckAndroidV2Signature.jar amber.apk
查看渠道信息:java -jar walle-cli-all.jar show amber.apk
这里就不给出图片了,到这一步基本就没问题了。有兴趣的自己具体操作看看。

五、渠道信息的获取:
有同学会问打完渠道包后怎么获取渠道信息呢?这里确实有点疏忽了,因为本章内容是以命令行形式来完成的,所以缺少了工具;如果是以命令行形式集成的可以下载:渠道信息获取, 如果是以插件方式集成的则无需下载;其实前者也只是从walle项目中提取出来的而已。

//注意:这里只有打完渠道包后才会有值。
使用方式:String channel = WalleChannelReader.getChannel(this.getApplicationContext());

更多使用方式请看:walle
ps:如果要配合友盟使用的话则需要在代码里面配置参数,具体查看文档友盟统计:2.2.5 在代码中配置Appkey和Channel

脚本打包
一、Python脚本 (全平台需要Python环境)
下载地址:https://github.com/Jay-Goo/ProtectedApkResignerForWalle

二、Windows
下载地址:packtool
脚本其实就是将上面的操作写成了批处理的方式,下面直接看怎么使用:
下载完解压后的目录:
这里写图片描述

lib里面是一些Android sdk的签名工具,以及walle等,需要更新的直接替换就行。
1、在channel.txt 里面配置渠道号,语法参考walle里面(上面有给出);
2、在config.ini 里面配置应用的签名信息(注意:这里第一行留一行空白),其中storeFile直接写签名的路径即可;例如:D:\android\store.jks
3、打正常渠道包使用:packtool_normal.bat;打360加固过的包使用:packtool_360.bat。
ps:如何得到360加固过的包,请看上面的360手机助手 处理 一节

使用方式:
方式一、直接将生成的apk文件用鼠标拖到 packtool_normal.bat上,360加固的则拖到packtool_360.bat上。

方式二、使用cmd命令行,在当前目录下:packtool_normal.bat [APP名称].apk360加固的则是:packtool_360.bat [APP名称].apk

4、最后生成的文件在/cache/apks目录下。

好了今天分享就到这了,有什么问题敬请指出。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值