HarmonyOS鸿蒙Next中如何获取应用当前使用的ABI

HarmonyOS鸿蒙Next中如何获取应用当前使用的ABI 如何获取应用当前使用的ABI?

11 回复

【解决方案】

开发者您好,可以参考[@ohos.deviceInfo (设备信息)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-device-info)中的abiList常量,可获取应用二进制接口(Abi)。

代码示例参考常量下方示例:

import { deviceInfo } from '@kit.BasicServicesKit';

let abiListInfo: string = deviceInfo.abiList;
// 输出结果:the value of the abiList is :arm64-v8a
console.info('the value of the deviceInfo abiList is :' + abiListInfo);

更多关于HarmonyOS鸿蒙Next中如何获取应用当前使用的ABI的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这个只是设备支持的ABI列表,并不是当前应用使用的哪个ABI。

开发者您好,可以参考https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ohos-abi#在编译架构中指定abi。

查找项目build-profile.json5文件buildOption/externalNativeOptions/abiFilters字段,如果DevEco Studio中不设置abiFilters字段,则默认配置的指定架构为:arm64-v8a

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

我感觉你的理解还是有点偏差,你说的是设备和应用支持的ABI有哪些,我不是要支持的ABI有哪些,我的问题是当前应用使用的是哪个ABI,例如:如果某个系统和某个应用都支持arm64-v8a和x86_64,那么当该应用运行时系统会使用其中的一个ABI,那么我就想知道当前系统选择的是哪个ABI。

刚刚和华为官方工程师沟通了一下,目前确实没有办法获取当前应用所使用的ABI,只能是通过deviceInfo.abiList数组来进行猜测,看deviceInfo.abiList数组的第一个是不是应用支持的ABI,如果是的,那大概率就是这个,如果不是的,那就看第二个,以此类推,目前只能这样了,等以后看能不能增加一个变量来表示。

能拿到手机的 拿不到 应用的 ,如果可以拿到 记得拍我一下 我也学一下

刚刚和华为官方工程师沟通了一下,目前确实没有办法获取当前应用所使用的ABI,只能是通过deviceInfo.abiList数组来进行猜测,看deviceInfo.abiList数组的第一个是不是应用支持的ABI,如果是的,那大概率就是这个,如果不是的,那就看第二个,以此类推,目前只能这样了,等以后看能不能增加一个变量来表示。

在HarmonyOS Next中,获取应用当前使用的ABI可以通过查询应用的hapModuleInfo来实现。具体方法是使用BundleManager获取应用的ApplicationInfo,然后访问其hapModuleInfo属性中的nativeLibraryAbi字段。该字段会返回当前应用包所支持的ABI类型,例如arm64-v8a

在HarmonyOS Next中,获取应用当前使用的ABI(Application Binary Interface)可以通过查询系统属性或使用特定的API来实现。以下是几种常见的方法:

  1. 使用 ohos.systemParameter API
    可以通过 systemParameter.getSync() 方法获取系统属性 const.product.cpu.abi,该属性返回设备当前支持的ABI列表,应用运行时使用的ABI通常为列表中的第一个值。
    示例代码:

    import systemParameter from '[@ohos](/user/ohos).systemParameter';
    
    try {
      let abiList = systemParameter.getSync("const.product.cpu.abi");
      let currentABI = abiList.split(',')[0]; // 取第一个ABI作为当前使用的ABI
      console.log("Current ABI: " + currentABI);
    } catch (error) {
      console.error("Failed to get ABI: " + error);
    }
    
  2. 通过 BundleInfo 查询
    在应用安装或运行时,可以通过 bundleManager.getBundleInfo() 获取应用的 BundleInfo,其中 appInfo.nativeLibraryPath 字段可能包含ABI相关信息(具体路径中可能包含ABI类型,如 arm64-v8a)。
    示例代码:

    import bundleManager from '[@ohos](/user/ohos).bundle.bundleManager';
    
    try {
      let bundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let nativeLibraryPath = bundleInfo.appInfo.nativeLibraryPath;
      console.log("Native library path: " + nativeLibraryPath); // 路径中可能包含ABI信息
    } catch (error) {
      console.error("Failed to get bundle info: " + error);
    }
    
  3. 使用 os.arch API
    通过 os.arch() 可以获取当前设备的CPU架构(如 arm64),但注意这返回的是设备架构而非应用运行的精确ABI(例如不会区分 arm64-v8aarmeabi-v7a)。
    示例代码:

    import os from '[@ohos](/user/ohos).os';
    
    let cpuArch = os.arch();
    console.log("CPU architecture: " + cpuArch);
    

注意事项

  • 方法1(systemParameter)通常最直接,但需注意返回的ABI列表可能包含多个值(如 arm64-v8a,armeabi-v7a),应用实际使用的ABI取决于代码编译目标及设备兼容性。
  • 方法2(BundleInfo)更适用于查询应用自身的原生库信息,但路径格式可能因系统版本变化。
  • 若应用未使用原生库(如纯ArkTS开发),ABI信息可能不适用。

根据具体场景选择合适方法即可。

回到顶部