HarmonyOS鸿蒙Next中上架审核出现应用出现崩溃问题
HarmonyOS鸿蒙Next中上架审核出现应用出现崩溃问题 【问题描述】:1.您的应用运行过程中存在稳定性崩溃问题。 测试步骤:Mate 60:应用在运行中存在JsCrash异常的问题,原因:Generated by HiviewDFX@OpenHarmony___at anonymous (entry|entry|1.0.0|src/main/ets/pages/ArDisplayPage.ts:266:21). Mate 80 Pro:AR模块,选择完星球后,点击屏幕应用闪退 测试环境:WIFI、Mate 60、中文,WIFI、Mate 80 Pro、中文 修改建议:请进行优化修复,确保应用可正常使用。 您可参考《应用稳定性体验建议》应用崩溃项:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/experience-suggestions-stability 【上架检测FAQ】 https://developer.huawei.com/consumer/cn/forum/topic/0214198799180841232?fid=0102104600515103427
【问题现象】:

【版本信息】:开发工具版本:6.0.0.858 release、手机系统版本6.0.0.120 SP6、Api语言版本:20
【复现代码】:不涉及
【尝试解决方案】:不涉及
更多关于HarmonyOS鸿蒙Next中上架审核出现应用出现崩溃问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者你好,根据你提供的日志,报错定位有具体代码行数,需要根据您的具体代码进行排查,您可以先按照以下方案自行排查下代码问题,如未能解决请麻烦提供具体代码方便定位分析。
以下是错误信息的定位关键因素,可以参考:
【背景知识】
- JsCrash异常根据不同的异常场景,在Reason字段进行了分类,分为Error、TypeError、SyntaxError、ReferenceError、RangeError等错误类型。
- TypeError(类型错误)类:运行时最常见的异常,表示变量或参数不是预期类型。
【问题定位】
- 从faultlogger目录下获取故障日志。
- 从故障日志中可以获取到故障原因和异常信息。
- 故障原因是TypeError。
- 异常信息是Error message:is not callable。
- 异常信息“undefined is not callable”说明:不支持或者未实现的方法被使用时,会出现“xx is not callable”异常。
【分析结论】
- 异常信息是Error message:is not callable。 变量不是预期的类型,不能调用对应的方法。
【修改建议】
- 异常信息是Error message:is not callable。 检查变量或者this指针是否存在对应的方法。
更多关于HarmonyOS鸿蒙Next中上架审核出现应用出现崩溃问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
建议把这个错误行发出来:ArDisplayPage代码第266行:21
一般崩溃错误就是使用了一个空对象,或者某些api不符合版本要求。
你的这个在审核阶段的情况估计是使用空对象了。
建议你在错误的地方加个空判断。
要解决 AR 模块的 JsCrash 和点击闪退问题,需从代码定位、AR 逻辑规范、错误捕获三方面优化,以下是分步方案:
一、先定位崩溃代码(ArDisplayPage.ts 第 266 行)
首先找到ArDisplayPage.ts第 266 行代码,JsCrash 通常是空对象访问、未定义变量、异步操作未捕获异常导致的,常见场景:
- 场景 1:AR 识别结果未判空就访问属性(比如
result.trackablePlane,但result是undefined); - 场景 2:3D 模型资源路径错误,加载时未处理失败逻辑;
- 场景 3:AR 引擎未初始化完成就调用接口。
二、针对性修复(按常见场景)
场景 1:AR 识别结果未判空(最可能)
如果 266 行是处理 AR 平面识别的代码,比如:
// 原错误代码(未判空)
const plane = result.trackablePlane; // 第266行
this.placeModel(plane);
修复:添加空值判断
// 修复后
if (result && result.trackablePlane) { // 先判断result和目标属性存在
const plane = result.trackablePlane;
this.placeModel(plane);
} else {
console.error("未识别到有效平面,无法放置模型");
}
场景 2:AR 初始化 / 模型加载未捕获异常
AR 模块的异步操作(如引擎初始化、模型加载)未加try-catch,导致异常崩溃:
// 原错误代码(无错误捕获)
async initAR() {
this.arEngine = await ar.createAREngine(); // 若初始化失败直接崩溃
this.loadModel("mercury.glb"); // 模型路径错误也会崩溃
}
修复:添加 try-catch + 资源校验
async initAR() {
try {
// 1. 校验AR引擎是否可用
const isARSupported = await ar.isAREngineSupported();
if (!isARSupported) {
console.error("当前设备不支持AR引擎");
return;
}
// 2. 初始化AR引擎(捕获异常)
this.arEngine = await ar.createAREngine();
// 3. 校验模型资源是否存在
const modelExist = await fs.accessSync("assets/models/mercury.glb");
if (modelExist) {
this.loadModel("assets/models/mercury.glb");
} else {
console.error("模型资源不存在");
}
} catch (e) {
console.error("AR初始化/模型加载失败:", e);
}
}
场景 3:点击屏幕放置模型时未校验 AR 状态
选择星球后点击屏幕闪退,可能是未识别到平面就强制放置模型:
// 原错误代码(点击直接放模型)
onScreenClick() {
this.placeModel(this.currentPlane); // currentPlane可能未赋值
}
修复:先校验 AR 状态 + 平面有效性
onScreenClick() {
// 1. 校验AR引擎是否初始化完成
if (!this.arEngine) {
console.error("AR引擎未初始化");
return;
}
// 2. 校验是否识别到有效平面
if (!this.currentPlane || !this.currentPlane.isValid) {
console.error("未识别到可放置的平面,请扫描四周");
return;
}
// 3. 校验模型是否加载完成
if (!this.planetModel) {
console.error("模型未加载完成");
return;
}
// 4. 安全放置模型
this.placeModel(this.currentPlane);
}
三、额外稳定性优化
- 内存管理:AR 模型使用后及时释放资源,避免内存溢出:
onPageHide() {
if (this.planetModel) {
this.planetModel.release(); // 释放3D模型资源
}
if (this.arEngine) {
this.arEngine.stop(); // 停止AR引擎
}
}
- 机型兼容性:Mate60/Mate80 Pro 的 AR 引擎接口可能有差异,需适配 API 版本:
// 检查AR引擎API版本
const arApiVersion = await ar.getAREngineVersion();
if (arApiVersion < 20) { // 适配低版本API
this.useLegacyARLogic();
} else {
this.useNewARLogic();
}
四、验证步骤
- 先修复
ArDisplayPage.ts第 266 行的空值判断 / 异常捕获; - 测试 AR 模块:先扫描平面(确保识别到平面后)再点击放置模型;
- 在 Mate60/Mate80 Pro 上分别测试,观察是否还会崩溃;
- 查看日志(通过 DevEco Studio 的 Logcat),确认是否还有未处理的异常。
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
这个页面ArDisplayPage代码第266行:21发生了崩溃 楼主检查一下这里的逻辑增加异常处理,防止应用使用过程中的崩溃
也可以使用ErrorManager捕获异常,但是崩溃后需要做好崩溃后的处理,以免应用卡死
【参考文档】
多使用 try catch,错误处理很重要
鸿蒙Next应用上架审核崩溃问题排查指南
为确保应用顺利通过鸿蒙Next上架审核,避免崩溃问题,请重点排查以下方面:
1. 应用API版本兼容性
- 确保应用已适配鸿蒙Next的API版本。
- 验证所有系统API调用在当前目标版本中可用且行为符合预期。
2. ArkTS/ArkUI组件规范性
- 检查应用使用的所有ArkTS/ArkUI组件是否符合鸿蒙Next开发规范。
- 避免使用已废弃或不推荐的组件与属性。
3. 三方SDK适配情况
- 确认应用集成的所有第三方SDK均已官方声明支持鸿蒙Next。
- 更新三方SDK至已适配鸿蒙Next的版本。
4. 应用权限声明与使用
- 确保应用声明的所有权限均与实际功能使用需求一致。
- 遵循最小权限原则,仅申请必要的权限。
- 检查运行时权限申请逻辑是否符合规范。
5. 系统API使用规范
- 严格避免使用任何私有API或未向开发者开放的系统能力。
- 检查代码中是否存在通过反射等机制调用非公开接口的情况。
测试建议
- 在鸿蒙Next真机或官方模拟器上进行充分的功能、兼容性与稳定性测试。
- 覆盖主要用户路径与边缘场景,确保核心流程无崩溃。
根据您提供的信息,这是一个典型的JavaScript运行时崩溃(JsCrash)问题,具体发生在AR模块的ArDisplayPage.ts文件的第266行附近。Mate 60和Mate 80 Pro设备均出现闪退,表明问题具有设备普遍性,而非特定硬件兼容性问题。
核心问题定位:
崩溃堆栈指向entry|entry|1.0.0|src/main/ets/pages/ArDisplayPage.ts:266:21。这行代码极有可能涉及不安全的JavaScript/TypeScript操作,例如:
- 访问未定义(undefined)或空(null)对象的属性。
- 数组越界访问。
- 调用非函数类型的变量。
- 在AR场景中,对AR引擎返回的对象或数据未做判空处理直接使用。
分析与排查步骤:
-
审查指定代码行: 立即检查
src/main/ets/pages/ArDisplayPage.ts文件中第266行及前后相关代码。重点检查对象属性访问、数组索引、函数调用。 -
强化空值安全判断: HarmonyOS Next开发强调代码健壮性。对所有从AR引擎API、异步回调、
@State变量等获取的数据,在使用前必须进行有效性判断。- 示例修正:
// 假设原代码可能是: let nodeName = this.arObject.name; // 如果arObject为undefined,此处崩溃 // 应修改为: if (this.arObject) { let nodeName = this.arObject.name; // ... 其他操作 } else { // 处理arObject为空的情况,例如给出用户提示或使用默认值 console.error('AR对象未初始化'); }
- 示例修正:
-
检查AR生命周期与资源管理: AR模块对资源(如会话、锚点、3D对象)的生命周期非常敏感。确保:
- 在页面
aboutToDisappear或onDestroy回调中,正确释放AR会话(ARSession)及相关资源。 - 在AR会话未就绪(例如
ARSessionState.INITIALIZED)前,避免执行需要会话状态的操作。 - 检查AR回调(如平面检测、锚点更新)中的数据,确保其非空后再使用。
- 在页面
-
使用开发工具调试:
- 在DevEco Studio中,对
ArDisplayPage页面及相关AR操作函数设置断点。 - 使用预览器或真机调试,单步执行至崩溃点附近,观察变量状态。
- 查看Log窗口,过滤
JsApp或DFX相关日志,寻找崩溃前的警告或错误信息。
- 在DevEco Studio中,对
-
设备与API兼容性复核: 虽然使用了API 20,但需确认调用的AR接口在Mate 60和Mate 80 Pro的系统版本上完全可用,且权限已正确声明。
总结:
上架审核的崩溃问题根源在于ArDisplayPage.ts中第266行附近的代码缺乏对数据有效性的防护。请严格按照上述步骤,重点排查该行代码的对象访问逻辑,并对整个AR操作流程加入完备的空值判断和异常处理。修复后,需在Mate 60和Mate 80 Pro真机上完整测试AR功能流程,确保稳定运行。

