来瓶快乐水
来瓶快乐水
  • 发布:2026-08-12 09:31
  • 更新:2026-08-12 10:06
  • 阅读:65

自定义基座进行调试页面正常,在进行云打包后,页面缺失,对比时发现云打包的apk安装后缺少www内容

分类:uni-app

程序在云制作的自定义基座调试完成后,通过云生成发行包,发行包安装后缺少页面内容,通过对比文件发现是安装后的目录下缺少www文件夹

详细情况见附件

package.json如下

{  
  "name": "zhi-hui-board-pro",  
  "version": "2.0.0",  
  "description": "绘王Ink Android 客户端",  
  "scripts": {  
    "dev:h5": "cross-env UNI_INPUT_DIR=. uni",  
    "dev:h5:mock": "concurrently -k -n MOCK,H5 -c yellow,cyan \"npm:mock:start\" \"npm:dev:h5\"",  
    "build:h5": "cross-env UNI_INPUT_DIR=. uni build",  
    "dev:android": "cross-env UNI_INPUT_DIR=. uni -p app",  
    "build:android": "cross-env UNI_INPUT_DIR=. uni build -p app",  
    "check:native": "node scripts/check-native-deps.mjs",  
    "android:sync-host": "powershell -NoProfile -ExecutionPolicy Bypass -File scripts/sync_android_host.ps1",  
    "android:prepare-host": "npm run check:native && npm run build:android && npm run android:sync-host",  
    "mock:start": "python -u mock_server/server.py",  
    "mock:test": "python scripts/test_mock.py",  
    "test:online-library": "node --experimental-default-type=module scripts/test-online-library.mjs",  
    "test:community-market": "node --experimental-default-type=module scripts/test-community-market.mjs",  
    "design:crop": "python scripts/crop_design_pages.py --write",  
    "design:render": "node scripts/render-design-pages.mjs --write",  
    "design:check": "python scripts/crop_design_pages.py --check && node scripts/render-design-pages.mjs --check",  
    "check": "node scripts/check-project.mjs && npm run test:online-library && npm run test:community-market && npm run design:check && node scripts/audit-prototype.mjs && node scripts/test-qr.mjs && node scripts/test-storage.mjs"  
  },  
  "dependencies": {  
    "@dcloudio/uni-app": "3.0.0-alpha-5020120260710001",  
    "@dcloudio/uni-app-plus": "3.0.0-alpha-5020120260710001",  
    "@dcloudio/uni-components": "3.0.0-alpha-5020120260710001",  
    "@dcloudio/uni-h5": "3.0.0-alpha-5020120260710001",  
    "ag-psd": "31.0.2",  
    "epubjs": "^0.3.93",  
    "pinia": "2.1.7",  
    "uview-plus": "3.8.55",  
    "vue": "3.4.21",  
    "vue-i18n": "9.14.5"  
  },  
  "devDependencies": {  
    "@dcloudio/types": "3.4.31",  
    "@dcloudio/uni-cli-shared": "3.0.0-alpha-5020120260710001",  
    "@dcloudio/uni-stacktracey": "3.0.0-alpha-5020120260710001",  
    "@dcloudio/vite-plugin-uni": "3.0.0-alpha-5020120260710001",  
    "concurrently": "9.2.4",  
    "cross-env": "7.0.3",  
    "pixelmatch": "^7.1.0",  
    "playwright-core": "^1.52.0",  
    "pngjs": "^7.0.0",  
    "rollup": "4.62.2",  
    "sass": "1.63.2",  
    "vite": "5.2.8"  
  },  
  "overrides": {  
    "@intlify/core-base": "9.14.5",  
    "@intlify/message-compiler": "9.14.5",  
    "@intlify/message-resolver": "9.14.5",  
    "@intlify/runtime": "9.14.5",  
    "@intlify/vue-devtools": "9.14.5",  
    "esbuild": "0.25.12",  
    "express": "4.22.2",  
    "postcss": "8.5.19"  
  }  
}  

vite.config.js如下:

/**  
 * ============================================================  
 * uni-app CLI 构建配置  
 * ============================================================  
 * ag-psd 的 pako 与 epubjs 的 jszip 内嵌源码包含 C 语言 #ifdef 文本,uni 条件编译器会误判。  
 * 在依赖进入 uni 插件前仅清理注释标记,不修改 node_modules 或运行时代码。  
 */  
