前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ProductFlavors 简单使用

ProductFlavors 简单使用

作者头像
Oceanlong
发布2018-12-06 15:45:09
2.5K0
发布2018-12-06 15:45:09
举报

概述

我们在开发过程中,会经常遇到,同样的业务逻辑,需要配置不同的资源的情况。有时是不同的渠道,有时是不同的语言环境,各种不同。

如果我们在业务逻辑中,去实现这些差异化,会导致两个问题:

  1. 代码量很大,分支路径很多。而很多路径在实际使用中是用不到的,造成代码质量差。
  2. 用业务逻辑去区分情况加载资源,会导致包内需要包含大量的资源,造成包体积过大。

所以,我们需要在编译阶段,就区分种种情况,给予相应的资源。

Android中build.gradleproductFlavors为我们提供了这样的能力。

快速使用

在module的build.gradle中,我们通过flavorDimensionsproductFlavors的配合,来实现多维度的区分:

代码语言:javascript
复制
android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.oceanlong.buildtestpro"
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    ...

    flavorDimensions "country" 

    productFlavors {
        china {
            applicationId "com.example.oceanlong.buildtestfree"
            dimension "country"
        }
        usa {
            applicationId "com.example.oceanlong.buildtestpro"
            dimension "country"
        }
    }
    ...
}

flavorDimensions

flavorDimensions表示flavor的维度。比如我们可以根据渠道区分打包方式,可以根据国家区分打包方式。在上面的例子中,我们以国家区分打包方式,假定了我们需要两个国家的包:china和usa。

productFlavors

productFlavors包含了各种flavor包,每种flavor,我们以名字作为开头,然后在它的作用域内,加上当前flavor所属的维度。

在每个productFlavors的作用域中,我们可以对当前包,做一些设置。在上面的例子中,我们对不同国家的APK设置了不同的包名。

在Android Studio中,我们可以选择想要打包的flavor:

获取使用命令行:

./gradlew assembleChinaRelease

细节用法

productFlavors除了能够改变包名,还能够根据不同的flavor改变非常多的东西。首先,我们定义android的defaultConfig中的所有属性,比如versionCode、versionName,不再细说。

AndroidManifest

代码语言:javascript
复制
productFlavorA{ 
   manifestPlaceholders = ["APP_KEY": "123456789",]
}
代码语言:javascript
复制
<meta-data
   android:name = "APP_KEY"
   android:value = "${APP_KEY}"
>
</meta-data>

资源对象

代码语言:javascript
复制
productFlavorA{
  resValue "string", "appName", '"微信"'
}
productFlavorB{
  resValue "string", "appName", '"Wechat"'
}
代码语言:javascript
复制
<resources>
    <string name="app_name">@string/appName</string>`
</resource>

自定义变量

我们也可以在productFlavors中,定义一个公共变量,然后在代码中读取它的值。

代码语言:javascript
复制
productFlavorA {
    buildConfigField "String" , "channel" , '"1"'
}
代码语言:javascript
复制
String channel = BuildConfig.channel;

总结

ProductFlavors为我们根据不同flavors在打包时进行不同的配置,提供了解决方案。我们可以通过ProductFlavors修改应用资源、AndroidManifest等。

此外,ProductFlavors还可以定义一些自定义的变量,我们甚至可以打入一些Json等各种编码数据,为我们快速构建多个不同版本提供了基础。

如有问题,欢迎指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 快速使用
    • flavorDimensions
      • productFlavors
      • 细节用法
        • AndroidManifest
          • 资源对象
            • 自定义变量
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档