Android ProductFlavor的使用详解

目录
  • 前言
  • productFlavors
  • flavorDimensions多纬度

前言

最近一直在学习Android Gradle 相关的知识点,今天刚好看到了 ProductFlavor 这节,ProductFlavor 表示产品风味,Google 相关的文档可以看 Android developers ProductFlavor,产品风味这词起的还是挺有意思的,乍看上去我一时半会也不理解这是干嘛的,如果说是用于区分打包的那么我 gradle 文件里的 buildTypes 不是就已经够用了吗,所以我花了一点时间重新看了下,按照我的理解如果你只是中小型的项目不涉及区分不同地区用户打不用的包的那么 ProductFlavor 基本上也没什么用处,但如果你项目里要区分国内版和国外版甚至还要根据用户是否是VIP会员加上收费和免费的版本,这种情况下就会出现国内收费、免费国外收费、免费的版本,在极端点,我收费和免费的版本在相同页面上甚至显示的UI布局和icon图标资源都不一样,这种情况又该怎么处理呢,ProductFlavor 的出现就非常友好的帮助我们开发者解决了上述的版本区分。

productFlavors

productFlavors 的用法很简单,主要是用来多渠道打包使用,直接在 android 闭包下定义 productFlavors 就可以了,在我的例子中我的APP定位为收费和免费版本,所以我需要在 2 处定义我的“产品风味”也就是我要打包的渠道(收费和免费版本的两个不同APP的渠道),注意下在目前的AS中如果你仅仅只是定义了 代码2 ,那么在构建的时候必然会报 3 处的错误,没有定义产品纬度,所以为了解决这个问题,我们在代码1处定义了一个“是否付费 isPaying ”的纬度。

如图,在我们定义好了是否付费的纬度以及付费和免费的产品风味之后,你会发现现在构建出来了4个构建变体,也就是在free和charge风味下各自构建了debug和release的变体,现在我们有了两个不同的风味,如果我想安装到手机上是两个不同的APK又改怎么处理呢?首先我们的包名就不能相同,在free和charge闭包下定义:

productFlavors{

    free{
        applicationId 'com.example.gradle.free'

    }

    charge{
        applicationId 'com.example.gradle.charge'

    }

}

根据上面的配置最后在手机上跑的是两个APK,这个我已经验证过了,尽管如此还是没体现出差异化,我们接下来改变下代码的逻辑,在他们的app名以及首页修改下

看我们的红框处,我已经将他们的app的名称全改掉了,怎么处理的呢?

productFlavors{

    free{
        applicationId 'com.example.gradle.free'
        resValue "string",'appName','免费版'
    }

    charge{
        applicationId 'com.example.gradle.charge'
        resValue "string",'appName','收费版'
    }

}

首先我还是修改了 productFlavors 中的代码,定义了一个 resValue,这个参数你可以理解为在不同的风味下定义标签的意思,比如说我在代码中分别为 free 和 charge 风味定义了 resValue 标签,那么在构建他们变体的时候就可以引用到这个标签

如图,我还新定义了两个文件夹“free”和“charge”,如果你想做差异化的话就必须根据产品风味来定义文件夹,这里因为应用的名称是在清单文件里配置的,所以各自copy了一份,我反正理解的是既然是差异化那么从main里面将有差异的文件copy出来修改就可以了,当然了里面的包名,路径之类的还是得要一致的,讲到这其实大家也就明白了,如果你想在不同的APP页面里做差异化,那么就按照这个套路来就可以了,所以“修改首页(MainActivity)”的任务就交给大家了,自己动手体会下。

flavorDimensions多纬度

什么是多纬度,比说是否付费是一个纬度,国家是一个纬度,在上图中我又定义了一个 nation 纬度,注意如果你定义了一个纬度那么必须要使用到它,在各个产品风味下通过 dimension 来决定你的风味是使用的哪一个纬度,free 和 charge使用了 isPaying ,china 和 france 使用了 nation,那么多纬度的作用也就是为了更加精细的区分你的APP,如 3 通过这种方式,我完全可以可以打包出不同国家的差异化APP,是不是很灵活呢,不过一般情况下也用不到那么精细,不然这个项目光是维护就很头疼,好,到最后我们可以得出一个公式 【纬度1的产品风味数量】 * 【纬度2的产品风味数量】 * buildType数量 = 最终的APK变体数量。

