Android 实现差异化打包,并根据productFlavors生成apk

手头的项目有个需求,需要生成两个apk,实现部分不同的功能,本想拉个分支,项目组长说可以了解下差异化打包,于是学习了一下~
一、在app -> build.gradle的android标签中配置productFlavors

productFlavors{
        project1{
        }
        project2{
        }
    }

这里还可以配置不同的包名,应用名,图标,参数:

productFlavors{
        project1{
                applicationId "com.demo.project1"
                manifestPlaceholders = [APP_NAME: "project1" ,ICON: "@mipmap/ic_launcher_project1"]
                buildConfigField "boolean" , "IS_PROJECT1","true"
        }
        project2{
                applicationId "com.demo.project2"
                manifestPlaceholders = [APP_NAME: "project2" ,ICON: "@mipmap/ic_launcher_project2"]
                buildConfigField "boolean" , "IS_PROJECT2","false"
        }
    }

如果设置了manifestPlaceholders,需要在AndroidManifese.xml的application标签下配置

android:label="${APP_NAME}" android:icon="${ICON}"。

另外,我在同步gradle的时候遇到了一个error:

Error:All flavors must now belong to a named flavor dimension。

在网上找到了一个解决方法,在defaultConfig种加一句flavorDimensions "versionCode":

defaultConfig {
        applicationId "com.xxx.xxxx"
        minSdkVersion xx
        targetSdkVersion xx
        versionCode xx
        versionName xxxxxxx
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        //版本名后面添加一句话,意思就是flavor dimension 它的维度就是该版本号,这样维度就是都是统一的了
        flavorDimensions "versionCode"
    }

二、代码的差异化:

        //  根据编译的包来实现不同功能
       if (BuildConfig.FLAVOR.equals("project1")) {
            //your code
        } else {
            //your code
        }

三、修改apk的名字

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def type = ""
                    if (output.name == 'debug') {
                        type = "_debug"
                    }
                    def fileName = "project_V${defaultConfig.versionName}${type}_${productFlavors[0].name}.apk"
                    output.outputFileName = fileName
                }
            }

这样就可以打包出不同的apk啦。

你可能感兴趣的:(Android 实现差异化打包,并根据productFlavors生成apk)