您的位置:首页 > 移动开发 > Android开发

android gradle 自动动态构建多平台的包

2014-01-06 17:25 513 查看
在gradle中,通过android插件可以设定不同的buildType来构建多平台的包。

当前需求是自动打出几个平台的包,还需要针对不同的平台生成不同的manifest。

android {
compileSdkVersion 17
buildToolsVersion "17.0.0"

defaultConfig {
minSdkVersion 10
targetSdkVersion 16
}

signingConfigs {
myConfig {
storeFile file("sign.sign")
}
}

//debug
sourceSets {
main {
aidl.srcDirs = ['src']
}
_360.setRoot('build-type/360')
coolapk.setRoot('build-type/coolapk')
}

buildTypes {
release {
signingConfig signingConfigs.myConfig
runProguard false
proguardFile 'proguard-android.txt'
}
_360 {
packageName='com.qihigh'
signingConfig  signingConfigs.myConfig
runProguard false
proguardFile 'proguard-android.txt' }
coolapk {
packageName='com.qihigh'
signingConfig  signingConfigs.myConfig
runProguard false
proguardFile 'proguard-android.txt' }
}
}


这样运行 gradle build 的时候,会自动打出几个平台的包,由于针对每个平台设置了sourceSet,所以每个平台都会采用指定的manifest,比如360会使用build-type/360下的,这里的manifest手动放置好即可。

但实际用的时候发现平台太多,每个都这么写的话,会使gradle的build文件很大,于是考虑动态构建。

在build-type下用一个type.txt来记录所有的平台,文件内容是

10086
360
360buy


然后编写gradle构建文件,思路就是读取文件中的每一行,动态的生成响应的buildTypes,当buildTypes生成之后,gradle会自动生成相应的sourceSets,然后再遍历sourceSet进行设置。

manifest也不能手工放置了,也采用程序的方式来处理。这里例子为了简单,只在最后加了一行注释。

android {
compileSdkVersion 17
buildToolsVersion "17.0.0"

defaultConfig {
minSdkVersion 10
targetSdkVersion 16
}

signingConfigs {
myConfig {
storeFile file("sign.sign")
}
}

setup()
}

def setup() {
//输入参数中包含 -Pmc 时才进行多渠道构建
if (project.hasProperty('mc')) {
//多渠道构建
println "multi channel"
//渠道源
def path = "./build-type/type.txt"
//有的渠道是纯数字,不能用来做名字,这里统一加个前缀
def prefix = "_"
file(path).eachLine { line ->
println line
def f = file("./build-type/$line");
if (!f.exists()) {
f.mkdir()
}
//针对不同平台,生成不同的 Manifest
copyManifest(line)
}
file(path).eachLine { line ->
android.buildTypes.create(prefix + line, {
packageName = 'com.qihigh'
signingConfig android.signingConfigs.myConfig
runProguard false
proguardFile 'proguard-android.txt'
})
//println "lalala:" + android.sourceSets
android.sourceSets.findAll { source ->
source.name.equals(prefix + line)
}.each { source ->
println "source:$source.name type:build-type/$line"
source.setRoot("build-type/$line")
}
}
}
}

def copyManifest(String type) {
BufferedReader reader = file('./src/main/AndroidManifest.xml').newReader('utf-8')
StringBuffer _file = new StringBuffer()
reader.eachLine { line ->
_file.append(line).append("\n")
}
reader.close()

def dest_file = file("./build-type/$type/AndroidManifest.xml")

BufferedWriter writer = new BufferedWriter(new FileWriter(dest_file))
writer.write(_file.toString() + "<!-- $type -->")
writer.close()
}


最终目录结构:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: