Gradle:Android打包动态传参及多productFlavors配置

一、Android通过Gradle命名动态传参打包

Android开发中,我们常常需要给测试,或者其他人提供APP的安装包。
这些安装包跟生产包,多多少少会有差异,改app名字,logo等等。
一些简单的,我们通过buildType,在debug/release模式切换下,可以满足我们的需求。但是,还有一些需求,比如,修改项目的id,跟后台联调,修改host等等。
往往每次打这些包的时候,就需要我们来修改代码来完成了,这样出错的概率也会大大的增加。

在这里插入图片描述

其实,如果,我们对Gradle熟悉的话。我们知道Gradle其实有个-P的命令,就是专门来设置属性的。
我们先看下,这个命令的解释。

-P, --project-prop        Set project property for the build script (e.g. -Pmyprop=myvalue).

设置构建脚本的项目属性。-Pmyprop=myvalue 。-P后面跟着key=value

下面,我们就实现一个类似的需求。[在打包时候,动态的传入APP的名字。]

第1步,当时是给要传入的key起个名字啦。

我们就叫它appName吧。

记得把string.xml下面的app_name这个属性删除(不然,跟我们动态设置的参数冲突)。毕竟,我们的需求是打包的时候,才输入APP的名字嘛。

第2步,在主module的build.gradle里面配置这个key
buildTypes {
        release {
            ...
            //没错,就是这里
            resValue "string", "app_name", project.hasProperty("appName") ? appName : "默认release"
            ...
        }
    }

这里通过project.hasProperty(“appName”)来判断,执行gradle命令的时候,是否设置了这个属性。如果设置了,就把它赋值给string.xml里面的app_name里面。如果没有,就用默认的赋值。

第3步,通过gradle命令来打包,动态设置app的名字了

直接看命令

gradlew clean assembleRelease -PappName=测试

执行完就把app的名字改成了测试。

到这里,我们的动态设置就完成了,是不是很简单。

在这里插入图片描述

二、Android通过Gradle的productFlavors多个维度切换项目环境

通过Gradle的productFlover和flavorDimensions,我们可以把项目从多个维度分割开。
比如,一般的项目我们都有测试环境,准生产环境,生产环境(API的host都是不一样的)

flavorDimensions "env"
    productFlavors{
        dev{
            //host:dev
            dimension "env"
        }
        online{
            //host:online
            dimension "env"
        }
    }

我们就可以通过productFlavors来配置。

如果这个时候,我们又需要收费的和免费的两种模式的APP呢。

没关系,我们在gradle里面再配置一个flavorDimensions 就可以啦

1,在build.gradle进行配置
flavorDimensions "env","kind"
    productFlavors{
        dev{
            //host:dev
            dimension "env"
        }
        online{
            //host:online
            dimension "env"
        }
        free{
            dimension "kind"
        }
        pro{
            dimension "kind"
        }
    }

这样productFlavors就分为两类了【dev,online】和【free,pro】。
这样,我们就可以组合出devFree(开发免费版),devPro(开发收费版),onlineFree(线上免费版),onlinePro(线上收费版)等不同的模式了。当然,还可以组织出更多(乱)的,只要舍得添加。。。

到这里,我们就可以在Build Variants里面来切换不同的场景进行测试啦。
在这里插入图片描述

2,在main的平级结构里,创建文件夹free、pro,把差异化的代码分别放到不同的包。

创建文件夹后。我们只需要把free/pro有差异的代码/xml放到对应的文件夹里就可以啦。
公用的还是在main里面放着。如下
在这里插入图片描述

这样,就完成了从多个维度来配置APP。个人感觉,在某些特定的场景,这个东西是非常有用的。但是,如果dimensions配置过多的话,整个APP会很乱,尤其是在修改某个公共功能后,需要修改每个包的代码,有点得不偿失。

Gradle 依赖替换规则

以后再补,参考文档
https://juejin.im/post/5d2dee0851882569755f5494
https://docs.gradle.org/current/userguide/customizing_dependency_resolution_behavior.html#sec:dependency_substitution_rules
https://github.com/JakeWharton/u2020/blob/master/build.gradle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值