目录

  • 一 储备知识
  • 二 友盟多渠道打包
  • 2.1 简介
  • 2.2 过程
  • 步骤1 准备工作
  • 步骤2 打包环节
  • 1. 手动打包
  • 2. 自动打包
  • 三 美团多渠道打包
  • 3.1 简介
  • 3.1.1. 第一代(META-INF方式)
  • 3.1.2 第二代(美团Walle)
  • 3.2 过程
  • 3.3 注意点
  • 四、 360多渠道打包
  • 4.1简介
  • 4.2过程
  • 五 总结
  • 六 参考文献


一 储备知识

先了解V1和V2的定义

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

再看下这几类热门多渠道打包方式的对比

android 固件打包工具 android打包v1v2_打包

二 友盟多渠道打包

2.1 简介

原理:
这种打包方式是使用Android Studio的编译工具gradle配合使用的,原理就是通过脚本修改AndroidManifest.xml中的mate-date内容,执行N次打包签名操作实现多渠道打包的需求
优点:

  • 安全且适合V1与V2

缺点

  • 因为每个渠道都是重新编译打包,所以耗时很久

补充知识点

  • Flavors:产品渠道,通过productFlavors针对不同的渠道进行配置
  • flavorDimensions: flavors的作用是扩大维度,flavorDimensions则是将维度再次扩大。
    举个例子,flavors渠道有小米,但是小米有分收费和免费版。这时候可以通过flavorDimensions来扩大维度(具体的可以找下博客很多的)。
  • BuildTypes : 构建类型,AndroidStudio的Gradle组件默认提供给了“debug”“release”两个配置。

2.2 过程

步骤1 准备工作

  1. 先在AndroidManifest.xml文件下输入以下这段配置
//这段包裹在application下,与activity同级别
<meta-data 
            android:name="UMENG_CHANNEL" 
            //value 用占位符
            android:value="${UMENG_CHANNEL_VALUE}"/>
  1. 在app的build.gradle的android{}中添加如下
//单独只有一个选择项时,所有渠道默认为该选项
 flavorDimensions "default"
 productFlavors {
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }

        q360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }

 }

如果几十个平台这样子写有点麻烦,可以直接这样子写,如下所示

//
 flavorDimensions "default"
 productFlavors {
        xiaomi {
        }

        q360 {
        }

    }
    //使用productFlavors.all字段统一配置
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
 }
  1. 通过mate-data信息来获取渠道
private String getChannel() {
        try {
            PackageManager pm = getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString("UMENG_CHANNEL");
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return "";
   }

步骤2 打包环节

打包方式分为两种

  • 手动打包
  • 自动打包
1. 手动打包

根据如下步骤

  • 选择Generate Signed APK
  • android 固件打包工具 android打包v1v2_打包_02


  • 下一步
  • 选择多个渠道,点击finish接着你的文件夹下就生成这两个apk了。
2. 自动打包
  1. 先打开 Project Structure
  2. android 固件打包工具 android打包v1v2_多渠道_03


  3. 添加签名信息
  4. 切换到Build Types标签,将Signing config选择为"release"
  5. 查看app的build.gradle 多出了如下红框部分的内容
  6. 接着通过Task打包,就会发现 ⁨app⁩/build⁩/outputs⁩/apk 目录下有所有渠道的包

三 美团多渠道打包

3.1 简介

作者传送门 多渠道神器walle 美团打包总共有两代

3.1.1. 第一代(META-INF方式)

原理
把一个Android应用包当作zip文件包进行解压,然后发现在签名生成的目录下(META-INF)添加一个空文件不需要重新签名。利用android签名不校验META-INF文件夹内容的漏洞,在此文件夹内放置渠道信息文件将不受签名限制

优点
直接使用已有的apk,解压放入渠道文件,再压缩,不用再签名。所以这种方式速度非常快,900个渠道包用时不到一分钟
缺点
1、只适用于V1
2、一些不法的渠道商很容易通过工具修改渠道。

3.1.2 第二代(美团Walle)

原理
利用V2签名的校验方式不校验APK Signing Block并且忽略APK Signing Block中多余的ID-VALUE这个特点,将渠道信息写到APK Signing Block中。

优点

  • 由于是直接对zip格式文件的操作,性能与添加zip注释方式相当,也是很快
  • 适用与V2

缺点
1、还是不安全

3.2 过程

Walle提供两种打渠道包方式:

  1. Gradle插件方式,方便快速集成
  2. 命令行方式,最大化满足各种自定义需求
  3. 配置好根目录下的Gradle
dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'

        classpath 'com.meituan.android.walle:plugin:1.1.6'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
  1. 配置好App的build.gradle文件中的apply这个插件
并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR

apply plugin: 'walle'

dependencies {
    compile 'com.meituan.android.walle:library:1.1.6'
}
  1. 配置好签名(具体步骤就是上面自动打包1,2,3步骤)
    最后也是
  2. 添加channel文件(用来获取所有渠道名)
  3. 配置插件(配置在app的build.gradle的android{}下 )
walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.buildDir}/outputs/channels");
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}
  1. 获取渠道名
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
  1. 打包方式(一)通过指令打包
//加clen就是先清除原先的
./gradlew clean assembleReleaseChannels
  1. 打包方式(二)通过task打包,点击下方红框内

3.3 注意点

  1. 使用360加固后,需要重新签名的,所以这种多渠道打包方式失效了
    解决方案:
  1. 先加固后签名,然后用walle对这个签名后的apk进行多渠道(亲测可行)。
  2. 使用该大神提供的打包脚本ProtectedApkResignerForWalle
  1. **有时候执行命令多渠道会导致R.java文件丢失,但是通过clean又能重新生成。
    解决方案:我们把命令中的clean 去掉,变为
    ./gradlew assembleReleaseChannels

四、 360多渠道打包

4.1简介

作者传送门 com/seven456/MultiChannelPackageTool">360多渠道原理
利用的是Zip文件“可以添加comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压zip文件(apk文件就是zip文件格式);
优点:
没有解压缩、压缩、重签名,没有兼容性问题,速度最快;写入的渠道号数据支持加密;
缺点:
只适用于V1,不适用于V2,安全。

4.2过程

过程很简单因为有可视化工具下载一下就好了

使用一看就懂如下

android 固件打包工具 android打包v1v2_友盟多渠道打包_04

五 总结

android 固件打包工具 android打包v1v2_android 固件打包工具_05