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

前言

有一次,因为市场部通知我要打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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值