美文网首页gradle
详解Gradle之flavor

详解Gradle之flavor

作者: taoyyyy | 来源:发表于2019-07-31 21:20 被阅读0次

    flavor配置不同包名

    productFlavors {
        dev {
            applicationId "com.lyl.dev"
        }
     
        stage {
            applicationId "com.lyl.stage"
        }
     
        prod {
            applicationId "com.lyl.prod"
        }
    }
    

    productFlavors 设置的不同环境包名会覆盖 defaultConfig 里面的设置的包名。

    falvor配置不同资源文件

    productFlavors {
        dev {
            resValue "string", "app_name", "dev_myapp"
            resValue "bool", "isrRank", 'false'
        }
        stage {
            resValue "string", "app_name", "stage_myapp"
            resValue "bool", "isrRank", 'true'
        }
        prod {
            resValue "string", "app_name", "myapp"
            resValue "bool", "isrRank", 'true'
        }
    }
    

    利用 resValue 来定义资源的值,顾名思义 res 底下的内容应该都可以创建,最后用 R.xxx.xxx 来引用。
    注意:这里是添加,不是覆盖,不能与res文件中已有的资源文件冲突。

    flavor配置BuildConfig常量

    productFlavors {
        dev {
            buildConfigField "String", "ENVIRONMENT", '"dev"'
        }
        stage {
            buildConfigField "String", "ENVIRONMENT", '"stage"'
        }
        prod {
            buildConfigField "String", "ENVIRONMENT", '"prod"'
        }
    }
    

    flavor配置AndroidManifest.xml 里渠道变量

    1.AndroidManifest.xml设置占位符

    <application
        android:icon="${app_icon}"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        ...
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${ENVIRONMENT}" />
        ...
    </application>
    

    2.build.gradle中填充占位符的值

    productFlavors {
        dev {
            manifestPlaceholders = [ENVIRONMENT: "dev",
                                    app_icon   : "@drawable/icon_dev"]
        }
        stage {
            manifestPlaceholders = [ENVIRONMENT: "stage",
                                    app_icon   : "@drawable/icon_stage"]
        }
        prod {
            manifestPlaceholders = [ENVIRONMENT: "prod",
                                    app_icon   : "@drawable/icon_prod"]
        }
    }
    

    flavor引用不同的module

    xxxCompile 代表 各个渠道的名称(gradle3.0后改为xxxImplementation)。

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
     
        // 引用本的项目
        devCompile project(':devModule')
        stageCompile project(':stageModule')
        prodCompile project(':prodModule')
     
        // 也可以分渠道引用网络的。因为这里都相同,所以地址也就都一样了
        devCompile 'com.roughike:bottom-bar:2.0.2'
        stageCompile 'com.roughike:bottom-bar:2.0.2'
        prodCompile 'com.roughike:bottom-bar:2.0.2'
    }
    

    在子module中使用flavor

    在子module中也有使用flavor的诸多场景,如在网络请求的module中对测试版和正式版的服务器地址会有区别,此时可以通过flavor来区别配置。现有实现如下。
    注意本文配置均是基于gradle4.6,gradle3.0前后配置有些许差别。
    主module中buid.gradle

    android {
        ...
        flavorDimensions ""
        productFlavors{
            rel {
                dimension ""
            }
    
            dev {
                dimension ""
            }
        }
      ...
    }
    
    dependencies {
      ...
        relImplementation project(path: ':mylib2')
        devImplementation project(path: ':mylib2')
      ...
    }
    

    “relImplementation”表示flavor为rel时的依赖,“devImplementation”表示flavor为dev时的依赖。

    子module的build.gradle

     flavorDimensions ""
        productFlavors{
            rel {
                buildConfigField("String", "env", "\"正式服务器地址\"")
                dimension ""
            }
    
            dev {
                buildConfigField("String", "env", "\"测试服务器地址\"")
                dimension ""
            }
        }
    

    接着在代码中通过BuildConfig.env即可获取不同flavor下的服务器地址。
    再在Build variants中选择想要调试的buildType。

    Build variants.png
    Tips:若主module或子module中存在独有的flavor时,处理方法参见https://www.jianshu.com/p/b8c0ec4339c1

    flavor打包编译

    打包

    flavor打包.png

    双击对应任务或terminal终端执行/gradlew xxx均能完成打包。

    • assembleADSgTt即打包单个flavor下的debug和release包。
    • assembleRelease即打包所有的release包。

    最后打包的apk位置在xx\build\outputs\apk下。


    apk生成路径.png

    编译

    编译时在左下角BuildVariants中选择想要编译的type即可。


    Build variants.png

    相关文章

      网友评论

        本文标题:详解Gradle之flavor

        本文链接:https://www.haomeiwen.com/subject/typirctx.html