Android多渠道打包详解

来源:互联网 发布:java经典实例 第三版 编辑:程序博客网 时间:2024/06/08 01:10

Android应用市场百花争艳,应用宝,baidu,小米,豌豆荚等等都是各自占据一方,为了对每个市场的应用下载以及该渠道市场上的一些行为(下单等)数据分析,所以Android要打出不同渠道的包,以方便APP客户端在API请求时带入渠道号区分不同的市场,然后做进一步的分析,指导产品或者市场以及其他方面的下一步决策,今天就和大家一起分享一下Android多渠道打包的几种方法,与大家共勉。
目前多渠道打包有如下几种方法:
(1)在apk文件中的META-INF文件夹中写入以渠道号命名的空文件方式,——Perfect,快,但是需要维护脚本。
(2)gradle自带的manifestPlaceholders && productFlavor方式——Good,简单
(3)代码实现——normal
第一种:思路就是先打包生成一个apk,然后在该apk的基础上生成其他渠道包即可,不需要再重新签名,能节省不少打包时间。(我在APK包文件分析的时候所说的META-INF中插入空文档,直接修改名字作为apk的渠道号)
首先在AndroidManifest.xml中配置如下值:

<meta-data        android:name="channel"        android:value="${channel}" />

使用apktool decode应用程序apktool d *.apk build
这里写图片描述
在META-INF目录内添加空文件,可以不用重新签名应用。因此,为不同渠道的应用添加不同的空文件,通过文件名可以唯一标识一个渠道。脚本如下:

import zipfilezipped = zipfile.ZipFile(*.apk, 'a', zipfile.ZIP_DEFLATED) empty_channel_file = "META-INF/channel_{channel}".format(channel=360)zipped.write(empty_file, empty_channel_file)

获取Channel信息:

ApplicationInfo appinfo = context.getApplicationInfo();        String sourceDir = appinfo.sourceDir;        解析对应目录——如果有需要可以发。

第二种:首先分享一个最常用的办法,此方法是基于Umeng的统计,友盟官方文档中规定要在AndroidManifest.xml中配置如下值:

<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

Channel_ID渠道标识。在编译时候这个值能够自动变化以满足区分多渠道的需求。
项目配置示例:首先在项目的AndroidManifest.xml中配置

<meta-data            android:name="UMENG_APPKEY"            android:value="......" /><meta-data            android:name="UMENG_CHANNEL"            android:value="${GRADLE_CHANNEL_VALUE}" />

然后使用Gradle Android插件里的另一个功能,manifestPlaceholders。修改相关打包脚本如下:
这里写图片描述
这里写图片描述
这里写图片描述
ProductFlavors作用是定义产品特性,配合 manifest merger 使用,实现在一次编译过程中为每个渠道包产生不同的 GRADLE_CHANNEL_VALUE的值。
也可以简单配置成如下方式:

android {      productFlavors {        360{            manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "360"]        }        baidu{            manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "baidu"]        }        wandoujia {            manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "wandoujia"]        }        ......    }  

在应用启动的时候获取渠道文件,就可以进行相应的分析记录了,代码如下:

PackageManager pm = context.getPackageManager();ApplicationInfo info = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);return info.metaData.getString("channel");

第三种:在build.grale中配置如下:

android {    // 这里是你的其他配置    productFlavors{        360{  }        wandoujai {  }        baidu{  }    }    ......}

然后在app/src下面,分别创建和main同级目录的文件夹360, wandoujia, baidu,这三个文件夹里面都各只有一个AndroidManifest.xml文件,文件只需要如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="package.name">    <application>          <meta-data android:name="CHANNEL_VALUE" android:value="360"/>    </application></manifest>
0 0