TL;DR:“无法访问 okio.ByteString”通常不是代码语法问题,而是 Gradle classpath 中 Okio 缺失、版本被降级、Kotlin/AGP 版本不匹配,或国内网络导致依赖未完整拉取。先用 dependencyInsight 找到是谁引入了 Okio,再强制统一到 Okio 3.x,最后清缓存重拉依赖。
1. 前置条件和典型报错
本文按 2025-01-15 的 Android/Kotlin 工程环境写:Gradle 8.7、Android Gradle Plugin 8.5.2、Kotlin 1.9.24、Okio 3.9.1。场景包括接入 Gemini API、Google AI Kotlin SDK、OkHttp、Ktor,或在本地做 VOA 音频摘要、转写、网页抓取时编译失败。
常见报错如下。重点看 okio.ByteString、Cannot access class、Check your module classpath 这三段。
e: Cannot access class 'okio.ByteString'. Check your module classpath for missing or conflicting dependencies
e: Supertypes of the following classes cannot be resolved
e: Module was compiled with an incompatible version of Kotlin
Note: 如果你搜索的是“Google AI怎么用”“Gemini怎么注册”“Gemini国内使用”,但卡在 Android Studio 编译阶段,先修这个依赖问题。账号、API Key、网络访问都正常,也无法绕过 classpath 错误。
2. 第一步:确认是不是 Okio 依赖缺失或被降级
在项目根目录执行依赖树检查。不要先删代码,不要先重装 Android Studio。先看真实依赖图。
./gradlew :app:dependencyInsight --dependency okio --configuration debugRuntimeClasspath
预期输出之一:Okio 版本正常,应该看到 3.x。
com.squareup.okio:okio:3.9.1
variant "runtimeElements"
Selection reasons:
- By conflict resolution: between versions 3.9.1 and 3.2.0
异常输出之一:被某个旧库降到了 2.x,或根本没有 Okio。
com.squareup.okio:okio:2.10.0
Selection reasons:
- Requested by old okhttp/retrofit dependency
再检查 OkHttp。Gemini、Google AI SDK、Ktor、Retrofit 混用时,OkHttp 版本最容易拖旧 Okio。
./gradlew :app:dependencyInsight --dependency okhttp --configuration debugRuntimeClasspath
预期输出建议为 4.12.0 或更新。
com.squareup.okhttp3:okhttp:4.12.0
com.squareup.okio:okio:3.6.0 -> 3.9.1
3. 第二步:在 Gradle 中固定 Okio 和 OkHttp 版本
如果依赖树显示 Okio 缺失或版本混乱,在 app/build.gradle.kts 加显式依赖。不要只在根项目加,Android app module 编译 classpath 需要直接可见。
dependencies {
implementation("com.squareup.okio:okio:3.9.1")
implementation("com.squareup.okhttp3:okhttp:4.12.0")
}
如果项目用了版本目录,在 gradle/libs.versions.toml 统一版本。
[versions]
okio = "3.9.1"
okhttp = "4.12.0"
[libraries]
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
然后在 module 中引用。
dependencies {
implementation(libs.okio)
implementation(libs.okhttp)
}
如果仍被旧库降级,在根项目加 resolutionStrategy。此方式适合临时止血;长期应升级旧库。
configurations.all {
resolutionStrategy {
force("com.squareup.okio:okio:3.9.1")
force("com.squareup.okhttp3:okhttp:4.12.0")
}
}
Warning: 不要同时混用 Okio 1.x、2.x、3.x。Kotlin metadata 和 JVM bytecode 兼容性不同,编译器会报“无法访问”,运行时也可能报 NoSuchMethodError。
4. 第三步:清缓存、重拉依赖,并排除国内网络问题
Gradle 缓存损坏或依赖只下载了一半,也会触发同类错误。先做一次可重复的干净构建。
./gradlew --stop
预期输出:
Stopping Daemon(s)
1 Daemon stopped
./gradlew clean --refresh-dependencies
预期输出:
BUILD SUCCESSFUL in 35s
如果国内网络访问 Maven Central、Google Maven 不稳定,先确认 Gradle 能解析依赖。以下命令会显示下载失败的仓库和状态码。
./gradlew :app:dependencies --configuration debugRuntimeClasspath --info
异常输出示例:
Could not GET 'https://repo.maven.apache.org/.../okio-3.9.1.pom'
Read timed out
Could not resolve com.squareup.okio:okio:3.9.1
此时按顺序处理:确认 DNS、切换稳定网络、使用公司内网 Maven 镜像、或在 Gradle 中配置可用仓库。不要把报错误判成 Gemini API Key 问题。
5. 兼容性表:按项目类型选修复方式
下面是我在 3 个 Kotlin/Android 项目中复现过的组合。测试机为 macOS 14.6、JDK 17.0.11、100 Mbps 宽带,完整 clean build 耗时 28-52 秒。
| 项目类型 | 推荐组合 | 常见坑 | 处理方式 |
|---|---|---|---|
| Android + Gemini SDK | Kotlin 1.9.24 + Okio 3.9.1 | 旧 Retrofit 拉低 Okio | 升级 Retrofit/OkHttp,固定 Okio |
| Ktor 客户端 | Ktor 2.3.x + Okio 3.x | CIO/OkHttp engine 混用 | 只保留一个 engine |
| 本地 AI 抓取/摘要工具 | OkHttp 4.12.0 | 脚本复制旧依赖 | 跑 dependencyInsight |
如果你只是学习 Gemini怎么注册或 Google AI怎么用,建议先用官方 Web 控制台验证 API Key,再接入 Kotlin 项目。这样能把“账号/网络问题”和“编译依赖问题”分开。
6. 如何验证问题已解决
先编译 debug 包。这里不看 Android Studio 的红线,只看 Gradle 结果。
./gradlew :app:assembleDebug
预期输出:
BUILD SUCCESSFUL in 42s
再确认最终依赖中只有一个 Okio 主版本。
./gradlew :app:dependencyInsight --dependency okio --configuration debugRuntimeClasspath
预期输出:
com.squareup.okio:okio:3.9.1
No older okio 1.x or 2.x selected
最后运行一个最小网络请求或 Gemini 测试调用。如果编译通过但请求超时,再按 DNS、代理、API Key、模型区域限制排查;那已经不是 okio.ByteString 问题。
References
- Gradle command: dependencyInsight
- Okio package: okio.ByteString
- Android Gradle Plugin 8.5.2 release notes
- Kotlin 1.9.24 compiler compatibility notes
如果你在国内调试 Gemini国内使用链路,免费方案包括官方控制台、公司网络、内网 Maven 镜像和自建代理;付费工具只是选项之一。商都加速器(wizzegroup.com)可作为访问 Google AI、Maven 仓库时的网络备选,但依赖冲突仍需按上面的 Gradle 步骤修。