HarmonyOS鸿蒙Next中如何检测应用是否运行在模拟器或被调试?

HarmonyOS鸿蒙Next中如何检测应用是否运行在模拟器或被调试? 我们的 App 需阻止在模拟器或调试状态下运行。有没有 API 检测?

6 回复

【解决方案】

开发者你好

  1. 判断是否为模拟器可以使用@ohos.deviceInfo模块的productModel属性来区分真机和模拟器。在模拟器上productModel的值为emulator。

参考文档:在应用中如何区分真机和模拟器

  1. 判断是否为调试状态可以通过当前应用程序签名证书文件的类型判断,通过bundleManager.getBundleInfoForSelf获取自身的应用程序信息,其中ApplicationInfo.appProvisionType表示应用程序签名证书文件的类型,分为debug和release两种类型。示例代码如下:
import { bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION | bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;

try {
  bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => {
    hilog.info(0x0000, 'testTag', 'getBundleInfoForSelf successfully. Data: %{public}s', JSON.stringify(data));
    let appProvisionType = data.appInfo.appProvisionType
  }).catch((err: BusinessError) => {
    hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);
  });
} catch (err) {
  let message = (err as BusinessError).message;
  hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed: %{public}s', message);
}

更多关于HarmonyOS鸿蒙Next中如何检测应用是否运行在模拟器或被调试?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


判断当前运行的设备是真机还是模拟器,可以通过检查特定的系统属性或环境变量来实现区分。

在应用中,使用[@ohos.deviceInfo](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-device-info)模块的productModel属性来区分真机和模拟器。模拟器上,productModel的值为emulator。

import { deviceInfo } from '@kit.BasicServicesKit'
const model:string = deviceInfo.productModel;
if (model === 'emulator') {
  //模拟器
}

可通过多维度检测:

  • deviceManager.getDeviceType() === ' emulator'
  • hiDebug.isDebuggerConnected()(需 DevEco 4.1+);
  • 检查 /proc/cpuinfo 是否含 goldfish(Android 模拟器特征);
  • 调用 huks.getProperty(huks.HuksKeyProperty.IS_EMULATOR)。若任一条件命中,拒绝启动核心功能。

学习中。

获取证书签名做校验

概述

证书签名校验是确保数字证书真实性和完整性的重要过程,通过验证证书的签名来确认其是否由可信的证书颁发机构(CA)签发。

校验步骤

  1. 获取证书:从服务器或本地存储中获取需要校验的数字证书。
  2. 提取签名:从证书中提取出签名部分。
  3. 获取公钥:从签发该证书的CA证书中获取公钥。
  4. 计算哈希:对证书的正文部分(不包括签名)计算哈希值。
  5. 解密签名:使用CA的公钥对证书中的签名进行解密,得到原始的哈希值。
  6. 比对哈希:将计算出的哈希值与解密得到的哈希值进行比对。
  7. 验证结果:如果两个哈希值一致,则证书签名有效;否则,证书可能被篡改或无效。

注意事项

  • 确保使用的CA公钥是可信的。
  • 校验过程中要注意证书的有效期,避免使用过期的证书。
  • 对于自签名证书,需要额外验证证书的完整性和来源。

在HarmonyOS Next中,可以通过@ohos.process@ohos.app.ability.Configuration等模块提供的API来检测应用是否运行在模拟器或被调试。

1. 检测调试状态: 使用process.isDebugging()方法,可以判断当前进程是否处于调试状态。

import process from '@ohos.process';

let isDebug = process.isDebugging();
if (isDebug) {
  // 应用正在被调试
}

2. 检测模拟器环境: 虽然HarmonyOS Next没有直接提供“是否为模拟器”的API,但可以通过检查设备特征进行推断。常用方法包括:

  • 检查系统属性: 通过systemParameter.getSync()获取ro.hardwarero.product.model等属性,模拟器的值通常包含特定标识(如ranchugoldfish)。
  • 检查硬件特征: 模拟器通常缺少某些传感器或硬件功能。可以使用@ohos.sensor模块检测传感器列表,或通过@ohos.deviceInfo获取设备信息进行判断。

3. 综合检测示例:

import process from '@ohos.process';
import systemParameter from '@ohos.systemParameter';

function isRunningInEmulator() {
  // 示例:通过硬件属性判断
  let hardware = systemParameter.getSync("ro.hardware");
  let model = systemParameter.getSync("ro.product.model");
  return hardware.includes("ranchu") || model.includes("Emulator");
}

function checkEnvironment() {
  if (process.isDebugging() || isRunningInEmulator()) {
    // 触发安全处理逻辑
    console.error("Unsupported execution environment detected.");
  }
}

注意: 模拟器检测方法依赖于系统实现细节,不同版本或厂商的模拟器可能有差异,建议结合多种特征判断并定期更新检测逻辑。

回到顶部