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

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

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

最终目录结构:


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值