import { defineConfig } from "vite";  
import uni from "@dcloudio/vite-plugin-uni";  
import { existsSync, readFileSync } from "node:fs";  
import { fileURLToPath, URL } from "node:url";  

function isConditionSensitiveDependency(id) {  
  const normalizedId = id.replaceAll("\\", "/");  
  return (  
    normalizedId.includes("/node_modules/pako/") ||  
    normalizedId.includes("/node_modules/ag-psd/") ||  
    normalizedId.includes("/node_modules/jszip/")  
  );  
}  

function sanitizeConditionComments(code) {  
  return code  
    .replaceAll("#ifdef", "ifdef")  
    .replaceAll("#ifndef", "ifndef")  
    .replaceAll("#endif", "endif");  
}  

const sanitizeDependencyConditionComments = {  
  name: "sanitize-dependency-condition-comments",  
  enforce: "pre",  
  load(id) {  
    if (!isConditionSensitiveDependency(id)) return null;  
    // 5.21 的 uni 条件编译发生在依赖 transform 之前,必须在 load 阶段返回已清理源码。  
    const filename = id.split("?")[0];  
    if (!filename.endsWith(".js") || !existsSync(filename)) return null;  
    return sanitizeConditionComments(readFileSync(filename, "utf8"));  
  },  
  transform(code, id) {  
    if (!isConditionSensitiveDependency(id)) return null;  
    return sanitizeConditionComments(code);  
  },  
};  

export default defineConfig({  
  plugins: [sanitizeDependencyConditionComments, uni()],  
  commonjsOptions: {  
    include: [/node_modules/],  
  },  
  resolve: {  
    // pako 源码中的 C 预处理注释会被 uni-app 误判;官方 minified 构建不含这些标记。  
    alias: {  
      pako: fileURLToPath(  
        new URL("./node_modules/pako/dist/pako.min.js", import.meta.url)  
      ),  
    },  
  },  
  server: {  
    host: "0.0.0.0",  
  },  
});  

此为dist/build/app目录结构

npm run build:android日志:

D:\zhang\workDir\red-device-app>npm run build:android

zhi-hui-board-pro@2.0.0 build:android
cross-env UNI_INPUT_DIR=. uni build -p app

编译器版本:5.21(vue3)
正在编译中...

uni-app 有新版本发布,请执行 npx @dcloudio/uvm@latest alpha 更新,更新日志详见:https://download1.dcloud.net.cn/hbuilderx/changelog/5.23.2026080313-alpha.html
DONE Build complete.
运行方式:打开 HBuilderX, 导入 dist\build\app 运行。
云打包日志:

[HBuilder] 09:55:07.387 项目 red-device-app [UNI93903A7]的打包状态:
[HBuilder] 09:55:07.387 时间: 2026-08-12 09:54:47 类型: Android自有证书 队列中
[HBuilder] 09:55:07.387 目前云打包排队人数较多,当前打包任务位于队列第 2 位,预计 1 分钟内进入打包状态。
[HBuilder] 09:55:07.891
[HBuilder] 09:55:07.891 项目 red-device-app [UNI93903A7]的打包状态:
[HBuilder] 09:55:07.891 时间: 2026-08-12 09:54:47 类型: Android自有证书 正在云端打包
[HBuilder] 09:55:07.891 当前项目使用了原生插件,如果原生插件依赖了三方库且三方库需要联网下载,可能会消耗较长时间,预计 3-30 分钟完成打包,请耐心等待。
[HBuilder] 09:56:07.471
[HBuilder] 09:56:07.471 项目 red-device-app [UNI93903A7]的打包状态:
[HBuilder] 09:56:07.471 时间: 2026-08-12 09:54:47 类型: Android自有证书 正在云端打包
[HBuilder] 09:56:07.471 当前项目使用了原生插件,如果原生插件依赖了三方库且三方库需要联网下载,可能会消耗较长时间,预计 3-30 分钟完成打包,请耐心等待。
[HBuilder] 09:57:07.210
[HBuilder] 09:57:07.210 项目 red-device-app [UNI93903A7]打包成功:
[HBuilder] 09:57:07.210
[HBuilder] 09:57:07.210 类型: Android自有证书 下载地址: https://app.liuyingyong.cn/build/download/cbed5d30-95f0-11f1-b4d8-875cd4c07415 (注意该地址为临时下载地址,只能下载5次) [一键上传到uniCloud(更优惠的cdn、长期稳定)]

