Android Studio里Gradle配置多版本编译

项目上需要在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,都已经做了区分。这样我们直接加个前缀也就好理解了,之后可能还会遇到其他配置,可以参考这种方式去尝试修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值