ProductFlavors 简单使用

概述

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

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

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

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

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

快速使用

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

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

productFlavorA{ 
   manifestPlaceholders = ["APP_KEY": "123456789",]
}
<meta-data
   android:name = "APP_KEY"
   android:value = "${APP_KEY}"
>
</meta-data>

资源对象

productFlavorA{
  resValue "string", "appName", '"微信"'
}
productFlavorB{
  resValue "string", "appName", '"Wechat"'
}
<resources>
    <string name="app_name">@string/appName</string>`
</resource>

自定义变量

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

productFlavorA {
    buildConfigField "String" , "channel" , '"1"'
}
String channel = BuildConfig.channel;

总结

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

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

如有问题,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯Bugly的专栏

精神哥讲Crash(一):UnsatisfiedLinkError

大家好,我是腾讯Bugly的精神哥(英文名:spirit),是Bugly资深码奴的同时,又是Bugly神秘的Crash实验室研究员哦!我的主要任务就是泡在实验室...

54750
来自专栏腾讯技术工程官方号的专栏

免费开放阅读 | 数据库管理系统的事务原理(上)

作者介绍: 那海蓝蓝,腾讯技术工程事业群计费平台部金融云TDSQL数据库T4级专家,熟悉PostgreSQL、MySQL、Informix等数据库内核技术,著有...

54380
来自专栏更流畅、简洁的软件开发方式

实体类的变形【1】—— 餐盘原理

    在亚历山大同学的post里面我说可以让实体类和表不必一一对应,但是并没有详细说明如何来做,也有人想问我是怎么做的,那么我就说一下。先说一个简单一点的,那...

20670
来自专栏Android 开发者

ViewModels 简单入门

31970
来自专栏黑泽君的专栏

从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!

 原文链接:https://zhuanlan.zhihu.com/p/25296859

11020
来自专栏PingCAP的专栏

TiDB EcoSystem Tools 原理解读系列(二)TiDB-Lightning Toolset 介绍

TiDB-Lightning Toolset 是一套快速全量导入 SQL dump 文件到 TiDB 集群的工具集,自 2.1.0 版本起随 TiDB 发布,速...

12530
来自专栏Rovo89

WordPress 在使用CDN后获取正确访客 ip

23650
来自专栏林欣哲

SpringBoot的微信点餐系统后台开发要点

项目设计 角色划分 买家(微信端) 卖家(PC端) 功能分析 ? 关系 ? 部署架构 ? 架构和基础框架 演进:单一应用架构->垂直应用架构->分布式服务架构-...

1.9K400
来自专栏信安之路

奇淫异巧之 PHP 后门

早上看了一位小伙伴在公众号发的文章《php 后门隐藏技巧》,写的挺好,其中有一些姿势是我之前没见到过了,学到很很多。同时,这篇文章也引发了自己的一点点思考:“ ...

21400
来自专栏葡萄城控件技术团队

.NET控件Designer架构设计

总体结构 ? Designer总体上由三大部分组成:View,ViewModel和Model,这个结构借鉴了流行的MVVM模式。这三部分的职责分工是: View...

21350

扫码关注云+社区

领取腾讯云代金券