在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()}

最终目录结构:


更多相关文章

  1. 用 Python脚本生成 Android(安卓)SALT 扰码
  2. Android单个模块编译
  3. android Ant批打包学习(二)---生成有签名且混淆的apk包
  4. Android(安卓)平台上,界面元素在定时器的响应函数里刷新。
  5. 使用命令行签名Android应用程序
  6. Android系统源码极速搜索引擎(OpenGrok)
  7. android之从Bmob获取数据显示在ListView中
  8. Android(安卓)Rom签名文件的生成与签名
  9. Android(安卓)增量更新实例(Smart App Updates)

随机推荐

  1. android的wake_lock介绍
  2. Android的ANR详解(原因和方案)
  3. Android(安卓)绘制文本垂直居中
  4. android 编译系统阅读与分析(1)-envsetup
  5. 简单android联网
  6. android LOG机制
  7. Android中如何让图片自适应控件的大小
  8. Android8.0 Rild守护进程
  9. Android进阶高手(四)终谈GPS
  10. Android精品资源分享站