android gradle 自动动态构建多平台的包
16lz
2022-06-03
在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()}
最终目录结构:
更多相关文章
- 用 Python脚本生成 Android(安卓)SALT 扰码
- Android单个模块编译
- android Ant批打包学习(二)---生成有签名且混淆的apk包
- Android(安卓)平台上,界面元素在定时器的响应函数里刷新。
- 使用命令行签名Android应用程序
- Android系统源码极速搜索引擎(OpenGrok)
- android之从Bmob获取数据显示在ListView中
- Android(安卓)Rom签名文件的生成与签名
- Android(安卓)增量更新实例(Smart App Updates)