系列文章目录
背景
在开发的时候,会遇到一些问题,需要在不同的渠道使用一些不同的包或者是不同的代码去处理一些问题,这样在但是通过建立多个工程来维护这一个软件的开发显然太过于繁琐,且在渠道较多的时候会这会大大的增加没有必要的工作。所以多渠道打包和开发在这时候就会显得尤其重要。
一、生成多个渠道
我们的使用Android studio 开发时项目的构建工具是Gralde 所以生成多个渠道就需要对Gradle进行设置。
首先:添加 productFlavors 并在其中添加所有的渠道
productFlavors{
huawei{
}
baidu{
}
}
在这里我们添加了华为和百度的两个包。在同步之后在左下角的build variants里面就可以看到对应的渠道以及生成了。
在这里可以选择你当前的渠道。(由于不同的渠道在代码上按实际情况来看可能会有差别所以可以通过这种方式调整)。
二、添加相关的文件和配置
1.创建文件
在src下(main同级)建立对应渠道的包,在下面创建java、res和Mainfest文件(ps:java中的路径要和main中的java目录下的路径一样,否则无法访问文件,对于Mainfest文件会优先按照渠道目录下的Mainfest文件的配置)
2.代码相关
这个时候在对应的目录下新建文件就可以在对应的渠道里面使用这一文件,同时在Project切换为Android之后就可以在文件目录中看到对应渠道的包,如下图中后面带有(baidu)的就是百度对应渠道的java文件。之后再main文件之中就可以使用了。
同时,建议每个渠道统一对外提供接口的类以及对应的方法名。可以便于调用。同时在Build.gradle中添加一下代码:
其中对于flavorDimensions 的配置,如果使用了buildConfigField,studio 3.0之前配置多版本即使没有这个参数打包也是不会有问题的,可以正常运行、打包。但是AndroidStudio升级到3.0之后,配置多版本打包运行的时候需要这个参数,其中的值可以自己决定。
对于buildConfigField,其中有三个参数,第一个是参数的类型,第二个是参数的名字,第三个是值。可以使用这个来存储一些对应的值用来分辨当前渠道。对于定义的值的使用如下图:
使用BuildConfig就可以直接调用对应的值。并做对应的判断。
3.依赖设置
对于不同的渠道有时候需要使用不同的依赖,这个时候就休要为不同的渠道配置不同的依赖了。配置方法如下图:
如图中所示对应渠道的专属依赖可有使用渠道名+Implementation来配置 这样就可以在不同的渠道配置不同的依赖,而各个渠道都是用到的依赖直接使用之前的配置方法就好了。
4.插件设置
有时候不同的渠道需要使用不同的插件,这个时候就需要对插件进行配置。配置代码如下:
import java.util.regex.Matcher
import java.util.regex.Pattern
def String getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("bundle(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find()) {
return matcher.group(1).toLowerCase()
} else {
return "";
}
}
gradle.projectsEvaluated {
preBuild.dependsOn(applyPluginByFlavor)
}
// Then check on the parameter, which comes from the command line
task applyPluginByFlavor {
def flavorType = ""
flavorType = getCurrentFlavor();
if (flavorType.equals("google")) {
println("正在构建 google 包")
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.firebase.firebase-perf'
}
if (flavorType.equals("huawei")) {
println("正在构建 huawei 包")
apply plugin: 'com.huawei.agconnect'
apply plugin: 'com.huawei.agconnect.apms'
}
}
这一段引用自这篇博客–>> 目标博客<<–使用这一段就可以对不同渠道的插件进行单独设置。