用DSH帮你构建apk(Use dsh to help you build an APK)
36.1/100
综合分
3
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add memories-coder/DSH-plugin-android-apk该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查⚠ 装前注意未发布到 npm registry,仅可从源码安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包dsh-plugin-android-apk(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/27 09:45:42
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 78 处,展示前 30 条)
- 执行外部命令固定命令lib/build.js:70
spawnSync("taskkill", ["/pid", String(pid), "/T", "/F"], { stdio: "ignore" }); - 执行外部命令来自配置/变量lib/build.js:115
child = spawn(spawnCmd, spawnArgs, options); - 读取本地文件lib/build.js:153
if (existsSync(exe)) { - 执行外部命令来自配置/变量lib/build.js:162
const exe = (spawnSync(process.platform === "win32" ? "where" : "which", ["java"], { encoding: "utf8" }).stdout ?? "") - 读取本地文件lib/build.js:178
if (!existsSync(exe)) return null; - 读取本地文件lib/build.js:189
const entries = await readdir(root, { withFileTypes: true }).catch(() => []); - 读取本地文件lib/build.js:194
if (!existsSync(join(candidate, "bin", JAVA_BIN))) continue; - 写入本地文件lib/build.js:231
await mkdir(jdkRoot, { recursive: true }); - 删除本地文件lib/build.js:258
await rm(zipPath, { force: true }).catch(() => {}); - 读取本地文件lib/build.js:288
const text = await readFile(join(projectDir, "local.properties"), "utf8"); - 读取本地文件lib/build.js:303
for (const entry of await readdir(projectDir, { withFileTypes: true })) { - 写入本地文件lib/build.js:459
await writeFile(propsPath, existing.replace(/ *$/, "") + line); - 写入本地文件lib/build.js:466
await mkdir(licensesDir, { recursive: true }); - 写入本地文件lib/build.js:467
await writeFile(join(licensesDir, "android-sdk-license"), [ - 写入本地文件lib/build.js:473
await writeFile(join(licensesDir, "android-sdk-preview-license"), "84831b9409646a918e30573bab4c9c91346d8abd\n"); - 写入本地文件lib/build.js:484
chmodSync(bin, 0o755); - 删除本地文件lib/build.js:579
await rm(zipPath, { force: true }).catch(() => {}); - 删除本地文件递归lib/build.js:584
await rm(latestDir, { recursive: true, force: true }).catch(() => {}); - 删除本地文件递归lib/build.js:591
await rm(tempExtract, { recursive: true, force: true }).catch(() => {}); - 删除本地文件递归lib/build.js:680
await rm(to, { recursive: true, force: true }).catch(() => {}); - 删除本地文件lib/build.js:739
await rm(zipPath, { force: true }).catch(() => {}); - 写入本地文件lib/download.js:48
await mkdir(dirname(dest), { recursive: true }); - 发起网络请求lib/download.js:49
const res = await fetch(url, { signal, redirect: "follow" }); - 写入本地文件lib/download.js:65
const ws = createWriteStream(dest); - 删除本地文件lib/download.js:135
await rm(dest, { force: true }).catch(() => {}); - 执行外部命令来自配置/变量lib/download.js:144
r = spawnSync(cmd, argv, { stdio: "pipe" }); - 写入本地文件lib/download.js:165
await mkdir(destDir, { recursive: true }); - 发起网络请求lib/download.js:191
const res = await fetch(url, { signal: combined }); - 请求外部主机mirrors.tuna.tsinghua.edu.cnlib/download.js:347
const res = await fetch(`https://mirrors.tuna.tsinghua.edu.cn/Adoptium/${version}/jdk/${arch}/${os}/`, { - 发起网络请求lib/download.js:347
const res = await fetch(`https://mirrors.tuna.tsinghua.edu.cn/Adoptium/${version}/jdk/${arch}/${os}/`, {
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:mirrors.tuna.tsinghua.edu.cn
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-tools@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 构建APK
README
由 DeepSeek 最新模型翻译生成dsh-plugin-android-apk
DeepSeek Harness(DSH)插件:把一个安卓项目文件夹直接构建成 APK。
缺少的工具链(JDK / Android SDK / Gradle)会自动下载到工作文件夹内,不污染用户目录。
更新记录见 CHANGELOG.md。
功能
- 识别 Gradle 安卓工程(settings.gradle / settings.gradle.kts / build.gradle),可选支持 Gradle Wrapper。
- 自动准备工具链:
- JDK:系统 JAVA_HOME/PATH 里有满足要求的 Java(AGP 8 / Gradle 8 需要 ≥17,否则 ≥11,插件会先探测工程里的 AGP 版本)就直接用;否则按当前系统与架构下载对应的 Temurin JDK(Windows/Linux/macOS × x64/aarch64…,Windows 取 .zip、其它取 .tar.gz)到下载文件夹,并复用上次下载的 JDK,不重复下载。若请求的版本在该平台没有官方构建(例如 Temurin 没有 windows/aarch64 的 JDK 17),会自动沿 LTS 阶梯回退到有构建的版本(17 → 21 → 25)并在日志里说明原因。
展开完整文档(README 剩余 1 节)
dsh-plugin-android-apk
DeepSeek Harness(DSH)插件:把一个安卓项目文件夹直接构建成 APK。
缺少的工具链(JDK / Android SDK / Gradle)会自动下载到工作文件夹内,不污染用户目录。
更新记录见 CHANGELOG.md。
功能
- 识别 Gradle 安卓工程(settings.gradle / settings.gradle.kts / build.gradle),可选支持 Gradle Wrapper。
- 自动准备工具链:
- JDK:系统 JAVA_HOME/PATH 里有满足要求的 Java(AGP 8 / Gradle 8 需要 ≥17,否则 ≥11,插件会先探测工程里的 AGP 版本)就直接用;否则按当前系统与架构下载对应的 Temurin JDK(Windows/Linux/macOS × x64/aarch64…,Windows 取 .zip、其它取 .tar.gz)到下载文件夹,并复用上次下载的 JDK,不重复下载。若请求的版本在该平台没有官方构建(例如 Temurin 没有 windows/aarch64 的 JDK 17),会自动沿 LTS 阶梯回退到有构建的版本(17 → 21 → 25)并在日志里说明原因。
- Android SDK:依次检查 local.properties 的 sdk.dir、ANDROID_HOME、ANDROID_SDK_ROOT、%LOCALAPPDATA%\Android\Sdk;都没有则下载 commandline-tools + platform-tools + build-tools + platform 到下载文件夹,并自动写入 local.properties 和接受许可。local.properties 里失效的 sdk.dir(指向已删除的 SDK)会被自动修正。
- Gradle:工程带可用 Wrapper 就用 Wrapper(若 Wrapper 的 Gradle 版本无法在当前 JDK 上运行,例如 Gradle 7.0 配 Java 17,则自动改为下载发行版);否则按 gradle-wrapper.properties 里的版本(或配置的 gradleVersion)下载发行版。
- 运行 assemble<Variant>(默认 debug,可用 release),把产物 APK 复制到输出文件夹。
- 非 ASCII 路径自动处理:当工程或 SDK 目录路径含有非 ASCII 字符(例如中文路径,AAPT2 在 Windows 上会因此无法读取 android.jar)时,自动把工程和 SDK 复制到一个可用的 ASCII 临时目录(%TEMP%\dsh-android-build)里构建,再把 APK 复制回你的输出文件夹。staged SDK 会缓存复用,不重复下载。
- 所有下载、Gradle 发行版、依赖缓存(GRADLE_USER_HOME)都放在插件自己的 toolchain/ 目录(<插件安装目录>/toolchain,可用 downloadDir 覆盖)。放在插件根目录意味着所有会话、所有工程共用同一套工具链——不会每个工作区各留一份几百 MB 的缓存,也不污染用户目录。
安装
在 DSH 宿主机器上(需要 pnpm 在 PATH 上)。把 <插件路径> 换成这个 tarball 在你机器上的实际位置, <profile> 换成你要装的 profile 名:
dsh plugin --profile <profile> add "<插件路径>/dsh-plugin-android-apk-0.2.4.tgz"
<profile> 填什么? 桌面端常见的是 desktop,Web 端常见的是 web,但名字由你自己决定,取决于当前跑的是哪个 profile——填错不会报错,只是"装到另一个 profile 去了",当前会话看不到这个工具。
查看本机有哪些 profile:ls ~/.dsh/profiles(Windows:dir %USERPROFILE%\.dsh\profiles)。
想知道当前会话用的是哪个,可在任务管理器里看 DSH 主进程的命令行,末尾那个路径就是 ...\.dsh\profiles\<名字>。
插件与 profile 无关:cordis.patch.yml 按包名插入一行插件,代码里没有写死任何 profile 名,所以 desktop / web / 自定义 profile 都同样可用。唯一的差别是每个 profile 要各装一次——它属于 profile 级依赖;如果你同时用桌面端和 Web 端(通常就是两个 profile),两边都装才会都出现。
说明:dsh plugin 实际是在 profile 目录里执行 pnpm add <spec>,然后把声明了 dsh.bundle.patch 的包加入 dsh.profile.bundles 层。手动操作等价于:在 ~/.dsh/profiles/<profile> 执行 pnpm add <spec>,再把包名加进 package.json 的 dsh.profile.bundles。
⚠️ 依赖声明为 peerDependencies(0.2.1 起):@deepseek-ai/cordis / @deepseek-ai/dsh-tools / @deepseek-ai/schemastery 由 DSH 宿主提供并做解析拦截,插件不能自己装一份——否则 profile 里的旧副本会遮蔽宿主自己的 tools 行,导致 1 required plugin did not activate、桌面端无法启动。请不要在 profile 里手动
pnpm add 这三个包。
使用
装好后,直接对 Agent 说“把 xxx 文件夹构建成 APK”,或显式调用工具:
build_android_apk(project="myapp", variant="debug", clean=false)
参数:
| 参数 | 说明 | 默认 |
| project | 安卓工程文件夹路径(相对路径基于会话工作目录) | 必填 |
| variant | Gradle 变体(debug / release 等,大小写保留:stagingDebug → assembleStagingDebug) | debug |
| clean | 是否先 clean 全量重建 | false |
| downloadDir | 工具链下载目录(相对路径基于会话工作目录) | <插件目录>/toolchain |
| apkOutputDir | APK 复制目录 | <workspace>/apk |
| gradleVersion | 无可用 Wrapper 时下载的 Gradle 版本 | 8.9 |
| compileSdk | 覆盖自动检测的 compileSdk | 自动检测,未知时 34 |
返回:ok、message、apks[](原始路径 + 复制路径 + 大小 + staged 标记)、logTail、durationMs 等。只返回本次构建产出的 APK(按修改时间过滤,不会把上次的旧包一起报上来)。
插件级配置(cordis.patch.yml 里的 config,可选):
config:
defaultVariant: debug
jdkMajor: 17
gradleVersion: "8.9"
下载与镜像
| 组件 | 默认源 | 回退镜像 |
| JDK (Temurin) | api.adoptium.net | mirrors.tuna.tsinghua.edu.cn/Adoptium |
| Gradle | services.gradle.org | mirrors.cloud.tencent.com/gradle、mirrors.aliyun.com |
| Android cmdline-tools | dl.google.com | mirrors.cloud.tencent.com/AndroidSDK |
网络受限(如国内直连 Google 不稳)时,插件会自动尝试回退镜像;也可以先用代理保证 dl.google.com / services.gradle.org / api.adoptium.net 可达。
下载完整性校验:拿得到上游官方摘要时会逐个比对,不匹配的镜像直接跳过并换下一个——
| 组件 | 校验来源 | 算法 |
| JDK (Temurin) | Adoptium assets API 的 checksum(清华镜像为 <归档>.sha256.txt) | SHA-256 |
| Gradle | <发行版>.sha256(与 zip 同目录) | SHA-256 |
| Android cmdline-tools | Google repository2-.xml 里的 <checksum> | SHA-1 / SHA-256 |
摘要源拿不到(镜像未提供、dl.google.com 不可达)时跳过校验、照常下载,不会阻塞构建;校验通过会在 logTail 里打印 [dl] … checksum verified …。
目录结构
安装包(tarball)内包含:
package/
├── package.json # dsh.bundle.patch 声明(profile 层识别依据) ├── cordis.patch.yml # 插件行:android-apk-builder ├── lib/ │ ├── index.js # Cordis 插件入口 + build_android_apk 工具定义 │ ├── build.js # 构建编排(检测/下载/ASCII staging/assemble/复制 APK) │ └── download.js # 下载/解压/镜像回退/校验助手(仅用 Node 内置模块) └── README.md
仓库里(不随 tarball 发布):
package1/
├── CHANGELOG.md # 每个版本的改动记录(每次发版必更新) ├── RELEASES.txt # 发布台账:维护约定 + 各版本 tgz 的 SHA-256 ├── dsh-plugin-android-apk-<version>.tgz # 历史版本全部保留,不删除 └── test/ ├── <最小 Android 工程> # settings.gradle / app/ …,用于真实构建验证 ├── run-build.mjs # 无头驱动:脱离 DSH 直接跑 buildApk └── progress-throttle.test.mjs # 下载进度与监听器泄漏的回归测试
test/、CHANGELOG.md、RELEASES.txt 与历史 tgz 都随 package.json 的 files 白名单排除,不会打进 tarball;它们只存在于源码仓库。
常见问题
- 构建失败 / 工具没出现:安装后必须重启 DSH;dsh plugin 需要 pnpm 在 PATH。
- 工具报 userRender is not a function / 注册失败 / 输出被拒:DSH 要求每个工具声明 output.render(一个返回 [{ type: "text", text }] 数组的函数)。本插件自 0.2.1 起已内置;若你看到该错误,说明装的是旧版本,升级到 ≥0.2.1。同理 apks[] 的 staged 字段也已在 output.schema 中声明(additionalProperties: false 下缺字段会导致 INVALID_TOOL_OUTPUT)。
- 装完 DSH 起不来(1 required plugin did not activate / tools failed to import):这是 0.2.0 及以前把 @deepseek-ai/ 写成 dependencies 导致的——pnpm 会往 profile 装一份旧的 dsh-tools,遮蔽宿主自己的 tools 行。升级到 ≥0.2.1(已改为 peerDependencies),并删除 profile 里的残留副本 ~/.dsh/profiles/<profile>/node_modules/@deepseek-ai/dsh-tools。
- 工程路径含中文/非 ASCII:插件会自动 staging 到 ASCII 临时目录构建(并给 gradle.properties 加 android.overridePathCheck=true),无需手动处理;staged SDK 会缓存复用,APK 仍复制回你的输出文件夹。
- 依赖下载超时:Gradle 依赖(AGP、AndroidX)从 dl.google.com 拉取,网络不稳时可能超时;插件使用下载文件夹里已缓存的依赖,可先手动 gradle assembleDebug 预热,或配置代理。
- 下载很慢:首次会拉取 JDK(约 180MB)+ cmdline-tools(约 150MB)+ Gradle(约 130MB),后续复用插件 toolchain/ 里的缓存;依赖缓存也在该目录(gradle-user-home)。
- 插件升级后要重新下载工具链:toolchain/ 在插件自己的目录里,而 pnpm 升级插件时会重建该目录,所以升版本会丢掉缓存(约 460MB 需重下)。想让它跨版本存活,就在 cordis.patch.yml 里把 downloadRoot 指到一个固定路径(如 D:/android-toolchain),或用工具参数 downloadDir。
- build-tools 版本不匹配:插件从 sdkmanager --list 里挑与 compileSdk 同大版本的最新 build-tools;可传 compileSdk 覆盖检测结果。
- 老工程需要 JDK 8/11:插件会先探测工程里的 AGP / Gradle 版本来推断所需 JDK(AGP 8、Gradle 8 → 17;否则 11):系统 JDK 满足就直接用,不满足才下载,且下载版本不会低于该要求(jdkMajor 只在需要下载时生效)。需要 JDK 8 的老工程请自行配好 JAVA_HOME(插件最低要求 Java 11)。
- 非 Windows / Linux / Termux 宿主:构建路径已平台化,非 Windows 下 Java 用 java(which 定位)、 sdkmanager 用 sdkmanager 脚本(自动 chmod +x)、Gradle 用 gradlew/gradle,下载按平台取 Adoptium 三元组(Linux/macOS 为 .tar.gz),解压回退链为 unzip → python3 -m zipfile → tar。
社区已在 Termux (aarch64, Android 15) 上端到端跑通:ok: true、产出真实 APK(含 classes.dex / AndroidManifest.xml 等)。注意该实测用的是预装的 JDK 21 + SDK 34.0.4, Linux 上"从零下载 SDK"那条路径未被该次实测覆盖。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
memories-coder/DSH-plugin-android-apk
用DSH帮你构建apk(Use dsh to help you build an APK)
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9