安卓多渠道打包汇总(很全面,囊括了几乎所有)

来源:互联网 发布:数据分析专业 上海财经 编辑:程序博客网 时间:2024/05/17 05:17

前言

有一次,因为市场部通知我要打30个渠道包,然后我傻傻的用了AS打所有的渠道包,结果花了30多分钟,这是一次痛苦的经历了^_^,所以今天就在这里汇总下当前大家都在用的多渠道打包方法,比较它们的优缺点。你可以找到一款适合你的方法。

1. 使用AS实现多渠道打包

其实就是用了AS的gradle脚本productFlavors来完成多渠道打包。下面我写的,为了灵活性,我把渠道放到了一个txt文件,有兴趣的话可以看下我之前写的项目:HappyFactory
原理: gradle脚本读取productFlavors的配置,循环打包

productFlavors {        productFlavors.all { flavor ->            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]        }        new File('app/渠道.txt').eachLine {            def array = "$it".split(",")            def variant = array[0];            int size = array.length;//            println("variant is $variant and size is $size")            "$variant" {                if (size >= 2) {                    def appId = array[1];                    if (!"$appId".isEmpty()) {//                        println("varint is $variant and appId is $appId")                        applicationId "$appId"                    } else {//                        println("varint is $variant and appId is empty")                    }                    if (size >= 3) {                        def filterTag = array[2]                        if ("$filterTag".contains("df")) {//                            println("varint is $variant and filterTag is df")                            buildConfigField 'String', 'filterTag', '"df"'                        } else if ("$filterTag".contains("rf")) {//                            println("varint is $variant and filterTag is rf")                            buildConfigField 'String', 'filterTag', '"rf"'                        } else {//                            println("varint is $variant and filterTag is empty")                        }                    }                }            }        }    }
  • 优点:可以利用productFlavors,特别是当每个渠道包需要不同代码,不同包名,不同icon时
  • 缺点:假如有30个渠道包,相当于你要连续编译30次,速度非常慢。

2. 向apk写入注释

原理: 读取渠道列表,依次把渠道名称当成注释写入apk文件
apk也是一个zip,所以利用了这点,向apk写入了注释,写入的注释就是我们的渠道名。这里写图片描述

代表工具:MultiChannelPackageTool,packer-ng-plugin,它们的原理是一样的,只不过packer-ng-plugin可以集成到AS,通过gradle来打多渠道包。

  • 优点:速度非常快,因为打一个新的渠道包,只需要向源APK写入一个注释就行了
  • 缺点:不能适用android7.0及以后,因为android7.0以后增加了APK Signature Scheme v2,不支持productFlavor

3. 向apk的META-INF目录写入空文件

原理: 读取渠道列表,依次把渠道名称写入到META-INF目录下面的空文件,每次都要解压,重新压缩APK

该方法巧妙利用了Android系统在5.0之前忽略空文件签名的问题,实现了不需重新签名即可插入渠道信息的功能,向apk文件的META-INF目录写入了一个空文件,如下图:
这里写图片描述

代表工具:美团第一代渠道打包

  • 优点:速度非常快,跟第2种方法速度差不多。
  • 缺点:Android5.0以后手机无法安装(原因上面结束了5.0之前的漏洞),不支持productFlavor,不支持APK Signature Scheme v2

4. 修改apk下的AndroidManifest.xml文件

原理: 读取渠道包列表,每次都要解压apk,修改AndroidManifest.xml的meta为对应的渠道名称,然后重新编译
这个就是利用apktool工具反编译apk。

代表工具:友盟渠道打包,gradle-packer-plugin

  • 优点:好像没有(⊙o⊙)…
  • 缺点:速度慢,不支持productFlavor,不支持APK Signature Scheme v2,稳定性差,因为涉及到修改了编译的二进制文件,可以试想反编译出来的apk是不是稳定性很差。

5. 向APK Signing Block写入信息

需要先了解下APK Signature Scheme v2的原理,如下图:
这里写图片描述
加密后多了一个APK Signing Block区域,而第5种打包方式正式利用了这点,向APK Signing Block写入渠道信息

美团第二代渠道打包:瓦力

  • 优点:速度快,支持APK Signature Scheme v2, 可以结合productFlavor
  • 缺点: 当有多个productFlavor时,针对每个productFlavor打包跟第1种方法情况类似。

6.补充

6.1 混合方式

代表:ApkMultiChannelPlugin,包括了第2,3,4种方法

6.2 使用360加固等软件。

这里写图片描述
通过上图,我们知道了怎么配置渠道列表,原理就是第4种方法,修改Apk的AndroidManifest.xml,然后重新打包。其他的加固软件还没有试过,以后有机会再补上。

编者按:以上方法都可以集成到友盟,我们了解下友盟集成多渠道的方法

  • 静态写入到AndroidManifest.xml
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/><meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
  • 动态写入
MobclickAgent. startWithConfigure(UMAnalyticsConfig config)UMAnalyticsConfig(Context context, String appkey, String channelId)UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType)UMAnalyticsConfig(Context context, String appkey, String channelId, EScenarioType eType,Boolean isCrashEnable)

所以只要获取了渠道名,然后直接动态写入到友盟的配置就行了。其他诸如腾讯云分析,百度移动统计都类似。

阅读全文
1 0