Android通过build.gradle配置productFlavors区分加载若干套不同代码资源

时间:2024-05-20 08:03:51

Android通过build.gradle配置productFlavors区分加载若干套不同代码资源

Android在编译apk时候,有时候需要根据不同环境启用或关闭相应的代码资源文件。比如,工程代码中有一个Java写的Config文件,该文件在编译生成不同的包时候,虽然同样一个Config文件,但内容是不一样的。假设现在需要编译生成三种包,开发包(app_dev),测试包(app_test),正式包(app_pro)。开发包里面Config定义的一个变量需要赋值:
String ENVIRONMENT = "dev";
而在测试包中,同样的Config里面的ENVIRONMENT需要赋值为test:
String ENVIRONMENT = "test";
换成正式包时候,ENVIRONMENT需要的值为:
String ENVIRONMENT = "pro";
ENVIRONMENT通常可能是当前App运行的环境,App加载的一整套代码资源需要根据ENVIRONMENT展开。
这个编译打包带来了麻烦,因为针对每一种包,需要在编译打包时候手动修改String ENVIRONMENT的具体值。现在仅仅是修改一个String ENVIRONMENT的值,如果是更为庞大的一堆代码或类似res/layout等等,那就十分复杂且容易出错。
为实现上述目的,可以通过build.gradle的productFlavors配置实现。
首先需要在productFlavors定义:

    flavorDimensions "zhangphil_demo"
    productFlavors {
        app_pro {
            dimension "zhangphil_demo"
        }

        app_test {
            dimension "zhangphil_demo"
        }

        app_dev {
            dimension "zhangphil_demo"
        }
    }


在本例中,然后在Android的src代码文件目录下,分别新增三套代码文件夹:app_dev,app_test,app_pro以对应productFlavors定义的三套。
要注意在app_dev,app_test,app_pro下面摆放的代码文件,必须仍然按照标准src/main/java/xxx/xxx/xxx这样放置,如图的代码结构图:

Android通过build.gradle配置productFlavors区分加载若干套不同代码资源

 

如果是xxx.xml布局文件,则是类似于上面那样,比如是app_dev/res/layout/xxx.xml,简言之,可以简单认为app_dev,app_test,app_pro相当于标准Android Studio工程中代码文件夹的main,只不过换新名字app_dev,app_test,app_pro了,至于app_dev,app_test,app_pro里面的代码层次结构仍然保持标准main的层次结构。
写好代码后,在Android Studio编译生成包时候,就会在编译时候让用户选择编译哪一套代码环境,可以单选或者按住ctrl键加鼠标左键一个一个单选直至全部选上:

Android通过build.gradle配置productFlavors区分加载若干套不同代码资源

注意,如果在app_dev,app_test,app_pro目录下有Config代码文件了,在标注Android代码工程目录main中就不要再放同名同样的Config代码文件。标准Android里面的像main代码文件里面只放共同、共通的代码资源,在app_dev,app_test,app_pro则放不同环境下有区分加载的代码资源。同样,如果有一个res/layout下面的activity_main.xml布局文件需要在app_dev,app_test,app_pro下区分加载,那么就不能再往main下面放相同的代码文件了。

附录:
1,《Android配置build.gradle的productFlavors编译不同配置的apk包》链接:https://blog.****.net/zhangphil/article/details/83275860 

2,《Android配置build.gradle的productFlavors多渠道打包》链接:https://blog.****.net/zhangphil/article/details/83302184