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
- android gradle 自动动态构建多平台的包
- Gradle 使用Gradle构建Android应用的渠道包
- 使用Gradle构建Android应用的渠道包
- 使用Gradle构建Android应用的渠道包
- 使用Gradle构建Android应用的渠道包
- 使用Gradle构建Android应用的渠道包
- 使用Gradle构建Android应用的渠道包
- Android-->Gradle+Jenkins 自动构建环境搭建
- android studio gradle自动签名构建实现
- android gradle自动构建大总结
- jenkins+gradle+git构建Android自动打包
- Java动态加载结合gradle的多模块构建
- Android 构建的新欢Gradle
- Android的平台构建
- 使用Gradle构建Android应用的渠道包-Android studio 多渠道打包(超简洁版)
- Android Studio Gradle 构建项目下载依赖包慢的解决方式
- android 4.4 appcompat gradle 构建jar包兼容性问题
- 使用Jenkins+Git+Gradle自动化构建Android APK包
- 从资源加载Cimage
- MinGW安装和使用
- 德州仪器的12位采样芯片ads1015调试
- 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.Text
- Bluestacks --比谷歌安卓自带的模拟器快N倍的模拟器
- android gradle 自动动态构建多平台的包
- 我是如何快速学习android开发的
- android 剪贴板 ClipboardManager
- GNU C中不为人知的特色:__attribute__机制
- Android 12小时制式/24小时制式的表示方式
- JS获取本月第一天和最后一天
- ASP.NET查询数据库
- ORACLE查看用户定义的函数及源码
- android tranform