Android多渠道打包(六):maven&gradle
来源:互联网 发布:做美工的配置要多少? 编辑:程序博客网 时间:2024/05/14 03:38
本章将介绍maven、gradle构建工具打包方式
Android多渠道打包(一):基础多渠道打包
Android多渠道打包(二):友盟多渠道打包
Android多渠道打包(三):美团多渠道打包
Android多渠道打包(四):360多渠道打包
Android多渠道打包(五):360多渠道打包+
Android多渠道打包(六):maven&gradle
Android多渠道打包(七):系列总结及展望
原理
都是采用在AndroidManifest.xml的节点中添加如下元素,构建时替换value值得方式。
实现
- Maven
Maven是一个软件项目管理和自动构建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以很方便的生成渠道包,下面简要介绍下打包过程,更多Maven以及插件的使用方法请参考相关文档。
首先,在AndroidManifest.xml的节点中添加如下元素,用来定义渠道的来源:
<!-- 使用Maven打包时会用具体的渠道号替换掉${channel} --><meta-data android:name="channel" android:value="${channel}" />
定义好渠道来源后,接下来就可以在程序启动时读取渠道号了:
private String getChannel(Context context) { try { PackageManager pm = context.getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("channel"); } catch (PackageManager.NameNotFoundException ignored) { } return ""; }
要替换AndroidManifest.xml文件定义的渠道号,还需要在pom.xml文件中配置Resources插件:
<resources> <resource> <directory>${project.basedir}</directory> <filtering>true</filtering> <targetPath>${project.build.directory}/filtered-manifest</targetPath> <includes> <include>AndroidManifest.xml</include> </includes> </resource></resources>
准备工作已经完成,现在需要的就是实际的渠道号了。下面的脚本会遍历渠道列表,逐个替换并打包:
#!/bin/bashpackage(){ while read line do mvn clean mvn -Dchannel=$line package done < $1}package $1
在前期渠道很少时这种方法还可以接受,但只要渠道稍微增多该方法就不再适用了,原因是每打一个包都要执行一遍构建过程,效率太低。
- gradle
以友盟的渠道统计为例,渠道信息一般在 AndroidManifest.xml中修改以下值:
<meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />
首先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
其中${UMENG_CHANNEL_VALUE}
中的值就是你在gradle中自定义配置的值。
build.gradle文件就利用productFlavors这样写
productFlavors { wandoujia { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } c360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"] } uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"] } }
其中[UMENG_CHANNEL_VALUE: "wandoujia"]
就是对应${UMENG_CHANNEL_VALUE}
的值。
不过现在有个更加简洁的写法
productFlavors { wandoujia {...}//支持在{}定义属性 baidu {...} c360 {...} uc {...}productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]}}
或者像下面这样设置
<!--1、添加channels.properties渠道信息配置文件-->#默认渠道channel.default=paojiao#全部渠道列表channel.list=baidu,c360,uc
apply from: "../channels.gradle"
productFlavors { for (int i = 0 ; i < channelArray.size(); i++) { def channel = channelArray[i] "${channel}"{ manifestPlaceholders = [CHANNEL_VALUE: channel] } }}
在android studio中sync gradle在build下可以看到
直接在gradle中点击assemble
可构建所有渠道的包
单独点击对应渠道的assemble
比如assembleC360
可以单独构建出C360渠道的包
代码中获取渠道值如下代码
private String getChannel(Context context) { try { PackageManager pm = context.getPackageManager(); ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); return appInfo.metaData.getString("channel"); } catch (PackageManager.NameNotFoundException ignored) { } return ""; }
优缺点
maven&gradle对于每个渠道都会单独构建一次,比较耗时,但是可以对各个渠道更加细化的定制。可以和Android多渠道打包(五):360多渠道打包+按实际情况选用。
渠道定制方法如下:
android { ... defaultConfig { minSdkVersion 8 versionCode 10 } productFlavors { flavor1 { applicationId "com.example.flavor1" versionCode 20 } flavor2 { applicationId "com.example.flavor2" minSdkVersion 14 } }}
android { ... flavorDimensions "abi", "version" productFlavors { freeapp { dimension "version" ... } paidapp { dimension "version" ... } arm { dimension "abi" ... } mips { dimension "abi" ... } x86 { dimension "abi" ... } }}
具体可参考new-build-system/user-guide
引用
new-build-system/user-guide
umeng 论坛
美团点评技术文章
- Android多渠道打包(六):maven&gradle
- Android Studio六--Gradle多渠道打包
- android Gradle多渠道打包
- Gradle Android 多渠道打包
- android gradle 多渠道打包
- Android Gradle多渠道打包
- ANDROID --GRADLE多渠道打包
- Android---Gradle 多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- Android Studio系列教程六--Gradle多渠道打包
- 设置登录用户cookie值
- 广东国庆旅游
- Codeforces 455A Boredom【dp】
- CentOS 安装 supervisor 进程管理工具
- 用户以及文件管理基本命令
- Android多渠道打包(六):maven&gradle
- Spring 开启Annotation <context:annotation-config> 和 <context:component-scan>诠释及区别
- 最美花朵
- MySQL基础篇--安装与配置
- 正则表达式必知必会
- storm的tail特性和stream grouping
- PHP学习笔记四(PHP开发工具Zend Studio)
- Codeforces Round #357 (Div. 2) C Heap Operations (模拟)
- Xilinx 中时钟的使用