用 DeepSeek Harness 从零创建「墨页 PDF」安卓应用

发布时间:2026/8/17 3:09:38
用 DeepSeek Harness 从零创建「墨页 PDF」安卓应用 用 DeepSeek Harness 从零创建「墨页 PDF」安卓应用本文档完整记录如何仅靠 DeepSeek Harness对话式 AI 代理 本机工具链从零开发、构建、测试、修复一款可安装的 Android 应用图片转 PDF 工具。全程真实经历含所有踩坑与解决过程。0. 最终成果交付物路径说明APK 安装包InkPDF\download\app-debug.apk18MB中文版Android 8.0 可装完整工程源码InkPDF\Kotlin Jetpack Compose33 个 Kotlin 文件源码APK 打包InkPDF-source.zip拷到联网电脑即可继续构建交互原型InkPDF\demo\app-prototype.html浏览器可点的界面原型深色设计稿design\mockups\*.pngGDI 程序化渲染构建/分发脚本build.bat/serve.bat/download\index.html一键构建 手机局域网直装功能图片转 PDF、PDF 合并/拆分/转图、图片压缩、文字水印、最近记录、后台生成、深色纸墨风 UI。原则纯离线、零权限仅一个可选通知权限、全部基于 Android 系统原生 API。1. Harness 是什么、怎么工作DeepSeek Harness 是一个对话式开发环境AI 代理在真实电脑上执行操作工具集包括文件工具write创建/覆盖、edit精准替换、read带行号阅读、glob/grep搜索命令工具pwsh执行 PowerShell支持前台/后台 job、超时、工作目录后台任务长任务构建、下载放后台跑完成自动通知不阻塞对话目标工具create_goal建立长周期目标跨多轮自动推进搜索工具web_search联网信息外部组件OpenPencil设计画布、subagent/workflow多代理核心工作流用户用自然语言提需求 → 代理把需求拆解成可执行步骤 → 用工具真实执行写代码、跑命令、查错误→ 把执行结果反馈给用户 → 迭代。2. 第一步需求与方案用户直接给出了一份完整的方案文档技术选型、架构图、功能表、UI 草图、避坑提示。这是最好的起点——需求越明确产出越准。关键决策点永久可用图片转 PDF 用android.graphics.pdf.PdfDocumentPDF 读取用PdfRenderer——纯系统 API零第三方 PDF 库。零权限文件访问走 SAF / PhotoPicker / MediaStore不需要存储权限。深色优雅Material 3 自定义深夜纸墨配色背景#0B0E13、主色暖金#E8B469。经验先让用户/自己把方案写清楚哪怕只是要点再动手——本应用 90% 的功能点都来自那份方案文档。3. 环境侦察动手前先摸清工具链开发前必须先探明本机环境否则会白干。用 pwsh 一次性检查java-version;echo$env:JAVA_HOME;gradle--version# Java/Gradleecho$env:ANDROID_HOME;Test-Path$env:LOCALAPPDATA\Android\Sdk# Android SDKInvoke-WebRequesthttps://dl.google.com-TimeoutSec 8# 网络本机真实情况✅ JDK 17D:\develop\Java\jdk-17.0.1❌ 无 Android SDK、无 Gradle 命令、无网络Google/阿里云镜像全断✅ 有 Gradle 8.8 发行版缓存、JDK、Python 3.10结论无法直接构建 APK → 策略调整为先产出完整可构建的源码 视觉稿等用户安装 Android Studio 后再真构建。环境侦察决定了整个开发策略这一步不能省。4. 工程搭建离线也能干没有网络也能搭好工程骨架Gradle Wrapper本机无法运行gradle wrapper守护进程锁、权限问题改为从磁盘上已有的其他 Gradle 项目复制gradle-wrapper.jargradlewgradlew.bat找到的正好是 Gradle 8.8 时代的 wrapper自己写gradle-wrapper.properties。版本目录gradle/libs.versions.tomlAGP 8.5.2 / Kotlin 2.0.20 / Compose BOM 2024.09.03 / Room 2.6.1 / Work 2.9.1统一管理。构建脚本settings.gradle.kts预留阿里云镜像注释、根/模块build.gradle.kts、gradle.properties开 AndroidX。// libs.versions.toml 片段[versions]agp8.5.2kotlin2.0.20composeBom2024.09.03[plugins]android-application{idcom.android.application,version.refagp}kotlin-compose{idorg.jetbrains.kotlin.plugin.compose,version.refkotlin}5. 分层实现架构即代码按方案文档的 MVVM 分层一个文件一个文件写com.inkpdf.app/ ├── ui/ # Compose 界面首页/编辑/预览/设置 深色主题 ├── data/ # Room(最近记录) DataStore(设置) 领域模型/状态机 ├── engine/ # PdfEngine / ImageProcessor / BitmapUtils纯逻辑 ├── repository/ # PdfRepository / FileRepository(SAFMediaStore) / ShareUtils ├── work/ # WorkManager 后台导出 ├── notification/ # 通知渠道与进度关键设计都对应方案文档防 OOM解码采样长边 2400px 逐页recycle()EXIF 方向API 28 用ImageDecoder26-27 用BitmapFactoryExifInterface灰度/黑白ColorMatrix饱和度 0 阈值矩阵质量参数真实生效先按 JPEG 重编码再嵌入后台导出CoroutineWorker 系统通知设计系统ui/theme/里定义配色 token、字重、圆角——深色纸墨风贯穿所有界面。6. 视觉稿与交互原型OpenPencil 不可用时的替代原计划用 OpenPencil 渲染界面设计稿但宿主不可用。改用两条替代路径GDI 程序化渲染写一个 PowerShell 脚本design/render_mockups.ps1用System.Drawing按坐标画出 5 个屏幕390×844 2x 应用图标 总览板。踩坑函数名H撞了 PowerShell 内置别名Get-History大小写不敏感且.ps1需 UTF-8 BOM 才能读中文。全部修复后渲染成功。HTML 交互原型demo/app-prototype.html——纯 CSS/JS 还原深色界面手机壳里可点选图→编辑→拖拽排序→进度动画→预览翻页→工具。用户双击浏览器即可体验应用。经验外部组件不可用时用语言自带的绘图/HTML 能力做等价交付保证用户看得见。7. 真实构建与排错最有价值的部分用户安装 Android Studio 后开始真构建。每一轮编译都暴露了真实问题——这正是能跑命令比只写代码强的地方#错误根因修复1Directory E:\deepseek_1 does not contain a Gradle buildgradlew 在错误工作目录执行pwsh 指定workdir2SDK location not foundlocal.properties被 PowerShell 写入UTF-8 BOMJava properties 解析失败无 BOM 重写 ANDROID_HOME双保险3Failed to find Platform SDK platforms;android-37新 SDK 只有android-37.0平台AGP 8.5 需要android-34SDK XML 版本 4 与 AGP 8.5 不兼容复制 37 目录伪装成 34后改用官方包4jlink.exe does not existIntelliJ 精简 JBR 缺 jlink换完整 JDK 175编译错误 ×9it变量遮蔽、coilRotationTransformation不存在、Bitmap→ImageBitmap类型不符、挂起函数位置错误、combinedClickable缺 OptIn、PageSettings缺字段手写代码的真实 bug逐一定位修复6真机启动闪退导航路由注册错误composable(routepreview)但声明了必填参数uri导航库启动即抛IllegalArgumentExceptionroute 改为preview?uri{uri}name{name}排错方法论静态校验grep 资源引用、括号配平、runCatching 内挂起函数→ 真构建暴露编译错误 → 模拟器复现运行时错误 → logcat 拿堆栈。每层都能抓到不同类型的 bug。8. 模拟器验证本机自测的完整链路没有真机时自己搭模拟器做端到端验证发现网络其实通PowerShell/curl 失败是 Windows Schannel 凭证问题SEC_E_NO_CREDENTIALS但Java 的 TLS 正常Gradle 能下载依赖证明了这点。用 Java 写了个 10 行下载器tools/D.java下载 SDK 组件。补平台从repository2-3.xml找到官方platform-34-ext7_r03.zip下载并 SHA1 校验替换伪装的目录。下载系统镜像x86_64-34_r04.zip687MB解压到system-images/android-34/default/。手工建 AVD无 cmdline-tools直接写config.ini.iniANDROID_AVD_HOME指向可写目录。启动WHPX 硬件加速可用90 秒 boot。adb 自动化 UI 测试uiautomator dump读界面文本 →input tap模拟点击 → 完整跑通选图→编辑→生成 PDF→预览真实产出了 123KB PDF 文件。这次模拟器测试直接抓到了导航闪退——没有它用户会一直拿到坏包。9. 交付与分发download\目录APK 深色下载页index.html自动检测 APK 是否就绪serve.batPython 起局域网 HTTP手机浏览器输地址即下载安装build.bat/build.sh联网电脑一键构建自动检测 JDK/SDK、生成 local.propertiesInkPDF-source.zip源码APK 打包随时可转移10. 中文化与真机问题中文化应用文案本身全中文模拟器系统语言切zh-CN后系统组件PhotoPicker影集/照片、SAF保存/下载也全中文文件名/目录改为墨页PDF_时间戳.pdf。真机闪退排查进行中模拟器 Android 14 正常用户平板 Android 15 闪退。已做16KB 对齐检查通过、在应用里加崩溃日志捕获器闪退时把完整堆栈写入下载目录无需 adb 即可取回、准备无线调试路径。关键教训不同 Android 版本的行为差异必须用真机日志定位模拟器验证 ≠ 真机验证。11. 经验总结给后来者先侦察环境工具链/网络/权限决定策略一分钟排查省一天返工。需求文档化让用户先写方案哪怕要点开发有依据。分层实现UI / 数据 / 引擎分离出错好定位。尽早真构建编译器/运行时抓到的 bug 比想象中多本应用约 10 处。模拟器自动化uiautomator adb 可以全自动测 UI 流程比截图可靠。网络被伪断时换路子schannel 失败但 Java TLS 通——工具选对了网络就是通的。兜底思维OpenPencil 不可用→GDI/HTMLadb 连不上→崩溃日志捕获器只要目标明确总有路径。