android gradle 实例教程一(同时打多渠道包)
Posted 夜宿山寺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android gradle 实例教程一(同时打多渠道包)相关的知识,希望对你有一定的参考价值。
gradle多渠道
一,多渠道:
之前也很少接触gradle,后来因为一些需求,去研究了一段时间,先记录一下打多渠道包吧,首先得在项目的build.gradle文件里面加入下面几行。然后在build.gradle的同级目录下,输入gradle build就能够打出两个包来了,这个是非常方便的,针对多个市场来说,基本上一个命令就能够搞定所有的市场,而且还能够动态的变化
// 渠道列表
android
productFlavors
flavor1
applicationId "com.k.note1"
versionCode 20
flavor2
applicationId "com.k.note"
minSdkVersion 14
我用的gradle 版本是1.11 所以在项目的 build/outputs/apk中能够看到如下的版本
Note-flavor1-debug-unaligned.apk Note-flavor1-release-unsigned.apk Note-flavor2-debug-unaligned.apk Note-flavor2-release-unsigned.apk
以上的包都没有签名,而且默认是打两个包,分别是release和debug,但是很多时候我们不需要打debug得包,当市场比较多得时候打包速度会非常的慢,所以我们其实可以直接assembleRelease 这个task。
简化后的打包代码如下: 这个时候只需要输入 gradle rele 就能够打包release版本的包,同时deb也一样
android
productFlavors
flavor1
applicationId "com.k.note1"
versionCode 20
flavor2
applicationId "com.k.note"
minSdkVersion 14
task rele(dependsOn:"assembleRelease") <<
println "release complete"
task deb(dependsOn: "assembleDebug") <<
println "debug complete"
二.groovy脚本自定义渠道名:
一个市场加上一个flvor,确实有点头疼,同时如果我们还有更多需要扩展的需求,例如给某个市场加广告,某个市场不加广告,这些变态的需求,这个时候我们定义在这里就不太合适。我们需要通过对市场的命名来确定扩展相应的市场的需求,比如一个市场需要广告是安智的,另外一个广告是木蚂蚁的,这个时候我们可以通过命名的方式,例如:azAD.com.baidu mmy.com.baidu 可以通过这种命名方式来进行扩展。当然也得写相应的groovy脚本,其实写到这里,我也不会groovy脚本,大概的看了下教程,其实跟java差不多,所以顺手就写了
initAllResource()
def initAllResource()
//加载市场
initChannels()
//把加载后的广告生成渠道列表
android.productFlavors
project.ext.channels.each channel->
"$channel"
applicationId project.ext.appsettings['packageName']
//初始化市场
def initChannels()
//定义一个项目的数组,project.ext可以直接定义全局的变量
project.ext.channels=[]
//相对目录下得文件
def path="channles.txt"
//调用groovy的函数去遍历读取一行,判断如果是#开头,那么久不读。主要是用#来做注释
file(path).eachLineline->
println "loading... $line###"
line = line.trim();
if(line.size()>0&& !line.startsWith("#"))
//这里定义的是全局变量,之后在任意一个地方都可以访问
project.ext.channels.add(line)
channles.txt文件
com.baidu
com.360
以上的函数会再执行gradle的时候自动就默认调用函数initAllResource(),一下是全部的gradle配置文件
apply plugin: 'android'
android
compileSdkVersion 21
buildToolsVersion "21.0.0"
compileOptions.encoding = "UTF-8";
defaultConfig
applicationId "com.k.note"
targetSdkVersion 21
versionName "1.0"
versionCode project.ext.appsettings['versionCode']
versionName project.ext.appsettings['versionName']
minSdkVersion project.ext.appsettings['minSdkVersion']
targetSdkVersion project.ext.appsettings['targetSdkVersion']
applicationId project.ext.appsettings['packageName']
lintOptions
abortOnError false
// 渠道列表
productFlavors
flavor1
applicationId "com.k.note1"
versionCode 20
signingConfigs
myConfig
storeFile file("$project.ext.appsettings['keyfile']")
storePassword project.ext.appsettings['keycert']
keyAlias project.ext.appsettings['keyalias']
keyPassword project.ext.appsettings['keycert']
release
storeFile file("$project.ext.appsettings['keyfile']")
storePassword project.ext.appsettings['keycert']
keyAlias project.ext.appsettings['keyalias']
keyPassword project.ext.appsettings['keycert']
buildTypes
release
signingConfig signingConfigs.myConfig
// 发布版打开混淆,具体混淆规则可以百度
runProguard true
// 打开zip优化,优化可以较少app的大小,和app效率
zipAlign true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debug
runProguard false
zipAlign false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
initAllResource()
def initAllResource()
//加载市场
initChannels()
//把加载后的广告生成渠道列表
android.productFlavors
project.ext.channels.each channel->
"$channel"
applicationId project.ext.appsettings['packageName']
//初始化市场
def initChannels()
//定义一个项目的数组,project.ext可以直接定义全局的变量
project.ext.channels=[]
//相对目录下得文件
def path="channles.txt"
//调用groovy的函数去遍历读取一行,判断如果是#开头,那么久不读。主要是用#来做注释
file(path).eachLineline->
println "loading... $line###"
line = line.trim();
if(line.size()>0&& !line.startsWith("#"))
//这里定义的是全局变量,之后在任意一个地方都可以访问
project.ext.channels.add(line)
task rele(dependsOn:"assembleRelease") <<
println "release complete"
task deb(dependsOn: "assembleDebug") <<
println "debug complete"
project.ext.appsettings 这个是定义在同级目录下得配置文件,也是通过project.ext设置的全局变量
setting.gradle文件内容如下
project.ext.appsettings = [
'enumName' : 'Note',
'packageName' : 'com.k.note',
'versionCode' : 1,
'versionName' : '1.1.0',
'minSdkVersion' : 15,
'targetSdkVersion' : 21,
'keyfile' : "NoteKeys.jks",
'keyalias' : "Note_WK",
'keycert' : "qq123456",
]
keyfile是直接用studio生成的加密文件,具体可以百度下,非常简单
以上是关于android gradle 实例教程一(同时打多渠道包)的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 中的实例之动态修改AndroidManifest文件
Android Gradle 中的实例之动态修改AndroidManifest文件
Android Gradle 中的实例之动态修改AndroidManifest文件
Android Gradle 中的实例之动态修改AndroidManifest文件
Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )
Android Gradle 插件自定义 Gradle 任务 ⑥ ( 执行 Gradle 任务的简化版命令 | 同时执行多个 Gradle 任务的命令 )