Android多渠道打包(六):maven&gradle
2016-10-06 15:21
281 查看
本章将介绍maven、gradle构建工具打包方式
Android多渠道打包(一):基础多渠道打包
Android多渠道打包(二):友盟多渠道打包
Android多渠道打包(三):美团多渠道打包
Android多渠道打包(四):360多渠道打包
Android多渠道打包(五):360多渠道打包+
Android多渠道打包(六):maven&gradle
Android多渠道打包(七):系列总结及展望
Maven是一个软件项目管理和自动构建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以很方便的生成渠道包,下面简要介绍下打包过程,更多Maven以及插件的使用方法请参考相关文档。
首先,在AndroidManifest.xml的节点中添加如下元素,用来定义渠道的来源:
定义好渠道来源后,接下来就可以在程序启动时读取渠道号了:
要替换AndroidManifest.xml文件定义的渠道号,还需要在pom.xml文件中配置Resources插件:
准备工作已经完成,现在需要的就是实际的渠道号了。下面的脚本会遍历渠道列表,逐个替换并打包:
在前期渠道很少时这种方法还可以接受,但只要渠道稍微增多该方法就不再适用了,原因是每打一个包都要执行一遍构建过程,效率太低。
gradle
以友盟的渠道统计为例,渠道信息一般在 AndroidManifest.xml中修改以下值:
首先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
其中
build.gradle文件就利用productFlavors这样写
其中
不过现在有个更加简洁的写法
或者像下面这样设置
在android studio中sync gradle在build下可以看到
直接在gradle中点击
单独点击对应渠道的
代码中获取渠道值如下代码
渠道定制方法如下:
具体可参考new-build-system/user-guide
umeng 论坛
美团点评技术文章
Android多渠道打包(一):基础多渠道打包
Android多渠道打包(二):友盟多渠道打包
Android多渠道打包(三):美团多渠道打包
Android多渠道打包(四):360多渠道打包
Android多渠道打包(五):360多渠道打包+
Android多渠道打包(六):maven&gradle
Android多渠道打包(七):系列总结及展望
原理
都是采用在AndroidManifest.xml的节点中添加如下元素,构建时替换value值得方式。实现
MavenMaven是一个软件项目管理和自动构建工具,配合使用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/bash package(){ 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-guideumeng 论坛
美团点评技术文章
相关文章推荐
- Android Maven打包批量替换资源文件(overlay换皮肤)&AAR打包依赖模块覆盖策略
- android开发之Jenkins+Gradle实现android开发持续集成、多渠道打包
- Android Studio之Gradle多渠道打包
- Android开发之Jenkins+Gradle实现持续集成、apk多渠道打包
- Android之Maven集成Ant多渠道打包
- Android Studio使用Gradle多渠道自动打包
- Android Gradle实用技巧——多渠道打包
- Android Studio--Gradle多渠道打包
- Android之Android Studio--Gradle多渠道打包
- gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
- AndroidGradle --多渠道打包配置(转发)
- gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
- [置顶] Android 多渠道打包:使用Gradle和Android Studio
- 【转】Android 多渠道打包:使用Gradle和Android Studio
- Gradle 进行 Android 多渠道多包名换图片全自动打包
- maven 学习笔记(七)-(完整Android项目多渠道打包、签名、混淆进阶)
- 友盟多渠道打包工具包 Parsing ‘AndroidManifest.xml' error : 未能找到文件
- 【Android Studio探索之路系列】之十:Gradle项目构建系统(四):Android Studio项目多渠道打包
- android产品研发(五)-->多渠道打包
- Gradle Android 多渠道打包