2026-08-12 09:31 负责人:无 分享
已邀请:
来瓶快乐水

来瓶快乐水 (作者)

此为dist/build/app目录结构

npm run build:android日志:

D:\zhang\workDir\red-device-app>npm run build:android  

> zhi-hui-board-pro@2.0.0 build:android  
> cross-env UNI_INPUT_DIR=. uni build -p app  

编译器版本:5.21(vue3)  
正在编译中...  

uni-app 有新版本发布,请执行 `npx @dcloudio/uvm@latest alpha` 更新,更新日志详见:https://download1.dcloud.net.cn/hbuilderx/changelog/5.23.2026080313-alpha.html  
DONE  Build complete.  
运行方式:打开 HBuilderX, 导入 dist\build\app 运行。

云打包日志:

[HBuilder] 09:55:07.387 项目 red-device-app [__UNI__93903A7]的打包状态:  
[HBuilder] 09:55:07.387 时间: 2026-08-12 09:54:47    类型: Android自有证书    队列中      
[HBuilder] 09:55:07.387 目前云打包排队人数较多,当前打包任务位于队列第 2 位,预计 1 分钟内进入打包状态。  
[HBuilder] 09:55:07.891   
[HBuilder] 09:55:07.891 项目 red-device-app [__UNI__93903A7]的打包状态:  
[HBuilder] 09:55:07.891 时间: 2026-08-12 09:54:47    类型: Android自有证书    正在云端打包      
[HBuilder] 09:55:07.891 当前项目使用了原生插件,如果原生插件依赖了三方库且三方库需要联网下载,可能会消耗较长时间,预计 3-30 分钟完成打包,请耐心等待。  
[HBuilder] 09:56:07.471   
[HBuilder] 09:56:07.471 项目 red-device-app [__UNI__93903A7]的打包状态:  
[HBuilder] 09:56:07.471 时间: 2026-08-12 09:54:47    类型: Android自有证书    正在云端打包      
[HBuilder] 09:56:07.471 当前项目使用了原生插件,如果原生插件依赖了三方库且三方库需要联网下载,可能会消耗较长时间,预计 3-30 分钟完成打包,请耐心等待。  
[HBuilder] 09:57:07.210   
[HBuilder] 09:57:07.210 项目 red-device-app [__UNI__93903A7]打包成功:  
[HBuilder] 09:57:07.210   
[HBuilder] 09:57:07.210 类型: Android自有证书 下载地址: https://app.liuyingyong.cn/build/download/cbed5d30-95f0-11f1-b4d8-875cd4c07415 (注意该地址为临时下载地址,只能下载5次)    [一键上传到uniCloud(更优惠的cdn、长期稳定)]
Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据您描述的现象和提供的工程配置,结合知识库中关于 uni-app Android 平台资源打包与自定义基座的说明,以下是排查思路和解决方案:

核心原因分析

您的项目是基于 uni-app CLI(Vite + Vue3) 构建的,且自定义基座调试正常但云打包后丢失 www 目录,这通常与以下因素有关:

  1. CLI 项目的资源同步机制
    CLI 项目与 HBuilderX 可视化项目不同,云打包前需要确保 dist/build/app 目录已正确生成,并且包含完整的 www 资源。如果云打包流程未正确拾取 CLI 构建产物,或 dcloud_control.xml 中的 appid 与打包配置不一致,会导致 APK 中缺失 www 目录。

  2. Vite 配置干扰资源输出
    vite.config.js 中的 sanitizeDependencyConditionComments 插件使用 enforce: "pre" 拦截了所有依赖的 load 阶段。虽然此配置是为了解决 pako/ag-psd 的编译问题,但如果插件逻辑意外影响了 uni-app 内部资源处理模块(如静态资源拷贝或 www 目录生成逻辑),可能导致构建产物不完整。

  3. 自定义基座与正式包差异
    根据知识库说明,自定义基座(debug=true)与正式包在资源加载路径上存在差异。如果项目使用了动态加载或路径别名,可能在基座环境下能回退到正确路径,但在正式包中因路径解析失败导致资源未被打包。

