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的名字。]
我们就叫它appName吧。
记得把string.xml下面的app_name这个属性删除(不然,跟我们动态设置的参数冲突)。毕竟,我们的需求是打包的时候,才输入APP的名字嘛。
buildTypes {
release {
...
//没错,就是这里
resValue "string", "app_name", project.hasProperty("appName") ? appName : "默认release"
...
}
}
这里通过project.hasProperty(“appName”)来判断,执行gradle命令的时候,是否设置了这个属性。如果设置了,就把它赋值给string.xml里面的app_name里面。如果没有,就用默认的赋值。
直接看命令
gradlew clean assembleRelease -PappName=测试
执行完就把app的名字改成了测试。
到这里,我们的动态设置就完成了,是不是很简单。
通过Gradle的productFlover和flavorDimensions,我们可以把项目从多个维度分割开。
比如,一般的项目我们都有测试环境,准生产环境,生产环境(API的host都是不一样的)
flavorDimensions "env"
productFlavors{
dev{
//host:dev
dimension "env"
}
online{
//host:online
dimension "env"
}
}
我们就可以通过productFlavors来配置。
如果这个时候,我们又需要收费的和免费的两种模式的APP呢。
没关系,我们在gradle里面再配置一个flavorDimensions 就可以啦
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里面来切换不同的场景进行测试啦。
创建文件夹后。我们只需要把free/pro有差异的代码/xml放到对应的文件夹里就可以啦。
公用的还是在main里面放着。如下
这样,就完成了从多个维度来配置APP。个人感觉,在某些特定的场景,这个东西是非常有用的。但是,如果dimensions配置过多的话,整个APP会很乱,尤其是在修改某个公共功能后,需要修改每个包的代码,有点得不偿失。
以后再补,参考文档
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