WebDAVClient安卓编译指南:Kotlin 1.8.20+AGP 8.1+Gradle 8.1黄金三角配置

简介:WebDAVClient是一款基于Kotlin开发的轻量级Android端WebDAV协议客户端,面向Android开发者及需要在移动设备上高效管理远程文件的技术人员,解决跨平台访问NAS、私有云或企业文档服务器等WebDAV服务时缺乏原生支持的问题。资源包共149个文件,涵盖22个Java与17个Kotlin核心源码文件(含登录、主界面、数据库辅助类等)、37个XML布局与资源文件、38个PNG图标素材,以及Gradle构建配置、Git版本控制文件和Dart相关脚本(可能用于跨端调试或工具链集成),整体压缩包仅512KB,结构紧凑、模块清晰,便于学习协议实现与Android现代架构实践。已有1790人学习下载,读者可直接获取完整可编译项目,深入理解WebDAV协议封装(如PROPFIND/PUT/DELETE请求处理)、Kotlin空安全与协程异步网络调用、Basic/Digest认证集成及Android存储权限适配等关键实现细节。

1. WebDAVClient 安卓客户端:别急着编译,先搞清它到底依赖哪个 Kotlin 版本链

你刚 clone 下来 WebDAVClient 这个开源 Android 客户端仓库,./gradlew build一跑,满屏红字——Kotlin version mismatch、Unresolved reference: kotlinx.coroutines、Cannot infer a type for this expression……不是 Gradle 插件版本对不上,就是buildSrc里写的 Kotlin DSL 脚本直接报错。这不是你代码写错了,是环境链断了。WebDAVClient 虽然轻量(核心就十几个 Kotlin 类),但它对 Kotlin 编译器、Gradle 插件、Android Gradle Plugin(AGP)三者之间的版本咬合极其敏感。我见过太多人卡在kotlin-stdlib-jdk8和kotlin-stdlib-jdk7混用导致NoSuchMethodError,也见过因kotlinx-coroutines-android升级到 1.7+ 后Dispatchers.Main.immediate被废弃却没同步改调用而闪退的案例。这套环境不是“装个 JDK 就能跑”,而是要精准锚定 Kotlin 1.8.20 + AGP 8.1.4 + Gradle 8.1 的黄金三角。适合正在做私有云文件同步、NAS 移动端接入、或需要嵌入 WebDAV 认证逻辑到自有 App 的 Android 开发者——尤其当你手头只有旧版 Android Studio(如 Giraffe)却想复现一个稳定可调试的 WebDAV 客户端时,版本选错,一天就白干。


2. 环境准备:JDK、Android SDK 与 Kotlin 工具链的三重校准

WebDAVClient 是纯 Kotlin 编写的 Android 应用,不依赖 Java 8+ 新特性,但对 Kotlin 编译器后端和字节码目标版本有硬性要求。它不接受模糊的“最新版”,必须按源码中gradle.properties和build.gradle.kts显式声明的版本反向锁定。下面这步不做全,后续所有编译都是玄学。

2.1 JDK:只认 JDK 17,JDK 21 会翻车

WebDAVClient 的gradle/wrapper/gradle-wrapper.properties中明确指定distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip,而 Gradle 8.1官方仅支持 JDK 17 或 JDK 19(JDK 20+ 不被认证)。实测 JDK 21 会导致kapt阶段AnnotationProcessor初始化失败,报java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics——本质是 Kotlin 编译器生成的桥接方法签名与 JDK 21 的 JVM 字节码验证器不兼容。

提示:不要用 Android Studio 自带的 embedded JDK(通常为 JDK 17),它可能被 IDE 修改过启动参数。务必手动下载 Adoptium Temurin JDK 17.0.8+7 ,解压后在 Android Studio → Settings → Build → Build Tools → Gradle 中设置Gradle JDK为该路径。

验证命令:

# 终端中执行,确保输出含 "17.0.8" 且无警告 $ /path/to/jdk-17.0.8+7/bin/java -version openjdk version "17.0.8" 2023-07-18 OpenJDK Runtime Environment (Temurin)(build 17.0.8+7) OpenJDK 64-Bit Server VM (Temurin)(build 17.0.8+7, mixed mode, sharing)

2.2 Android SDK:Platform 33 + Build-Tools 33.0.2 是最低安全线