排查与解决步骤

1. 验证本地构建产物完整性

在提交云打包前,先本地执行构建并检查输出目录:

npm run build:android

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

构建完成后,检查 dist/build/app 目录结构:

  • 确认是否存在 www 文件夹
  • 确认 www 内是否包含您的页面文件(如 pages/xxx/xxx.js)和 static 资源

如果本地构建就缺失 www:说明是 Vite 配置或依赖问题导致构建中断。尝试暂时注释掉 vite.config.js 中的 sanitizeDependencyConditionComments 插件,重新构建验证。

如果本地构建正常但云打包 APK 缺失:说明是云打包配置或资源同步问题,继续下一步。

2. 检查 AppID 一致性

根据知识库中关于 Android 离线打包的说明,appid 不一致会导致资源加载失败:

  • 检查 manifest.json 中的 appid 字段
  • 检查云打包时填写的 appid 是否与 manifest.json 完全一致
  • 检查项目根目录 nativeplugins(如有)或 android 目录下的 dcloud_control.xml 中的 appid 是否匹配

注意:自定义基座使用的 appid 与正式云打包的 appid 必须分别配置正确,不要混用。

3. 规范云打包流程(CLI 项目)

CLI 项目云打包需要特定的资源准备流程:

方案 A:使用 HBuilderX 导入 CLI 项目打包

  1. 在 HBuilderX 中导入 CLI 项目根目录
  2. 确保已执行 npm run build:android 生成最新 dist 目录
  3. 通过 HBuilderX 的"发行 -> 原生 App-云打包"流程打包,HBuilderX 会自动识别 CLI 构建产物

方案 B:检查 package.json 脚本配置
您的 package.jsonandroid:prepare-host 脚本执行顺序为:

"android:prepare-host": "npm run check:native && npm run build:android && npm run android:sync-host"

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
确认 android:sync-host 脚本是否正确将 dist/build/app 中的资源同步到了 Android 宿主工程的 assets/apps/[appid]/www 目录。如果同步脚本有误,会导致原生工程打包时缺少资源。

4. 检查原生插件与权限配置

如果项目集成了原生插件:

  • 确认插件的 package.json 配置正确
  • 确认 manifest.json -> app-plus -> distribute -> plugins 中已声明使用的插件
  • 某些插件可能包含 android 目录下的资源文件,检查是否被正确合并到 assets

5. 对比调试基座与正式包配置

根据知识库,自定义基座会在 dcloud_control.xml 中设置 debug="true"syncDebug="true",而正式包不会。

检查是否有代码依赖了调试基座的特性(如热更新路径、调试服务地址),导致正式包中资源加载路径错误。特别是:

  • 检查代码中是否有 plus.runtime.getProperty 或路径判断逻辑
  • 检查是否使用了 #ifdef APP-PLUS#ifdef DEBUG 混合条件编译

补充建议

关于 vite.config.js 的优化
如果确认是 sanitizeDependencyConditionComments 插件导致的问题,建议限制其作用范围,避免影响 uni-app 内部模块:

// 修改 isConditionSensitiveDependency,排除 uni-app 内部模块  
function isConditionSensitiveDependency(id) {  
  const normalizedId = id.replaceAll("\\", "/");  
  // 排除 uni-app 运行时和编译器内部文件  
  if (normalizedId.includes("/@dcloudio/")) return false;  
  return (  
    normalizedId.includes("/node_modules/pako/") ||  
    normalizedId.includes("/node_modules/ag-psd/") ||  
    normalizedId.includes("/node_modules/jszip/")  
  );  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

关于 www 目录结构
标准的 uni-app Android 资源结构应为:

assets/apps/[appid]/www/  
├── app-config-service.js  
├── app-service.js  
├── app-view.js  
├── pages/...  
├── static/...  
└── manifest.json

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

如果云打包后的 APK 中该目录缺失,通常意味着资源在打包阶段未被正确合并。请重点检查第 2 步(appid 一致性)和第 3 步(CLI 资源同步)。

如按上述步骤排查后问题仍存在,建议提供云打包时的完整日志以及 dist/build/app 目录结构截图,以便进一步定位是构建阶段还是云端打包阶段的问题。

内容为 AI 生成,仅供参考

要回复问题请先登录注册