Gradle
个人博客地址:https://www.moonlightshadow.cn/article/831823389965418496
背景
最近遇到的gradle的各种坑爹问题,如果是单模块开发,应该遇到的不多。 目前组件化情况下,而且管理比较混乱,各种依赖关系晕头转向。但是你不能改代码。emmmmmmmm,下面是问题经典错误提示与解决方案。放心食用,已经亲测!
强制使用某个版本lib
例如
app.build.gradle{
configurations.all {
resolutionStrategy {
force 'androidx.lifecycle:lifecycle-livedata:2.2.0'
}
}
}
剔除依赖
项目某个lib依赖下面的组件,但是当前自己的模块也依赖更高版本的。
implementation 'com.google.android.exoplayer:exoplayer:2.11.3'
自己模块配置剔除依赖
implementation 'com.google.android.exoplayer:exoplayer:2.11.4'
api("lib-xx") {
exclude group: "com.google.android.exoplayer", module: "exoplayer"
}
依赖库冲突
Android dependency 'androidx.lifecycle:lifecycle-livedata' has different version for the compile (2.0.0) and runtime (2.2.0) classpath. You should manually set the same version via DependencyResolution
在编译期,果你遇到类似这样的错误提示,那就是同一个库依赖多次不同的版本导致。 你可以排查来源,看看是哪个地方引入的。
在命令行中执行
//app替换成项目中具体的module name
gradlew app:dependencies > log_dependencies.txt
在根目录下生成log文件,而且里面是有层级结构的。直接搜索就能查到源头。
Java编译问题
Caused by: com.android.tools.r8.utils.AbortException: Error: Invoke-customs are only supported starting with Android O (--min-api 26)
这样的错误解决方法
app.build.gradle
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
65535
Cannot fit requested classes in a single dex file (# methods: 102097 > 65536)
app.build.gradle
android.defaultConfig{
multiDexEnabled true
}
//可以选择更高版本
implementation 'androidx.multidex:multidex:2.0.0'
//Application extends MultiDexApplication
组件化/模块化
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBinderMapperImpl
组件里写了dataBinding
{enabled = true}但是主组件没写,然后运行主组件的时候报错了,
只需要在主组件里也加上dataBinding {enabled = true}就可以了
记得关注,收藏,点赞噢 持续更新~~
4.14更新
另一个扫描依赖的方式
gradlew build --scan
执行完成之后,输入yes,上传扫描结果过gradle中。 输入你的邮箱地址注册一下,一会儿你的邮箱收到结果的链接。点击链接就可以看到扫描结果了。 是html文档。也很方便阅读。
2021年12月13日更新。
可以通过生成依赖图方式,查看依赖关系。 工具:https://github.com/vanniktech/gradle-dependency-graph-generator-plugin