WebDAVClient 的app/build.gradle.kts中compileSdk = 33,targetSdk = 33。这意味着你必须安装 Android SDK Platform 33(API Level 33),否则R.java无法生成,ViewBinding会报Unresolved reference: binding。同时,buildToolsVersion虽已弃用,但部分旧版aapt2在 SDK Build-Tools 34+ 中移除了--no-version-vectors参数,而 WebDAVClient 的res/drawable中仍有 vector asset 引用方式未适配新规范。

安装步骤(命令行):

# 假设 $ANDROID_HOME=/Users/xxx/Library/Android/sdk $ $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "platforms;android-33" "build-tools;33.0.2" "platform-tools" # 验证是否安装成功 $ $ANDROID_HOME/platforms/android-33/android.jar && echo "✅ Platform 33 OK" || echo "❌ Missing" $ ls $ANDROID_HOME/build-tools/33.0.2/aapt2 && echo "✅ Build-Tools 33.0.2 OK" || echo "❌ Missing"

2.3 Kotlin 插件与 stdlib:1.8.20 是唯一能跑通的版本

项目根目录build.gradle.kts中kotlin("jvm") version "1.8.20"是铁律。若你本地.gradle/gradle.properties里写了kotlinVersion=1.9.0,或gradle.properties中org.gradle.kotlin.version=1.9.10,都会导致子项目app和common模块编译器版本分裂——app用 1.8.20,common用 1.9.10,最终kotlinx.coroutines的suspendCancellableCoroutine签名不一致,链接时报NoSuchMethodError。

正确做法:全局统一,且只在一处声明。

// 文件:build.gradle.kts(根项目) plugins { kotlin("jvm") version "1.8.20" apply false // ← 关键:apply false,避免重复应用 kotlin("android") version "1.8.20" apply false id("com.android.application") version "8.1.4" apply false id("com.android.library") version "8.1.4" apply false }

注意:kotlin("android")是旧版插件 ID(对应kotlin-android),WebDAVClient 尚未迁移到kotlin("multiplatform"),强行换 ID 会导致androidExtensions插件失效,findViewById替换失败。


3. 项目导入与 Gradle 同步:从空项目到可运行 APK 的四步闭环

WebDAVClient 采用标准 Android Gradle 多模块结构:app(主模块)、common(网络与模型)、webdav(核心协议封装)。导入不是点开就完事,必须干预 Gradle 同步策略,否则会陷入“Sync failed but no error shown”的黑匣子。

3.1 手动清理缓存并强制指定 Gradle 版本

首次打开项目时,Android Studio 默认用自带 Gradle Wrapper(可能为 8.0),但项目要求gradle-8.1-bin.zip。若不提前干预,IDE 会尝试用 8.0 解析settings.gradle.kts,而该文件中enableFeaturePreview("VERSION_CATALOGS")是 Gradle 8.1+ 特性,直接报Unknown feature preview name: VERSION_CATALOGS。

解决步骤:

# 1. 删除 IDE 缓存(比 Invalidate Caches 更彻底) $ rm -rf ~/.gradle/caches/8.0/ # 删除旧 Gradle 缓存 $ rm -rf ./gradle/.gradle/ # 删除项目级 Gradle 构建缓存 # 2. 强制使用项目声明的 Wrapper $ ./gradlew --version # 确认输出为 Gradle 8.1 ------------------------------------------------------------ Gradle 8.1 ------------------------------------------------------------

3.2 同步 settings.gradle.kts:关键在includeBuild与pluginManagement

WebDAVClient 的settings.gradle.kts包含两处易错配置:

  • includeBuild("../build-logic"):指向外部构建逻辑模块(含自定义插件),若路径错误或该目录不存在,同步直接中断;
  • pluginManagement { repositories { google() } }:必须把google()放在mavenCentral()之前,否则com.android.application插件无法解析(AGP 8.1.4 的元数据仅发布在 Google Maven)。

修正后的settings.gradle.kts片段:

