更新记录
1.0.1(2026-03-30)
补齐本地打基座包运行失败相关文档
1.0.0(2026-03-30)
1.版本发布
平台兼容性
uni-app(4.54)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | - | - | √ | - | √ | √ | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.22)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
hw-custom-scankit
华为 ScanKit RemoteView(Android)/ HmsCustomScanViewController 持续扫(iOS);底部栏交互对齐业务 ScanFooter(已扫描角标 + 扫描完成)。
产品优先级:以 Android 实现为基准。scanContinuous / closeContinuousScan 与 HWScanOption、各 code 约定在双端一致;观感与底层细节允许与 Android 有差异(见下「Android 与 iOS 功能差异」)。若业务以安卓为准验收,请不要仅凭 iOS 表现反推改公共协议。
本机 HBuilderX 编 UTS Android 若遇 Gradle / scanplus 等问题,见文末 「附录:HBuilderX 本地 UTS Android 编译踩坑与排查全记录」;可复制 utssdk/app-android/local-dev-init.gradle.example 为 init.gradle 使用。
Android 与 iOS 功能差异(以 Android 为准)
| 维度 | Android(基准) | iOS |
|---|---|---|
| 底层能力 | HMS RemoteView + OnResultCallback,取景框为 setBoundingBox(Rect) |
ScanKit HmsCustomScanViewController,cutArea + continuouslyScan,由华为 iOS SDK 绘制取景与相机 |
| 权限 | index.uts 内按需申请 相机 + 存储/媒体读(随系统版本变化) |
仅 相机(AVFoundation);不涉及安卓那套存储权限组合 |
码制名 scanType |
与 HmsScan 整型枚举 一一映射(Kotlin getScanTypeName) |
来自 SDK formatValue 字符串再做归一化,极少数码制可能与安卓字符串不完全一致 |
footerExtraBottomPx |
文档按 Android 像素(px) 理解,与 density 一致 |
按 逻辑点(pt)+ 安全区 叠加,高密度屏上与安卓 可能差几个像素,布局意图一致 |
| 识别区域尺寸 | 240dp 换算为 px 后的 正方形,与 RemoteView 框对齐 | 240pt 量级正方形 + 扣除底栏后的可用高度算中心,与 iOS cutArea 对齐 |
| 常亮 | FLAG_KEEP_SCREEN_ON |
未单独关屏保;依赖系统与页面停留(若需与安卓完全一致可自行在业务层处理) |
| 返回 499 | 系统返回键、onBackPressed |
无安卓同款实体返回键;自定义左上角等同 499;全面屏边缘手势是否触发关闭 以系统对全屏模态为准(当前为全屏 present,一般 不会 随手势关掉页) |
| 成功音「兜底」 | ToneGenerator 短蜂鸣 |
AudioServicesPlaySystemSound,音色与安卓不必相同 |
| 内置扫描线缺省图 | 仅 drawable PNG |
优先 Resources/hw-custom-scankit/hw_copy_scan_line.png,缺失时用 代码渐变条(仅兜底形态可能略不同) |
| 扫描线动画 | ObjectAnimator 精确控时长与反向 |
UIView.animate + autoreverse,单程时长同样限制在 约 0.6~60s |
| 左上角返回样式 | hw_copy_scan_ic_back.xml 矢量 |
系统按钮 + 「‹」字符,可与安卓图标观感不同 |
| 重复打开扫码 | 再 startActivity 行为与机型/栈有关 |
多次 present 前未强制Dismiss旧页时 可能出现栈行为差异;关键路径仍建议业务侧先 closeContinuousScan |
一致部分(双端应对齐测试):code 0 / 498 / 499 / 497 / 401 的语义;498 / 499 不关页、只有 497 + closeContinuousScan 关页;results JSON 结构;minSuccessCallbackIntervalMs 全局节流(抑制时同样不写列表、不音效、不震动);scanLineLocalPath / scanLineImageUrl 优先级;底栏与完成按钮、角标累计逻辑。
关闭行为(重要)
- 用户点 左上角返回、系统返回键、或底部 「扫描完成」:不会关闭相机页,只会在回调里收到 499 或 498,并附带当前已累计的
results列表。 - 只有在你调用
closeContinuousScan()时才会关闭扫码界面;关闭前会再回调 497,同样附带当时的results。 - 业务收到 498 / 499 后若要退出页面或
navigateBack,请先按需处理列表数据,再调closeContinuousScan()。
静态资源目录(Android / iOS 互不影响)
| 用途 | Android | iOS(UTS 默认 Resources,与系统说明一致) |
|---|---|---|
成功提示音 useBundledSuccessSound |
utssdk/app-android/res/raw/scan_success,扩展名可为 .wav / .mp3 等,资源名保持 scan_success |
utssdk/app-ios/Resources/hw-custom-scankit/scan_success,优先尝试 .mp3 → .wav → .m4a → .caf |
| 默认扫描线图(无本地/网络图时) | utssdk/app-android/res/drawable/hw_copy_scan_line.png |
utssdk/app-ios/Resources/hw-custom-scankit/hw_copy_scan_line.png(缺省时 iOS 仍可用代码生成的渐变条带) |
| 返回箭头矢量(仅 Android) | utssdk/app-android/res/drawable/hw_copy_scan_ic_back.xml |
— |
回调对象公共字段
| 字段 | 类型 | 含义 |
|---|---|---|
code |
number | 事件类型,见下表「各 code 返回参数字段说明」 |
msg |
string | 短文说明(便于日志);业务逻辑请以 code 为准,不要强依赖 msg 文案 |
data |
object | null | 单条结果 { scanType, originalValue },仅 code === 0 时有值 |
results |
array | null | { scanType, originalValue }[],仅 code 为 498 / 499 / 497 时有值(可能为空数组 []) |
scanType:插件内映射的码制英文名(如 QR_CODE、CODE128_CODE 等)。originalValue:扫码得到的原始字符串。同一条码多次识别会产生多条记录,去重请在业务侧处理。
各 code 返回参数字段说明
以下为 complete(res) 里 res 在各 code 下的约定(未列出的字段在该 code 下恒为 null)。
| code | 触发时机 | msg(当前实现典型值,仅供参考) |
data |
results |
扫码页是否关闭 |
|---|---|---|---|---|---|
| 0 | 识别到一条有效码(可多次触发) | success |
本条 { scanType, originalValue } |
null |
否 |
| 498 | 用户点击底部「扫描完成」 | scan finished |
null |
截止此时的全部已扫记录(有序) | 否 |
| 499 | 用户点左上角返回、或系统返回键 | user cancelled |
null |
截止此时的全部已扫记录(有序) | 否 |
| 497 | 业务调用 closeContinuousScan(),即将关闭原生页 |
dismissed by closeContinuousScan |
null |
关页前的全部已扫记录(有序) | 是(随后关闭) |
| 401 | 相机等权限未通过(用户拒绝等) | permission not granted |
null |
null |
未拉起扫码页 |
| -1 | 未实现平台或内部失败(Web 等) | 如 不支持 Web |
null |
null |
未拉起扫码页 |
说明:
- 498 / 499:仅收到事件与列表,不会自动关相机;需要你再调
closeContinuousScan()才会关页并再收到 497。 - 497:回调顺序是先
complete(497),再销毁原生 Activity;可在该分支里做页面跳转或清状态。 - 0 与 498 / 499 / 497 的「条数」:多次 0 累加进列表后,在 498 / 499 / 497 里的
results与列表一致;若尚未扫到任何码就点完成或返回,results为[]。
传入参数一览
与 utssdk/interface.uts 中 HWScanOption 一致,便于 IDE 悬停查看;摘要如下:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| titleType | number | — | 预留,暂无效果 |
| showFooter | boolean | true | 是否显示底部栏;false 时取景全屏 |
| footerRespectSafeArea | boolean | true | 底部栏是否避开系统导航区 |
| footerExtraBottomPx | number | 0 | 安全区之上再加的底边留白(Android 像素,非 rpx) |
| finishButtonText | string | 扫描完成 | 完成按钮文案 |
| footerBackgroundColor | string | #2c2c2c | 底部栏背景 #RRGGBB / #AARRGGBB |
| finishButtonColor | string | #1C86EE | 完成按钮背景色 |
| finishButtonTextColor | string | #FFFFFF | 完成按钮文字色 |
| footerLabelColor | string | #FFFFFF | 底部左侧说明文字色 |
| footerScanLabel | string | 已扫描 | 底部左侧文案,'' 可隐藏 |
| badgeBackgroundColor | string | #ff0000 | 已扫数量角标背景 |
| badgeTextColor | string | #FFFFFF | 角标文字色 |
| hapticOnSuccess | boolean | true | 识别成功是否短震动 |
| soundOnSuccess | boolean | true | 识别成功是否提示音 |
| useBundledSuccessSound | boolean | true | true 优先播本插件打包资源(见下文「静态资源目录」),否则系统短提示音 |
| closeShowBackIcon | boolean | true | 左上角是否显示返回箭头 |
| closeButtonText | string | '' | 返回区附加文案 |
| closeButtonColor | string | #FFFFFF | 返回箭头与返回文案颜色 |
| scanLineEnabled | boolean | false | 传 true 才显示扫描线动画;默认不开启 |
| scanLineLocalPath | string | '' | 本地绝对路径,优先于网络(推荐 uni.downloadFile 的 tempFilePath) |
| scanLineImageUrl | string | '' | http(s) 网络图片;本地与网络都空则用内置 res/drawable/hw_copy_scan_line.png |
| scanLineDurationSec | number | 3 | 扫描线单程平移时间(秒),往返循环;原生限制约 0.6~60 |
| minSuccessCallbackIntervalMs | number | 0 | 两次 code=0 的全局最短间隔(毫秒),与扫到的内容是否相同无关;0 不限制;最大约 60000 |
被节流 抑制 的识别:不会震动/音效、不会角标+1、不会写入 results 列表。
扫描线动画(Android / iOS)
总开关:必须 scanLineEnabled: true,否则不显示扫描线(不传或为 false 时无叠加层)。
效果说明
- 在 ScanKit 取景框矩形 内叠加一张横向拉伸的图,沿框高方向 单程平移,到顶后再 往返(
ObjectAnimator+REVERSE),与常见「一道激光线」效果一致。 scanLineDurationSec:单程耗时(秒),原生侧约限制在 0.6~60;数值越大线移动越慢。
图片来源与优先级(重要)
三者只能生效一套,按顺序判断(本地路径优先于网络):
| 顺序 | 条件 | 行为 |
|---|---|---|
| 1 | scanLineLocalPath 去空格后非空 |
按 本地文件 解码为位图;成功则用该图,失败则 回退内置图 |
| 2 | 否则 scanLineImageUrl 非空 |
先 立即 用内置图开启动画,同时在 后台线程 下载 URL;下载解码成功则 替换 为网络图并重新开动画;失败则 一直用内置图 |
| 3 | 否则 | Android:res/drawable/hw_copy_scan_line.png;iOS:app-ios/Resources/hw-custom-scankit/hw_copy_scan_line.png,若无则程序化渐变 |
同时传 本地路径 与 网络 URL 时:只用本地;网络 URL 会被忽略。
本地图片 scanLineLocalPath
- 含义:设备上可读的 绝对路径 字符串(插件内用
File+BitmapFactory.decodeFile)。 - 推荐用法:先
uni.downloadFile(或你们自己的下载逻辑),再取返回的tempFilePath(或等价本地路径)传给scanLineLocalPath,与scanContinuous同一次调用传入(无需等下载完成再第二次拉起,只要在调用前路径已存在即可)。 - 路径格式:可直接
/storage/emulated/0/...;若为file:///...,原生会尝试解析出 path 再读文件。 - 权限:文件须当前应用可读(应用私有目录、
downloadFile临时路径一般无额外存储权限问题;读公共目录需自行满足系统存储权限)。 - 格式:常见 PNG / JPEG 等
BitmapFactory支持的格式;建议 横向条带状 PNG,与设计稿一致即可(显示为FIT_XY,宽度铺满取景框,条带高度约为框高约 12%)。 - 失败:文件不存在、不可读或解码失败 → 自动使用内置扫描线图,动画仍会有。
网络图片 scanLineImageUrl
- 含义:完整 http:// 或 https:// 图片地址;原生
HttpURLConnection下载(连接超时约 10s、读超时约 15s,跟随重定向)。 - 权限:插件
AndroidManifest已声明INTERNET;云打包合并后即可访问网络。 - HTTP 明文:若使用
http://,可能被系统 禁止明文流量,需在主应用networkSecurityConfig/usesCleartextTraffic等自行放行;生产环境建议 HTTPS。 - 体验说明:网络较慢时,会先看到 内置图 动画,下载完成后再 切换 为网络图(可能有一次视觉切换)。
- 失败:超时、非图片、解码失败等 → 保持内置图,不中断扫码。
示例:内置图(仅开启动画)
scanContinuous({
scanLineEnabled: true,
scanLineDurationSec: 3,
}, onResult)
示例:网络图
scanContinuous({
scanLineEnabled: true,
scanLineImageUrl: 'https://example.com/static/scan-line.png',
scanLineDurationSec: 3,
}, onResult)
示例:先下载再本地路径(推荐替代明文 HTTP / 需鉴权头时)
uni.downloadFile({
url: 'https://example.com/static/scan-line.png',
success: (ret) => {
if (ret.statusCode === 200 && ret.tempFilePath) {
scanContinuous({
scanLineEnabled: true,
scanLineLocalPath: ret.tempFilePath,
scanLineDurationSec: 3,
}, onResult)
}
},
})
(若下载失败,可降级为不传 scanLineLocalPath、只传 scanLineImageUrl,或仅用内置图。)
给前端同学:常见场景
| 场景 | 建议 |
|---|---|
| 只要相机铺满 | showFooter: false;结束必须 closeContinuousScan() |
| 底栏再抬高 | footerRespectSafeArea: true + 调 footerExtraBottomPx(先试 8、16、24 或 uni.upx2px) |
| 扫一条就立刻退出 | code === 0 里校验通过后 closeContinuousScan() |
| 连续扫多条再提交 | 多次 0;点完成收 498 时拿 res.results;最后 closeContinuousScan() |
| 静音 / 不震 | soundOnSuccess: false、hapticOnSuccess: false |
| 包内「嘀」一声 | soundOnSuccess: true + useBundledSuccessSound: true |
| 要扫描线动画 | scanLineEnabled: true(默认关闭;可选 scanLineLocalPath / scanLineImageUrl) |
| 控制成功回调太密 | minSuccessCallbackIntervalMs: 200(任意码两次上报至少隔 200ms) |
footerExtraBottomPx 为 Android 像素,与 rpx 不同。closeContinuousScan() 关的是原生扫码 Activity,不是 uni.navigateBack。
回调推荐顺序
scanContinuous({ /* ... */ }, (res) => {
if (res.code === 401) {
// data/results 均为 null;引导用户开权限
return
}
if (res.code === -1) {
// data/results 均为 null;非 Android 或未实现
return
}
if (res.code === 0 && res.data) {
// 仅此分支有 res.data;res.results 为 null
return
}
if (res.code === 498 || res.code === 499) {
// res.results 为数组(可能 []);不关页
return
}
if (res.code === 497) {
// res.results 为数组;随后原生页关闭
return
}
})
选项示例
import { scanContinuous, closeContinuousScan } from '@/uni_modules/hw-custom-scankit'
scanContinuous({
closeShowBackIcon: true,
closeButtonText: '',
closeButtonColor: '#FFFFFF',
finishButtonText: '扫描完成',
footerBackgroundColor: '#2c2c2c',
finishButtonColor: '#1C86EE',
finishButtonTextColor: '#FFFFFF',
footerLabelColor: '#FFFFFF',
footerScanLabel: '已扫描',
badgeBackgroundColor: '#ff0000',
badgeTextColor: '#FFFFFF',
hapticOnSuccess: true,
soundOnSuccess: true,
useBundledSuccessSound: true,
// 扫描线(可选,见上文「扫描线动画」)
// scanLineEnabled: true,
// scanLineLocalPath: '',
// scanLineImageUrl: '',
// scanLineDurationSec: 3,
}, (res) => { /* ... */ })
closeContinuousScan()
报错「回调函数已释放,不能再次执行」
需 HBuilderX 4.27+,插件已对 scanContinuous 使用 @UTSJS.keepAlive。详见 UTS keepAlive。
附录:HBuilderX 本地 UTS Android 编译踩坑与排查全记录
下文记录本插件在 补充 iOS 实现后,本机 Android 侧 UTS 编译陆续出现的问题、判断思路与最终可行方案,便于团队复现与自查。云打包/自定义基座若正常,仅本地失败,多半属于 Gradle 环境,与 scankit.kt 业务代码无矛盾。
A. 背景:为什么在「增加 iOS」之后才频繁报错?
hw-custom-scankit是 UTS 插件:修改utssdk/app-ios、调整package.json等,会让 HBuilderX 认为 整模块有变更,从而 对 Android 端utssdk/app-android也重新走一遍本地 UTS → Gradle 流程。- 此前若很少本地编 Android,或未清空插件缓存,问题可能被「盖住」;全量重编后环境问题会一次性暴露。
- 结论:不是说 iOS Swift 与 Kotlin「冲突」,而是 触发了完整的本机 Android 编译链,对 Gradle 版本、临时工程目录、Maven 仓库 提出了要求。
B. 现象一:gradle.bat 不是可执行程序
日志特征:提示某路径下的 gradle.bat 不是可执行程序或找不到。
思路:
- HBuilderX 运行配置里指定的 Gradle 安装目录 必须真实存在,且
bin\gradle.bat可执行。 - 路径中尽量少用异常字符;安装 Gradle 后可用 CMD 执行:
"D:\你的路径\gradle-x.x\bin\gradle.bat" -v
确认能输出 Gradle 版本。
注意:这与后面「scanplus 找不到」是 不同阶段 的问题——Gradle 都起不来时,优先修这一项。
C. 现象二:Configuring project ':app' without an existing directory is not allowed
日志特征:失败路径类似
%AppData%\Roaming\HBuilder X\.uts-development-android\gradle\hw-custom-scankit_<时间戳>\app
不存在、不可写或非目录。
思路:
- Gradle 9 起,对
settings/include ':app'等行为变严:被包含工程的目录在配置阶段就必须已存在;而 HBuilderX 为 UTS 生成的流程往往是 先拉起 Gradle / 再解压或生成子工程,与 Gradle 9 的假设 容易冲突。 - 以管理员身份运行 HBuilderX 通常 解决不了 这一类错误——根因是 Gradle 大版本行为,不是单纯权限。
处理:
- 在运行配置中使用 Gradle 8.x(实践常用 8.14.x 等与 HBuilderX 文档接近的版本),避免 Gradle 9.x 作为本机 UTS 开发用的 Gradle。
- Gradle 8.x 官方下载:Gradle Releases — 8.14.4(Gradle 官方发布页;同一 Releases 列表亦可选用其它 8.x 补丁版本)。下载 binary-only 或 complete ZIP,解压到本机目录后,在 HBuilderX 运行配置中指向
…\gradle-8.14.4\bin\gradle.bat(版本号与文件夹名以实际为准)。 - 清理损坏的临时目录(见下文 H. 操作清单)后重试。
D. 现象三:找不到名称 "huawei" / UTS 提示参考 compiler-known-issues error18
日志特征:指向 scankit.kt 里 import com.huawei.hms... 一行,UTS 报 找不到 huawei。
思路:
- 本质是 本地编译时 classpath 上没有 HMS 依赖,编译器把
com.huawei...未解析,有时错误信息显示在huawei片段上。 - DCloud 文档 compiler-known-issues error18 说明:含 三方依赖 的 UTS 插件需 配置好本机 Android/Gradle 运行环境;与 云打包机已预置仓库 不同。
处理:
- 先保证 Gradle 可运行(见 B),再保证 能拉到华为依赖(见 E、G)。Gradle 能把
scanplus解析下来后,这类「找不到名称」通常会消失。
E. 现象四:Could not find com.huawei.hms:scanplus:2.12.0.301
日志特征:
Execution failed for task ':androidDependencies' 或 Could not resolve ... debugCompileClasspath,明确 找不到 scanplus;常伴随一句:
The project declares repositories, effectively ignoring the repositories you have declared in the settings.
思路(重要):
-
依赖本身放在公开仓库
scanplus在https://developer.huawei.com/repo/(官方文档与 UTS 远程仓库说明 均列出华为源)。本插件utssdk/app-android/config.json中声明的
com.huawei.hms:scanplus:2.12.0.301
与hw-scankit等插件一致,版本在云打包环境可用;本机失败 不是 coordinates 写错,而是 Gradle 没去华为仓解析。 -
Gradle 8+ 的「仓库到底听谁的」
- 工程可能同时使用
settings.gradle里的dependencyResolutionManagement与各子工程build.gradle里的repositories {}。 - 日志里 「project 声明了 repositories,从而忽略 settings 里的」 意味着:实际参与某配置解析的很可能是子工程自己的
repositories,而 HBuilderX 生成的默认列表里 往往只有google/mavenCentral等,没有developer.huawei.com/repo。 - 因此:只改
settings或只在projectsLoaded里给allprojects加仓库,在部分工程结构下 仍不够——这就是第一次只写「弱版」init.gradle时 依然 Could not find 的原因。
- 工程可能同时使用
-
网络
公司代理或防火墙拦截 华为域名 时,同样会表现为找不到 artifact;可浏览器访问
https://developer.huawei.com/repo/
做粗测;必要时配置代理或使用repo.huaweicloud.com镜像作补充(见 G)。
F. 云打包 vs 本机:为何「云上能过、本地不过」?
| 环节 | 云打包机(DCloud 文档描述) | 本机 HBuilderX UTS 临时工程 |
|---|---|---|
| 远程仓库 | 已合并 google / mavenCentral / 华为 / jitpack 等 | 仅生成脚本里写明的仓库,常缺华为 |
| HMS AAR | 能拉到 scanplus、agconnect 相关构件 |
未注入华为源时 解析失败 |
| Gradle 版本 | 与打包服务固定组合 | 由开发者本机「运行配置」决定, Gradle 9 易触发 app 目录问题 |
G. 最终方案:init.gradle 三处挂钩 + 双路径备份
原则:在 不修改 HBuilderX 内部生成脚本 的前提下,用用户级 init.gradle 在 尽量早、尽量全 的环节把华为 Maven 写进仓库列表。
推荐内容(与仓库内示例文件一致,便于同步):
- 本仓库示例路径:
utssdk/app-android/local-dev-init.gradle.example
复制为当前机器上的init.gradle(内容逐字一致即可)。
逻辑说明:
-
gradle.beforeSettings
对settings.dependencyResolutionManagement.repositories { ... }注入华为与华为云镜像,覆盖 「统一在 settings 里声明依赖解析」 的工程。 -
gradle.beforeProject
对每个即将配置的工程,向buildscript.repositories与repositories注入同样两个地址,覆盖 「实际以子工程 build.gradle 为准」 的解析路径(与 E.2 日志现象对应)。 -
gradle.projectsLoaded+rootProject.allprojects
作为 兜底,再次对全部子工程注入,避免遗漏。
放置位置(务必读):
| 路径 | 说明 |
|---|---|
%USERPROFILE%\.gradle\init.gradle |
默认 Gradle 用户目录,多数本机构建会读。 |
%AppData%\Roaming\HBuilder X\.gradle\init.gradle |
若 HBuilderX 或运行配置将 GRADLE_USER_HOME 指到 Roaming 下 独立 .gradle,则 仅用户目录下那一份可能不会生效;建议在 此处再放一份相同文件(与实践一致)。 |
编辑 init.gradle 时务必核对域名:须为 developer.huawei.com,避免出现拼写错误(如 huawaii)导致仍解析失败。
H. 每次调整 Gradle / init.gradle 后的推荐操作清单
- 保存
init.gradle(上述一处或两处)。 - 完全退出 HBuilderX 再启动(避免进程占用旧缓存)。
- 删除 UTS Android 临时缓存(让脚手架按新环境重建):
%AppData%\Roaming\HBuilder X\.uts-development-android
整个目录删除即可。 - 重新对
hw-custom-scankit执行 运行 / 编译 Android。 - 若仍失败:用 CMD 执行
"<你的gradle>\bin\gradle.bat" help -g "%USERPROFILE%\.gradle"
观察是否有 init script 相关加载失败;并检查环境变量GRADLE_USER_HOME是否指向其它目录——若是,在该目录下也放置init.gradle。
I. 参考链接(官方)
- Gradle 8.x 发行包下载:8.14.4 直达锚点 · 全部版本列表
- UTS Android 与远程仓库说明:
https://doc.dcloud.net.cn/uni-app-x/plugin/uts-for-android.html - UTS 编译已知问题(含 error18 / Unresolved reference):
https://doc.dcloud.net.cn/uni-app-x/uts/compiler-known-issues.html#error18 - Gradle 声明仓库(理解 project vs settings 提示):
https://docs.gradle.org/current/userguide/declaring_repositories.html
J. 小结(给维护者的一句话)
Gradle 9 不要用在本机 UTS 插件开发;scanplus 必须能从华为(及可选华为云镜像)Maven 拉到;单点 projectsLoaded 注入仓库不可靠,需 beforeSettings + beforeProject + projectsLoaded;init.gradle 可能要放两套路径;改完清 .uts-development-android。
基座
需 HMS + 自定义调试基座。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 85
赞赏 0
下载 11697387
赞赏 1898
赞赏
京公网安备:11010802035340号