【AndroidIDE】手机离线构建报 "No cached version available for offline mode" 彻底解决方案(kotlin-compiler-embeddable 实战)
全程手机操作,零电脑、零 ROOT。本文记录一次真实的手机端 Android 离线构建踩坑全过程:从报错定位,到区分 buildscript classpath 依赖与 app 依赖,到手动落位本地 Maven 仓库,最终 BUILD SUCCESSFUL。文末附可复用的修复脚本。
一、报错现场
在 AndroidIDE(Code On The Go)中执行离线构建时:bash12sh gradlew installDebug --offline稳定复现以下错误,
2 秒即败:* What went wrong:
A problem occurred configuring root project 'My Appinstall'.
> Could not resolve all artifacts for configuration 'classpath'.
> Could not download kotlin-compiler-embeddable-1.9.22.jar
(org.jetbrains.kotlin:kotlin-compiler-embeddable:1.9.22):
No cached version available for offline mode
BUILD FAILED in 2s
网上搜这个报错,几乎全是 Gradle 常规答案(加依赖、开网络),没有人讲清楚 AndroidIDE 手机环境下的特殊性。本文补上这块空白。
二、关键认知:两种依赖,两种缺法
这是本文最重要的一个知识点,搞懂它你才能对症下药:
二、关键认知:两种依赖,两种缺法
这是本文最重要的一个知识点,搞懂它你才能对症下药:
依赖类型 配置名 作用 缓存缺失时的报错位置
app 依赖 debugCompileClasspath 等 你项目代码用到的库(如 kotlin-stdlib) 执行阶段报错,通常在编译任务时
buildscript classpath 依赖 classpath 构建系统自己用的(Kotlin Gradle 插件、它的编译器本体) 配置阶段报错(Configure project),任务还没开始就挂
本次报错两个特征:1.configuration 'classpath' → 说明是 buildscript 依赖;2.configuring root project + BUILD FAILED in 2s → 构建还没碰到你的代码就死了。
结论:缺的不是你项目的依赖,而是 Kotlin 插件的编译器本体 kotlin-compiler-embeddable。 这也解释了为什么往 dependencies 里加任何东西都没用——方向就错了。
一个隐蔽的坑:如果之前在线构建时报过 Compilation error,别急着改代码——编译器 jar 没到手时,Kotlin 编译根本没真正运行,那个“编译错误”可能是假象。补齐 jar 后同样的代码一次通过。
三、排查三步法(手机终端直接操作)
第 1 步:全量日志落地,看清错误全貌
不要用 | tail -8——它会吞掉错误正文!正确姿势:
sh gradlew compileDebugKotlin --offline > /sdcard/kbuild.log 2>&1
grep -B 2 -A 15 "What went wrong" /sdcard/kbuild.log
grep -n -i -E "error|could not|unresolved" /sdcard/kbuild.log | head -25
第二个 grep 确认错误唯一且明确后,才好精确打击。
第 2 步:确认 IDE 的本地仓库机制
AndroidIDE 内置了一个本地 Maven 仓库,部分依赖从这里解析:
ls /data/data/com.itsaky.androidide/files/home/maven/localMvnRepository/org/jetbrains/kotlin/
对比报错目标,缺哪个一目了然。
第 3 步:翻 Gradle 缓存,看 jar 是否以其他形式存在
find /data/data/com.itsaky.androidide/files/home/.gradle -name "kotlin-compiler-embeddable*" 2>/dev/null
如果这里能找到 jar,恭喜——零下载,直接搬运就能解决。
四、解决方案
方案 A:缓存搬运(零下载,优先尝试)
SRC=$(find /data/data/com.itsaky.androidide/files/home/.gradle -name "kotlin-compiler-embeddable-1.9.22.jar" 2>/dev/null | head -1)
D="/data/data/com.itsaky.androidide/files/home/maven/localMvnRepository/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.22"
mkdir -p "$D"
cp "$SRC" "$D/kotlin-compiler-embeddable-1.9.22.jar"
再补一个最小 POM(Maven 仓库必备):
cat > "$D/kotlin-compiler-embeddable-1.9.22.pom" <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-compiler-embeddable</artifactId>
<version>1.9.22</version>
</project>
EOF
方案 B:单文件 curl 下载(比 Gradle 更抗断网)
移动网络下 Gradle 整条解析链一断全断,而 curl 单文件 + 断点续传成功率大幅提高:
D="/data/data/com.itsaky.androidide/files/home/maven/localMvnRepository/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.22"
mkdir -p "$D"
curl -L -C - --retry 5 -o "$D/kotlin-compiler-embeddable-1.9.22.jar" \
https://maven.aliyun.com/repository/public/org/jetbrains/kotlin/kotlin-compiler-embeddable/1.9.22/kotlin-compiler-embeddable-1.9.22.jar
用阿里云镜像替代 Maven Central,国内网络稳定性差异巨大。-C - 支持断点续传,断了重跑同一条命令即可接着传。
方案 C:网络允许时直接在线构建
sh gradlew installDebug # 不带 --offline
本质是让 Gradle 自己联网补缓存。缺点:网络一抖就 Software caused connection abort,且 tail -8 会让你看不到死因。失败后记得落日志再看。
五、最终验证
sh gradlew installDebug --offline 2>&1 | tail -8
看到 BUILD SUCCESSFUL 即成。如果最后一步 installDebug 报 adb: Permission denied(AndroidIDE 的 adb 在非 root 环境无法执行)——别装了,直接用文件管理器点 APK:
cp app/build/outputs/apk/debug/app-debug.apk /storage/emulated/0/MyApp.apk
文件管理器 → 内部存储根目录 → 点击安装。这才是手机端安装的正道。
六、一键修复脚本(可复用)
把整套逻辑封装成脚本,缺啥补啥、有缓存搬缓存、没缓存走镜像:
#!/bin/bash
# fix-kotlin.sh —— 用法: sh fix-kotlin.sh 1.9.22 --online
KVER="${1:-1.9.22}"
MVN="/data/data/com.itsaky.androidide/files/home/maven/localMvnRepository"
CACHE="/data/data/com.itsaky.androidide/files/home/.gradle/caches/modules-2/files-2.1"
for art in kotlin-stdlib kotlin-stdlib-jdk7 kotlin-stdlib-jdk8 \
kotlin-gradle-plugin kotlin-compiler-embeddable; do
D="$MVN/org/jetbrains/kotlin/$art/$KVER"
[ -f "$D/$art-$KVER.jar" ] && echo "[OK] $art" && continue
SRC=$(find "$CACHE/org.jetbrains.kotlin/$art" -name "*.jar" 2>/dev/null \
| grep -v sources | grep -v javadoc | head -1)
mkdir -p "$D"
if [ -n "$SRC" ]; then
cp "$SRC" "$D/$art-$KVER.jar" && echo "[搬运] $art"
elif [ "$2" = "--online" ]; then
curl -L -C - --retry 5 -o "$D/$art-$KVER.jar" \
"https://maven.aliyun.com/repository/public/org/jetbrains/kotlin/$art/$KVER/$art-$KVER.jar" \
&& echo "[下载] $art"
else
echo "[缺] $art —— 加 --online 参数联网补齐"
fi
cat > "$D/$art-$KVER.pom" <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project><modelVersion>4.0.0</modelVersion>
<groupId>org.jetbrains.kotlin</groupId><artifactId>$art</artifactId><version>$KVER</version>
</project>
EOF
done
echo "完成,可执行: sh gradlew installDebug --offline"
七、总结
症状 真相 药方
配置阶段 2 秒即败,报 classpath 缺 jar buildscript 依赖缺缓存,与你的代码无关 搬运/下载 jar 到 localMvnRepository
报过 Compilation error 但代码没改过 编译器 jar 缺失导致假象 先补 jar 再怀疑代码
tail 看不到错误正文 tail 截断了输出 全量落日志 + grep
adb Permission denied 装不上 非 root 环境限制 文件管理器点 APK一句话经验:手机端离线开发的本质是“缓存管理”——Gradle 只认两条路:本地仓库和缓存目录,把文件喂到位,offline 就能跑通一切。
我是 ___(你的 ID),正在记录全部用手机完成 Android 开发的实战系列。下一篇预告:《Java 版本不匹配导致 Gradle 启动失败的诊断与修复脚本》。觉得有用请点赞收藏,评论区欢迎贴出你的报错。