以上就是Android ProductFlavor的使用详解的详细内容,更多关于Android ProductFlavor的使用的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android实现悬浮窗全系统版本

    悬浮窗是在系统上显示的内容,好像微信视频聊天时的小窗口一样,在退出软件后依然存在的一个窗口,本博客以窗口中放一个button组件为例,简单展示悬浮窗,其中包括了对Android 6.0以下.Android 6.0到Android 8.0.Android 8.0以上版本的处理,下面开始介绍实现方法: 1.MainActivity中的代码 public Button mFloatingButton; @Override protected void onCreate(Bundle savedInst

  • 详解Android studio 3+版本apk安装失败问题

    studio2.3升级到3.1之后将apk发给别人下载到手机上安装,华为提示安装包无效或与操作系统不兼容,魅族提示apk仅为测试版,要求下载正式版安装. 在网上找了一下,发现是studio3.0之后的instant run功能引起的,直接点击绿色箭头按钮烧出来的apk都是不完整的,也就是魅族指的测试版,并且这个apk的路径在app\build\intermediates\instant-run-apk\debug下,而原来的app\build\outputs\apk\debug路径下已经没有ap

  • Android Studio 2020新版本卡在Gradle downloading/sync failed/下载缓慢/下载超时的问题

    这个问题卡了我三天 头都疼了! 最终解决方法 新建一个项目,然后改两个文件 build.gradle里面改成这个: buildscript { repositories { maven { url "http://maven.aliyun.com/nexus/content/groups/public/" } google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:4.1.1&

  • 详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件.  aapt即Android Asset Packaging Tool , 在SDK的build-tools目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件.  Adb 即android debug bridge 管理模拟器和真机的万能工具,ddms 调试环境 

  • Android开发获取手机Mac地址适配所有Android版本

    最近由于项目需要MAC地址的记录,搞了一个通用的适配类,目前经过测试可以适配Android所有版本,我测试过的设备系统Android 4 5 6 7 7+都可以获取到,废话不多说直接上代码,简洁: 该类分为三类:Android6.0以下.6.0以上7.0以下.7.0以上 首先是获取MAC的整合方法: public static String getMac(Context context) { String strMac = null; if (Build.VERSION.SDK_INT < Bu

  • android studio 打包自动生成版本号与日期,apk输入路径详解

    一. 打开项目选择如图示1 (build.gradle 项目位置) 二. 1. build.gradle 文件添加内容如下.gradle是[com.android.tools.build:gradle:3.0.0 以下版本] android{ defaultConfig {...} 自动追加版本号和版本名称 android.applicationVariants.all { variant->variant.outputs.each { output-> output.outputFile =

  • Android 版本、权限适配相关总结

    目录 请求存储权限 版本适配 Android 7.0 前 Android 7.0 后 Android 10.0 什么是作用域 举个栗子 请求存储权限 首先需要在 AndroidManifest.xml 文件中声明权限: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 在代码中请求用户权限: // 权限请求码 private static final int PERMISS

  • Android 图片保存到相册不显示的解决方案(兼容Android 10及更高版本)

    目录 前言 问题 解决问题 前言 写了一个demo,简单逻辑就是:在一个图片上添加一行文字或者是水印,并且保存到系统相册,也就是我们手机上的图库.前面编辑图片添加水印都没有问题,到后面保存到系统相册出现了问题:显示不出来图片. 问题 在 Android 10 之前保存系统相册的三步骤: 保存图片到手机 把图片插入到手机图库 发广播更新 代码如下: public static void savePhotoAlbum(Context context, Bitmap bmp) { // 首先保存图片

  • Android Studio3.6.3 当前最新版本数据库查找与导出方法(图文详解)

    一.SQLite安装包准备 本文章主要是针对安装了Android Studio 3.6.3 版本(Android Studio以下简称为AS)所做的SQLite教程, 博主这边安装的是 , 由于SQL语言基本大同小异,仅仅是管理数据库的软件不大相同,所以说数据库使用方法类似,具体安装流程参考网络上其他文章,本文暂不提供安装流程,安装完毕即可. 二.重中之重----Android Studio 3.0 版本起弃用了之前使用的ADM 博主也是刚发现自AS 3.0 开始弃用 Android Devic

  • 详解Android版本适配:9.0 Pie

    一.前言 本文主要是从官方文档中筛选出一些常见的适配项,若有任何纰漏或需要补充的,欢迎大家在评论区指出. 二.版本适配 1. 限制 HTTP 网络请求 Android 9.0 中限制了 HTTP(明文传输)网络请求,若仍继续使用HTTP请求,则会在日志中提示以下异常(只是无法正常发出请求,不会导致应用崩溃): java.net.UnknownServiceException: CLEARTEXT communication to xxx not permitted by network secu

  • Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)

    下载: Anderson Studio是Google为Android提供的官方IDE工具,下载地址:http://www.android-studio.org/ 下载3.4.1.0版本地址:ctrl+f 查找3.4.1.0 直接下载3.4.1.0的下载地址:https://dl.google.com/dl/android/studio/install/3.4.1.0/android-studio-ide-183.5522156-windows.exe 安装环境要求 : 其中JDK的最低版本是1.

随机推荐