android gradle 自动动态构建多平台的包
2014-01-06 17:25
513 查看
在gradle中,通过android插件可以设定不同的buildType来构建多平台的包。
当前需求是自动打出几个平台的包,还需要针对不同的平台生成不同的manifest。
这样运行 gradle build 的时候,会自动打出几个平台的包,由于针对每个平台设置了sourceSet,所以每个平台都会采用指定的manifest,比如360会使用build-type/360下的,这里的manifest手动放置好即可。
但实际用的时候发现平台太多,每个都这么写的话,会使gradle的build文件很大,于是考虑动态构建。
在build-type下用一个type.txt来记录所有的平台,文件内容是
然后编写gradle构建文件,思路就是读取文件中的每一行,动态的生成响应的buildTypes,当buildTypes生成之后,gradle会自动生成相应的sourceSets,然后再遍历sourceSet进行设置。
manifest也不能手工放置了,也采用程序的方式来处理。这里例子为了简单,只在最后加了一行注释。
最终目录结构:
当前需求是自动打出几个平台的包,还需要针对不同的平台生成不同的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() }
最终目录结构:
相关文章推荐
- MAC上使用maven打android的包,报错:No Android SDK path could be found. 解决办法
- android如何实现开机自动启动Service或app
- android 剪贴板 ClipboardManager
- android异常
- Android自定义类似ProgressDialog效果的Dialog
- android tranform
- 我是如何快速学习android开发的
- 在Android开发中使用Ant 三:批量打包
- android系统sensor代码路径
- Android文件系统移植
- Android 如何修改自动同步数据的默认开关 M
- 查看 android源码的chrome插件
- Android系统移植方法详解
- Android中Touch事件的处理逻辑
- N多的Android各种特效控件源码
- android中scrollview中嵌入listview 产生的滚动问题
- android 智能指针的学习先看邓凡平的书扫盲 再看前面两片博客提升
- 网页设计师值得拥有的21款Android应用(下)
- ZT Android的引用计数(强弱指针)技术及一些问题
- 网页设计师值得拥有的21款Android应用(下)