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

来源:互联网 发布:linux shell exit 1 编辑:程序博客网 时间:2024/05/01 15:12

在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来记录所有的平台,文件内容是

10086360360buy

然后编写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()}

最终目录结构:


0 0
原创粉丝点击