Android Studio 通过gradle配置 组合多个产品风味 打包生成不同包名不同资源apk

android {
    signingConfigs {
        config {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('xxx')
            storePassword 'xxx'
        }
    }

    useLibrary 'org.apache.http.legacy'

    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }

    compileSdkVersion 28
    defaultConfig {
        applicationId "com.xxx.xxxx"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


        signingConfig signingConfigs.config

        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "default"] //清单文件占位符

        ndk {
//            abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64"
            abiFilters "armeabi-v7a"
        }
    }
 
//    https://developer.android.com/studio/build/build-variants#build-types  配置编译变体
    flavorDimensions "api", "mode" //变体名称 app-[api]-[mode]-[release|debug].apk 可以进行任意组合,再添加一个Dimension即可实现多渠道打包

    productFlavors {
        //同 app/src/main 目录同级别,如app/src/free、app/src/pro可分别创建相同目录资源文件,当前目录资源使用会优先于main目录,可打包成不同风味的apk
        //如:包名;版本号;支持的最小sdkVersion;资源:values、drawable、layout;java代码;等
        free {
            dimension "mode"
            applicationIdSuffix ".free"
            versionNameSuffix "-free"
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "free"] //清单文件占位符
        }
        pro {
            dimension "mode"
            applicationIdSuffix ".pro"
            versionNameSuffix "-pro"
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "pro"] //清单文件占位符
        }
        minApi24 {
            dimension "api"
            minSdkVersion '24'
            versionCode 30000 + android.defaultConfig.versionCode
            versionNameSuffix "-minApi24"
        }
        minApi21 {
            dimension "api"
            minSdkVersion '21'
            versionCode 20000 + android.defaultConfig.versionCode
            versionNameSuffix "-minApi21"
        }

    }

//    variantFilter { variant ->
//        def names = variant.flavors*.name
//        if (names.contains("minApi21") && names.contains("pro")) {
//        //app-[api]-[mode]-[release|debug].apk 忽略满足该条件的变体的组合
//            setIgnore(true)
//        }
//    }
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "app_${new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))}_${variant.versionName}-${variant.buildType.name}.apk"
        }
    }
    buildTypes {
        release {
            buildConfigField("String", "API_HOST", "\"http://xxx\"")
//            buildConfigField("boolean", "IS_LOG_DEBUG", "true") //BuildConfig 占位
//            resValue("string", "app_name", "myApp") //资源文件 占位
//            resValue("string", "build_time", "${minutesSinceEpoch}") //资源文件 占位
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
            minifyEnabled false

        }
        debug {
            buildConfigField("String", "API_HOST", "\"http://xxx\"")
            signingConfig signingConfigs.config
            minifyEnabled false
        }
    }
    sourceSets {
        main {
            jni.srcDirs = []
        }
    }
}

配置后可以编译的类型组合

Android Studio 通过gradle配置 组合多个产品风味 打包生成不同包名不同资源apk