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

【问题现象】: cke_1304.png cke_2019.png

【版本信息】:开发工具版本:6.0.0.858 release、手机系统版本6.0.0.120 SP6、Api语言版本:20

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS鸿蒙Next中上架审核出现应用出现崩溃问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

开发者你好,根据你提供的日志,报错定位有具体代码行数,需要根据您的具体代码进行排查,您可以先按照以下方案自行排查下代码问题,如未能解决请麻烦提供具体代码方便定位分析。

以下是错误信息的定位关键因素,可以参考:

【背景知识】

  1. JsCrash异常根据不同的异常场景,在Reason字段进行了分类,分为Error、TypeError、SyntaxError、ReferenceError、RangeError等错误类型。
  2. TypeError(类型错误)类:运行时最常见的异常,表示变量或参数不是预期类型。

【问题定位】

  1. 从faultlogger目录下获取故障日志。
  2. 从故障日志中可以获取到故障原因和异常信息。
  3. 故障原因是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,但resultundefined);
  • 场景 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);
}

三、额外稳定性优化

  1. 内存管理:AR 模型使用后及时释放资源,避免内存溢出:
onPageHide() {
  if (this.planetModel) {
    this.planetModel.release(); // 释放3D模型资源
  }
  if (this.arEngine) {
    this.arEngine.stop(); // 停止AR引擎
  }
}
  1. 机型兼容性:Mate60/Mate80 Pro 的 AR 引擎接口可能有差异,需适配 API 版本:
// 检查AR引擎API版本
const arApiVersion = await ar.getAREngineVersion();
if (arApiVersion < 20) { // 适配低版本API
  this.useLegacyARLogic();
} else {
  this.useNewARLogic();
}

四、验证步骤

  1. 先修复ArDisplayPage.ts第 266 行的空值判断 / 异常捕获;
  2. 测试 AR 模块:先扫描平面(确保识别到平面后)再点击放置模型;
  3. 在 Mate60/Mate80 Pro 上分别测试,观察是否还会崩溃;
  4. 查看日志(通过 DevEco Studio 的 Logcat),确认是否还有未处理的异常。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

这个页面ArDisplayPage代码第266行:21发生了崩溃 楼主检查一下这里的逻辑增加异常处理,防止应用使用过程中的崩溃

也可以使用ErrorManager捕获异常,但是崩溃后需要做好崩溃后的处理,以免应用卡死

【参考文档】

如何使用ErrorManager捕获异常-运维-技术质量-应用质量-开发 - 华为HarmonyOS开发者

多使用 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操作,例如:

  1. 访问未定义(undefined)或空(null)对象的属性
  2. 数组越界访问
  3. 调用非函数类型的变量
  4. 在AR场景中,对AR引擎返回的对象或数据未做判空处理直接使用

分析与排查步骤:

  1. 审查指定代码行: 立即检查src/main/ets/pages/ArDisplayPage.ts文件中第266行及前后相关代码。重点检查对象属性访问、数组索引、函数调用。

  2. 强化空值安全判断: 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对象未初始化');
      }
      
  3. 检查AR生命周期与资源管理: AR模块对资源(如会话、锚点、3D对象)的生命周期非常敏感。确保:

    • 在页面aboutToDisappearonDestroy回调中,正确释放AR会话(ARSession)及相关资源。
    • 在AR会话未就绪(例如ARSessionState.INITIALIZED)前,避免执行需要会话状态的操作。
    • 检查AR回调(如平面检测、锚点更新)中的数据,确保其非空后再使用。
  4. 使用开发工具调试:

    • 在DevEco Studio中,对ArDisplayPage页面及相关AR操作函数设置断点
    • 使用预览器或真机调试,单步执行至崩溃点附近,观察变量状态。
    • 查看Log窗口,过滤JsAppDFX相关日志,寻找崩溃前的警告或错误信息。
  5. 设备与API兼容性复核: 虽然使用了API 20,但需确认调用的AR接口在Mate 60和Mate 80 Pro的系统版本上完全可用,且权限已正确声明。

总结: 上架审核的崩溃问题根源在于ArDisplayPage.ts中第266行附近的代码缺乏对数据有效性的防护。请严格按照上述步骤,重点排查该行代码的对象访问逻辑,并对整个AR操作流程加入完备的空值判断和异常处理。修复后,需在Mate 60和Mate 80 Pro真机上完整测试AR功能流程,确保稳定运行。

回到顶部