项目上需要在Android Studio工程中,用同一套代码编译不同的版本,而其中依赖的包等等又有冲突,所以就研究了一下如何通过Gradle配置来区别开。
如上图所示,我们新建一个AS工程后,打开Build Variants标签页,默认都会有两个编译选项debug 和 release,这是预置好的。我们需要做的是加入自己的定义。
然后我们来看build.gradle文件,默认会有一个defaultConfig{ }标签,里边包含了一些简单配置。通常我们编译单一版本,只需要在这个标签下修改配置。我们想加入自定义的话,就需要在同级标签下,新加productFlavors{ }标签。
另外还需要给flavor指定一个dimension,否则会提示错误:
ERROR: All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
Affected Modules: app
这样,假如我们新加两个版本,取名first 和 second,最终可能就是下面这样:
android{
defaultConfig{
...
}
productFlavors {
flavorDimensions "default"
first {
versionCode 1
versionName "1.0"
ndk{
abiFilters "armeabi-v7a"
}
externalNativeBuild{
ndkBuild{
arguments "BUILD_TYPE=first"
}
}
}
second {
versionCode 2
versionName "2.0"
ndk{
abiFilters "arm64-v8a"
}
externalNativeBuild{
ndkBuild{
arguments "BUILD_TYPE=second"
}
}
}
}
}
我最开始给flavor命名用了首字母大写,编译没问题,后来随着配置丰富出现了一些错误,改成全小写就好了。具体命名规则还没弄清楚,保险起见,建议使用全小写命名。
这样我们重新sync一下工程,再看Build Variants标签页,就能看到新加的编译选项了。
当不同的版本需要用到不同的依赖包时,Gradle里也可以很方便地操作,只需要给原来的关键字implemention 或者 compileOnly加上前缀。
比如:
dependencies {
firstImplementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8' //只有first会编译
secondImplementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8' //只有second会编译
implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8' //通用,都会编译
}
其实我们重新sync完工程以后,打开gradle标签页,就能看到许多已经排好的task,都已经做了区分。这样我们直接加个前缀也就好理解了,之后可能还会遇到其他配置,可以参考这种方式去尝试修改。