Android Studio Ladybug构建Kotlin项目时出现NullPointerException
问题场景
在Android Studio Ladybug | 2024.2.1 Patch 2 + Gradle 8.9环境下构建项目时,mergeExtDexBanknameDebug任务执行失败,抛出如下NullPointerException:
Task :app:mergeExtDexBanknameDebug FAILED
AGPBI: {"kind":"error","text":"java.lang.NullPointerException: Cannot invoke "String.length()" because "" is null","sources":[{"file":"C:\Users\u725097\.gradle\caches\8.9\transforms\ce16b362b4c14a4e13be95283f210a79\transformed\jetified-slf4j-api-2.0.16.jar"}],"tool":"D8"} java.lang.NullPointerException: Cannot invoke "String.length()" because "
" is null
同一项目在Android Studio Flamingo | 2022.2.1 Patch 1 + Gradle 7.5环境下使用org.slf4j:slf4j-api:1.7.30可正常编译,当前报错环境中SLF4J版本被自动升级到了2.0.16,且无法确定该版本的引入来源。
解决步骤
1. 强制锁定SLF4J版本为1.7.30
在项目根目录的build.gradle(Groovy语法)或build.gradle.kts(Kotlin语法)中添加依赖约束,强制所有模块使用指定版本的SLF4J:
Groovy版本:
allprojects { configurations.all { resolutionStrategy { force 'org.slf4j:slf4j-api:1.7.30' } } }
Kotlin DSL版本:
allprojects { configurations.all { resolutionStrategy.force("org.slf4j:slf4j-api:1.7.30") } }
2. 清理缓存并重新构建
- 执行Gradle清理命令:
Windows:gradlew clean
macOS/Linux:./gradlew clean - 清除Android Studio缓存:依次点击
File → Invalidate Caches...,勾选"Clear file system cache and local history",点击Invalidate and Restart重启IDE。
3. 验证依赖版本是否生效
执行依赖树命令查看SLF4J版本:
Windows:gradlew app:dependencies
macOS/Linux:./gradlew app:dependencies
在输出结果中搜索slf4j-api,确认其版本已变为1.7.30。
原因说明
你使用的Ktor 1.3.2属于旧版本,原本依赖较低版本的SLF4J。升级Gradle到8.9后,依赖解析机制可能自动拉取了更高版本的SLF4J(2.0.16),而该版本的字节码结构与新版AGP的D8编译器不兼容,从而触发了空指针异常。强制锁定旧版本SLF4J即可解决兼容性问题。
内容的提问来源于stack exchange,提问作者user3296448