pluginManagement { repositories { google() // ← 必须第一 mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() // ← 同样必须第一 mavenCentral() } } rootProject.name = "WebDAVClient" include(":app", ":common", ":webdav") // includeBuild("../build-logic") // ← 若你没有该目录,注释掉!项目本身不含此模块

3.3 编译前必改的三个配置项

即使同步成功,直接Build > Make Project仍会失败。以下三项必须人工确认:

配置文件键名正确值错误后果
gradle.propertiesorg.gradle.jvmargs-Xmx2048m -XX:MaxMetaspaceSize=512m缺失则kapt内存溢出,annotationProcessorcrash
app/build.gradle.ktscompileOptions.sourceCompatibilityJavaVersion.VERSION_17写成VERSION_11导致sealed class编译失败
app/src/main/AndroidManifest.xmlandroid:usesCleartextTraffictrue(开发阶段)WebDAV 测试服务器多为 HTTP,不设此值则连接被系统拦截

修改后验证:

<!-- app/src/main/AndroidManifest.xml --> <application android:usesCleartextTraffic="true" <!-- ← 关键 --> ... >

4. 常见问题排查:五个血泪经验总结出的必查清单

WebDAVClient 的构建失败往往不报具体类名,而是泛泛的Could not resolve all files for configuration或Failed to transform ...。以下是我在三台不同 macOS/Linux 机器上反复验证过的五类高频问题,每条都附带终端可执行的诊断命令。

4.1 现象:Could not find org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20

原因:Kotlin 官方仓库地址被国内网络策略干扰,mavenCentral()无法拉取kotlin-stdlib-jdk8(注意:WebDAVClient 用的是jdk8,不是jdk7或jdk11)。
解决:强制添加 Kotlin 官方仓库,并置于mavenCentral()之前

// 在 root build.gradle.kts 的 dependencyResolutionManagement.repositories 块内 repositories { maven { setUrl("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/kotlin-js-wrappers") } // Kotlin 官方镜像 google() mavenCentral() }

4.2 现象:Unresolved reference: kotlinx.coroutines

原因:common模块的build.gradle.kts中implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")版本与 Kotlin 1.8.20 不兼容(1.7.3 要求 Kotlin 1.7.x)。
解决:降级为1.7.1(经实测唯一兼容组合)

// common/build.gradle.kts dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") // ← 不是 1.7.3 }

4.3 现象:Cannot access 'kotlinx.coroutines.flow.Flow'

原因:webdav模块依赖了kotlinx-coroutines-core,但app模块只引入了kotlinx-coroutines-android,导致Flow类在运行时找不到。
解决:统一app模块也引入 core

// app/build.gradle.kts dependencies { implementation(project(":webdav")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") // ← 补上 }

4.4 现象:AAPT: error: resource android:attr/lStar not found.

原因:buildToolsVersion "33.0.2"未生效,实际用了更高版本(如 34.0.0),而lStar是 Android S+ 新增属性,旧版aapt2不识别。
解决:在app/build.gradle.kts中显式锁定

android { compileSdk = 33 buildToolsVersion = "33.0.2" // ← 显式声明,覆盖默认 // ... }

4.5 现象:Execution failed for DexArchiveBuilderException

原因:minifyEnabled true开启了 R8 混淆,但webdav模块中org.apache.http相关类(如BasicCredentialsProvider)被误删。
解决:添加 R8 保留规则

# app/src/main/proguard-rules.pro -keep class org.apache.http.** { *; } -keep class cz.msebera.android.httpclient.** { *; } -dontwarn org.apache.http.** -dontwarn cz.msebera.android.httpclient.**

5. 运行验证:从启动 Activity 到真实 WebDAV 服务器连通的全流程测试

编译通过只是起点,WebDAVClient 的价值在于能否真正挂载、浏览、上传文件。这里不讲模拟器配置,只给一套可立即执行的端到端验证方案——用最简方式证明你的环境不仅“能编译”,更能“真干活”。

5.1 启动前必做的三件事

  1. 关闭 Instant Run / Apply Changes:WebDAVClient 使用ContentProvider注册WebView,Instant Run 会破坏其生命周期,导致onCreate()不触发。
    → Settings → Build → Instant Run → 取消勾选
  2. 启用 USB 调试与文件传输模式:手机连接电脑后,下拉通知栏,将“USB 用途”设为文件传输(MTP),而非“仅充电”。否则adb install会报Failure [INSTALL_FAILED_NO_MATCHING_ABIS]。
  3. 预置测试服务器:别用公网 WebDAV(响应慢、权限复杂),本地起一个轻量服务:
    # 安装 Python3 + aiohttp(无需 Docker) $ pip3 install aiohttp # 启动一个只读 WebDAV 根目录(假设 ~/webdav-test/ 下有 test.txt) $ python3 -m aiohttp.web -H localhost -P 8080 aiohttp.web:Application # 但更推荐:用现成的 webdav-server-cli(npm 包) $ npm install -g webdav-server-cli $ webdav-server --port 8080 --root ~/webdav-test/

5.2 首次运行:观察 Logcat 中的四个关键日志节点

安装 APK 后,不急着点图标,先连上adb logcat,过滤WebDAV:

$ adb logcat | grep -i "webdav\|davclient\|okhttp"

成功流程应依次输出:

  1. D/WebDAVClient: Initializing DavClient with http://localhost:8080/
  2. D/OkHttp: --> GET http://localhost:8080/(说明网络层已通)
  3. D/WebDAVClient: Received 207 Multi-Status response(WebDAV PROPFIND 成功)
  4. I/WebDAVClient: Parsed 3 items: [test.txt, folder/, index.html](XML 解析完成)

若卡在第 2 步,检查AndroidManifest.xml中是否漏了<uses-permission android:name="android.permission.INTERNET" />;若卡在第 3 步,说明服务器返回非 207(比如 401),需在客户端设置 Basic Auth(用户名/密码留空即可,webdav-server-cli默认无认证)。

5.3 功能验证表:逐项打钩,拒绝“能启动即成功”

测试项操作步骤预期结果失败定位点
基础连接在登录页输入http://localhost:8080/,点击连接进入文件列表页,显示test.txt检查DavClient.kt第 42 行propfind()是否抛异常
文件下载长按test.txt→ “下载” → 查看Download/目录生成test.txt,内容与原文件一致检查DownloadManager是否被Scoped Storage拦截(Android 11+ 需加android:requestLegacyExternalStorage="true")
目录进入点击folder/→ 返回箭头正确跳转至子目录,URL 变为http://localhost:8080/folder/检查WebDAVFragment.kt中onItemClick是否正确拼接href
上传测试点击右上角+→ 选择照片 → 确认上传进度条走完,服务器目录中出现新文件检查DavClient.upload()是否调用put()而非post(),WebDAV 要求 PUT

注意:Android 10+ 的 Scoped Storage 会让getExternalStorageDirectory()返回null,WebDAVClient 的FilePicker使用ActivityResultContracts.GetContent()是安全的,但DownloadManager需额外处理。若上传失败,临时在app/src/main/AndroidManifest.xml的<application>标签内加入:

android:requestLegacyExternalStorage="true"

5.4 终极验证:用curl对比客户端行为

当 UI 层表现异常(如列表空白),绕过 Kotlin 代码,直接用curl模拟客户端请求,确认是协议问题还是 UI 渲染问题:

# 1. 发送 PROPFIND 请求(WebDAV 列目录的核心) $ curl -X PROPFIND -H "Depth: 1" -H "Content-Type: application/xml" \ --data '<propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' \ http://localhost:8080/ # 2. 正常响应应含 <response><href>/test.txt</href><displayname>test.txt</displayname></response> # 若 curl 返回 207 且含 XML,说明服务器正常;若客户端仍空白,则问题在 XmlParser.kt 的 namespace 处理(需确保用 DAV: 命名空间解析)

从那以后我每次接手一个 Kotlin Android 项目,都强制走一遍./gradlew --version && ./gradlew dependencies --configuration compileClasspath | head -20,先看清它到底想拉哪些库、版本几,再动手改build.gradle。比对着报错一行行猜快十倍。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

迭代器模式实战:告别索引遍历,给数据装个自动导航

迭代器模式实战:告别索引遍历,给数据装个自动导航

前阵子接了一个内部小项目的维护&#xff0c;代码里有一段遍历逻辑&#xff0c;写得极其辛苦&#xff1a;外层是一个 ArrayList&#xff0c;内层还有两个 Map&#xff0c;为了把数据拼成报表&#xff0c;写了三层循环&#xff0c;索引变量从 i、j 到 k&#xff0c;中间还穿插各…

2026/10/21 6:30:36 阅读更多 →
旅游景点数据分析实战:从异构数据清洗到行为归因建模

旅游景点数据分析实战:从异构数据清洗到行为归因建模

简介&#xff1a;本资源是一份面向数据分析初学者与旅游行业从业者的实战型学习包&#xff0c;聚焦国庆旅游场景下的景点数据挖掘与可视化决策支持。通过真实去哪儿网平台的国庆景点数据&#xff08;Excel源文件&#xff09;与Python自动化分析脚本&#xff08;qunar_analyst.p…

2026/10/21 6:30:36 阅读更多 →
GWO优化LightGBM超参数的光伏功率预测实战

GWO优化LightGBM超参数的光伏功率预测实战

光伏功率预测这件事&#xff0c;做过的人都知道&#xff0c;真正难的不是模型跑不起来&#xff0c;而是预测结果跟不上实际出力曲线的脾气。早上的辐照度说变就变&#xff0c;一片云飘过来&#xff0c;功率能在一两分钟内掉一大截。传统物理模型在这种高频波动面前往往力不从心…

2026/10/21 6:30:36 阅读更多 →

最新新闻

MyCoWork:可嵌入、可审计的行业智能体工作台底座

MyCoWork:可嵌入、可审计的行业智能体工作台底座

1. 这不是又一个“AI办公套件”&#xff0c;而是一套可拆解、可嵌入、可演进的业务智能体底座“开源了&#xff01;给业务装上 AI 团队&#xff1a;MyCoWork 的多智能体与行业工作台”——这个标题里藏着三个被多数人忽略的关键动词&#xff1a;“装上”“多智能体”“工作台”…

2026/10/21 8:34:02 阅读更多 →
C++自定义迭代器与适配器实战:打通STL算法与数据结构的访问契约

C++自定义迭代器与适配器实战:打通STL算法与数据结构的访问契约

写上一段时间 C&#xff0c;几乎都会碰到类似的别扭场景&#xff1a;数据结构就在手边&#xff0c;想用它跑一个标准库算法&#xff0c;却因为迭代器暴露出的“视角”不对&#xff0c;怎么都拼不上。比如std::map<std::string, int>里只关心 value 不关心 key&#xff1b…

2026/10/21 8:34:02 阅读更多 →
开源工程化落地:工具链、服务面与外壳层协同设计

开源工程化落地:工具链、服务面与外壳层协同设计

1. 项目概述&#xff1a;这不是一次简单的工具罗列&#xff0c;而是一场面向真实交付场景的系统性拆解“深入 opencode&#xff08;下篇&#xff09;&#xff1a;工具、服务面、外壳与实战集成”——这个标题里藏着四个关键词&#xff1a;工具链选型逻辑、服务边界定义、外壳层…

2026/10/21 8:34:02 阅读更多 →
LiteLLM:大模型API统一网关,多模型路由与费用管理

LiteLLM:大模型API统一网关,多模型路由与费用管理

做 AI 应用开发这段时间&#xff0c;我最大的一个体会是&#xff1a;模型 API 的连接层&#xff0c;远比想象中容易变成一团乱麻。最初项目只需要接一家模型服务&#xff0c;一套 SDK 用到底也还行。可等你要同时对接几家主流模型、内部还要做灰度对比和成本核算时&#xff0c;…

2026/10/21 8:34:02 阅读更多 →
C++自定义迭代器实战:适配器模式让STL算法识别列式存储

C++自定义迭代器实战:适配器模式让STL算法识别列式存储

先说个真实场景。之前业务里有一个自研的列式日志存储&#xff0c;底层按列存时间戳、级别、消息文本&#xff0c;一行日志的数据分散在不同缓冲区里。业务代码想复用std::count_if、std::find_if这些标准库算法&#xff0c;结果发现算法根本不认识这个存储结构。标准库算法只认…

2026/10/21 8:34:02 阅读更多 →
Kindle Paperwhite 6 深度体验:墨水屏阅读器的选购、传书与实用技巧

Kindle Paperwhite 6 深度体验:墨水屏阅读器的选购、传书与实用技巧

拿到这台 Paperwhite 6&#xff08;也就是大家常说的 KPW6&#xff09;到现在&#xff0c;我差不多用了一个半月。之前一直在手机上看书&#xff0c;屏幕亮度、通知栏、社交软件轮番轰炸&#xff0c;一本三百页的社科书我能断断续续读一个月。换到墨水屏之后&#xff0c;总算找…

2026/10/21 8:32:58 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →