用 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 连不上→崩溃日志捕获器只要目标明确总有路径。

相关新闻

Fiddler手机抓包全攻略:Wi-Fi、热点、USB三种场景实战详解

Fiddler手机抓包全攻略:Wi-Fi、热点、USB三种场景实战详解

1. 项目概述:为什么我们需要在手机上抓包?作为一名常年和网络请求打交道的开发者,我几乎每天都会用到抓包工具。Fiddler,这款经典的HTTP/HTTPS调试代理,在PC端调试Web应用时堪称神器。但移动互联网时代,大量…

2026/10/13 13:44:42 阅读更多 →
卷积(三):快速卷积 (FFT‑法) 原理与代码落地,告别时域卷积算力困境

卷积(三):快速卷积 (FFT‑法) 原理与代码落地,告别时域卷积算力困境

本专栏《信号与系统硬核精讲》付费连载第 3 篇 前文回顾: 第 1 篇:卷积本质含义、连续 & 离散卷积公式、4 步图解计算法、工程应用场景; 第 2 篇:离散 / 连续卷积手算实例、朴素时域卷积 Python/MATLAB 底层实现、卷积五大数学…

2026/10/13 9:40:54 阅读更多 →
SpringBoot+Vue企业人事管理系统:从架构设计到工程化部署全解析

SpringBoot+Vue企业人事管理系统:从架构设计到工程化部署全解析

如果你正在寻找一个既能作为毕业设计项目,又能直接用于实际企业管理的实战案例,那么一个功能完整、技术栈主流、附带源码和论文的“企业人事管理系统”无疑是一个绝佳的选择。但问题来了:网上开源项目众多,为什么这个基于SpringBo…

2026/10/14 1:14:39 阅读更多 →

最新新闻

Loop:macOS 窗口管理工具功能全解

Loop:macOS 窗口管理工具功能全解

Loop:macOS 窗口管理工具功能全解 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 屏幕里同时堆着编辑器、终端和浏览器,想把其中一个窗口拖进左半屏,还得对准缝隙&am…

2026/10/14 8:15:52 阅读更多 →
二分查找在魔法染色问题中的应用与实现

二分查找在魔法染色问题中的应用与实现

1. 项目背景与核心思路"小苯的魔法染色"这个题目一看就是典型的二分查找算法应用场景。作为一名经常刷题的算法爱好者,我第一眼就被这个充满想象力的题目吸引了。题目中的"魔法染色"暗示着某种具有特殊性质的染色问题,而前缀"二…

2026/10/14 8:15:52 阅读更多 →
1秒初筛8份漏洞报告:Jev批量引擎与代码智能体判断力沉淀

1秒初筛8份漏洞报告:Jev批量引擎与代码智能体判断力沉淀

1. 从一份漏洞报告说起:为什么“初筛”才是安全流程里最要命的一环做安全运营的人都有一个共同的痛:漏洞报告不是太少,而是太多。多到什么程度?一个中等规模的产品线,每周从扫描器、外部提交、内部巡检、第三方组件通告…

2026/10/14 8:15:52 阅读更多 →
超帧结构解析:多传感器融合SLAM与实时稠密重建的关键架构

超帧结构解析:多传感器融合SLAM与实时稠密重建的关键架构

直接聊结论:如果你在 2020 年之后关注过实时稠密重建、视觉惯性导航或者多传感器融合 SLAM,hyperframes这个结构几乎绕不开。我在实际项目里用它做过室内全场景扫描,也把它拆开改过、对比过别的方案,可以说这是一个“概念极其简单…

2026/10/14 8:15:52 阅读更多 →
感觉流编程复刻专业软件:AI生成代码的工程实践与边界

感觉流编程复刻专业软件:AI生成代码的工程实践与边界

1. 当“感觉流”编程撞上专业软件:一场关于复刻的认知重构最近圈子里聊得最多的一件事,就是有人用“感觉流编程”的方式,把那些我们以为只有大厂才能做出来的专业软件,硬生生给复刻了出来。所谓感觉流编程,说白了就是不…

2026/10/14 8:15:52 阅读更多 →
Cangjie std.collection 集合库全解析:数据结构、迭代器函数与实战示例

Cangjie std.collection 集合库全解析:数据结构、迭代器函数与实战示例

人工智能AI 技能文档开发工具 【免费下载链接】DocAgent 项目地址: https://gitcode.com/Cangjie-SIG/DocAgent 点击查看 免费下载 std.collection 是 Cangjie 标准库中提供常见数据结构高效实现、抽象接口定义以及集合操作通用函数的包。它覆盖了列表、双端队列、…

2026/10/14 8:14:51 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →