Android打渠道包方案总结

本篇是上一篇Android签名剖析的续章,主要总结了目前国内市面上Android应用的多种打渠道包的方案,并对新推出的Apk signature Scheme V2签名方案下的签名也进行了分析和总结

Android打渠道包方案的分类

按照是否需要保护渠道号来划分的话,可以把目前市面上的打渠道包的方案方案分成以下两个类别

  • 保护渠道号
    • 优点: 渠道号是受保护的,apk发出后,不会被第三方进行恶意修改渠道号
    • 缺点: 由于渠道号文件,或者存放渠道号的文件需要进行签名,所以打包速度不可能太快
    • 方案
      • 将渠道信息hard code在代码中或manifest文件中
      • 项目内放置渠道文件,然后代码中读取该文件来识别渠道
      • android studio的productFlavors方案
  • 不保护渠道号
    • 优点: 渠道号是不受保护的,所以可以采用一些特殊的打包方案,进行快速打包,而不必重新签名
    • 缺点: 可能会被第三方进行恶意修改渠道号
    • 方案
      • 美团META-INF方式打包方案
      • 添加zip注释方式打包方案
      • 美团Walle(V2多渠道打包方案)

APK Signature Scheme v2

在介绍各种打渠道包的方案前,先说说APK Signature Scheme v2

  • V1是jar Signature,来自JDK;Android 7.0中引入了APK Signature Scheme v2
  • V1: 是对ZIP条目进行验证,这样APK签名后可进行许多修改 - 可以移动甚至重新压缩文件。
  • V2: 验证压缩文件的所有字节,而不是单个ZIP条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。
  • 引入V2后,签名可选用以下几种方案
    1. 只使用v1签名:并不会影响什么,但是在7.0上不会使用更安全的验证方式
    2. 只使用V2签名: 7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
    3. 同时使用V1和V2: 所有机型都没问题。 在Android studio打签名包时默认使用的就是这种方式
  • 跟V2一同被google引入的还有SHA-256算法
    1. 它比SHA-1更加安全
    2. 但是有一个缺点是:对于Android4.2以前的机器可能会有一些兼容性问题,可以参考Android签名剖析

方案分析

  1. 渠道信息hard code在代码中或manifest文件中
    • 需要修改源文件,并编译打包,效率较低
    • 这种方案可以使用于V1和V2两种签名方式中
  2. 项目内放置渠道文件,然后代码中读取该文件来识别渠道
    • 比较笨的做法是修改源码中的配置文件,编译打包
    • 优化一点的方案是先打好一个包,然后其它的渠道包通过解压、修改、再压缩签名的方式
    • 不管是笨的做法还是优化一点的方案都可以使用在V1和V2两种签名方式中
  3. android studio的productFlavors方案,google说明
    • android studio自带的多渠道打包方案,功能非常强大,不仅仅是识别渠道信息,还能使用不同的源代码、资源等几乎所有不同渠道的打包需求
    • 但这种方式同样需要每个渠道都重新编译打包,对于只需要标记不同渠道信息的项目而言耗时太多
    • 一个优化的点:可以在打渠道包前,替换一下包含productFlavors的build.gradle,这样可同时出多个渠道包;而平常开发过程中使用不带productFlavors的build.gradle, 这样就避免了给所有的开发同学暴露渠道信息了。
    • 此种方法依然适用于V1和V2方案
  4. META-INF方式
    • 这是美团早期出的一种方案,可参考
    • 利用android签名不校验META-INF文件夹内容的漏洞,在此文件夹内放置渠道信息文件将不受签名限制
    • 打包签名一个无渠道信息的apk完成后,复制此apk并将不同渠道信息文件分别插入新生成的apk文件中,从而实现各渠道打包
    • 特点是:直接使用已有的apk,解压放入渠道文件,再压缩,不用再签名。所以这种方式速度非常快,900个渠道包用时不到一分钟
    • 只适用于V1签名方式,不适用于V2
  5. 添加zip注释方式
    • 参考
    • 利用android签名不校验zip文件注释信息的漏洞,apk本质是一个zip包,将渠道信息写入zip文件注释内将不受签名限制
    • 打包签名一个无渠道信息的apk完成后,复制此apk并将不同渠道信息字符串分别写入新生成的apk文件
    • 这种方式生成渠道包的速度也很快:100个渠道包只需10秒
    • 只适用于V1,不适用于V2
  6. 美团Walle
    • 参考
    • 是专门针对V2增强版签名的一种多渠道打包方案
    • 利用V2签名的校验方式不校验APK Signing Block并且忽略APK Signing Block中多余的ID-VALUE这个特点,将渠道信息写到APK Signing Block中。
    • 由于是直接对zip格式文件的操作,性能与添加zip注释方式相当,也是很快
    • 只适用于V2

总结

通过下表总结一下这几种打渠道包的方案

方案 是否安全 速度 是否适用于V2
渠道信息hard code在代码中或manifest文件中 适用
项目内放置渠道文件,然后代码中读取该文件来识别渠道 适用
productFlavors 适用
META-INF方式 不适用
添加zip注释方式 不适用
美团Walle 适用

由此可见

  • 安全和速度是成反比的,要想安全,打包速度就快不了,否则就不安全。其实想一想也就明白原因了
  • 打包快的方案,都是利用一些漏洞或特征来做的
  • 目前的三种快速打包方案,只有walle适用于V2,其余的两种都已经不适用了
  • 大家可以根据自己公司的需求,来决定采用哪种方案。 是速度还是安全?

参考

文章目录
  1. 1. Android打渠道包方案的分类
  2. 2. APK Signature Scheme v2
  3. 3. 方案分析
  4. 4. 总结
  5. 5. 参考