目录

如何获取Stage模型应用配置信息?

问题现象

如何获取Stage模型应用配置信息?包括全局应用配置文件app.json5以及模块配置文件module.json5。

背景知识

bundleManager.getBundleInfoForSelf:根据给定的bundleFlags获取当前应用的BundleInfo。使用Promise异步回调。

BundleFlag:包信息标志,指示需要获取的包信息的内容。

应用配置文件概述(Stage模型):在基于Stage模型开发的应用项目代码下,都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。

解决方案

Stage模型下应用配置主要是app.json5和module.json5两个文件,其中app.json5包含应用全局的配置信息(例如Bundle名称、开发厂商、版本号等基本信息)以及特定设备类型的配置信息,module.json5包含Module的基本配置信息(Module名称、类型、描述、支持的设备类型等基本信息)、应用组件配置信息(UIAbility、ExtensionAbility)、应用运行过程当中所需的权限信息。可以通过包管理工具类当中提供的方法bundleManager.getBundleInfoForSelf在应用代码当中获取这些值。

字段

所属配置文件

查询接口

参数bundleFlag

接口返回值说明

bundleName

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

应用bundleName,bundleInfo.name

vendor

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

应用包的供应商,bundleInfo.vendor

versionCode

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

应用包的版本号,bundleInfo.versionCode

versionName

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

应用包的版本文本描述信息,bundleInfo.versionName

minCompatibleVersionCode

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

分布式场景下的应用包兼容的最低版本,bundleInfo.minCompatibleVersionCode

targetAPIVersion

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_DEFAULT

应用运行目标版本,bundleInfo.targetVersion

bundleName

app.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_APPLICATION

应用bundleName,bundleInfo.appInfo.name

description

app.json5、module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_APPLICATION

应用的描述信息,返回的是资源描述符,bundleInfo.appInfo.description。可以通过bundleInfo.appInfo.descriptionId资源id获取具体文本。

注:如果app.json5和module.json5配置的入口UIAbility都配置了这个属性,取入口UIAbility配置的值

label

app.json5、module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_APPLICATION

应用的名称,返回的是资源描述符,bundleInfo.appInfo.label。可以通过bundleInfo.appInfo.labelId资源id获取具体文本。

注:如果app.json5和module.json5配置的入口UIAbility都配置了这个属性,取入口UIAbility配置的值

icon

app.json5、module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_APPLICATION

应用程序图标,返回的是资源描述符,bundleInfo.appInfo.icon。可以通过bundleInfo.appInfo.iconId资源id获取完整资源。

注:如果app.json5和module.json5配置的入口UIAbility都配置了这个属性,取入口UIAbility配置的值

requestPermissions

module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION

访问应用程序所需的权限,bundleInfo.reqPermissionDetails

deviceTypes

module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_HAP_MODULE

当前模块支持安装运行的设备类型的集合, bundleInfo.hapModulesInfo[0].deviceTypes

abilities

module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_HAP_MODULE

GET_BUNDLE_INFO_WITH_ABILITY

当前模块所有Ability的信息,bundleInfo.hapModulesInfo[0].abilitiesInfo

extensionAbilitiesInfo

module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_HAP_MODULE

GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY

当前模块所有ExtensionAbility的信息,bundleInfo.hapModulesInfo[0].extensionAbilitiesInfo

metadata

module.json5

bundleManager.getBundleInfoForSelf

GET_BUNDLE_INFO_WITH_HAP_MODULE

GET_BUNDLE_INFO_WITH_METADATA

当前模块的元数据,bundleInfo.hapModulesInfo[0].metadata

代码实例参考如下:

import { bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { buffer } from '@kit.ArkTS';

@Entry
@Component
struct GetStageConfigData {

  build() {
    RelativeContainer() {
      Text('查询应用配置信息')
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_HAP_MODULE |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_ABILITY |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY |
            bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_METADATA;
          bundleManager.getBundleInfoForSelf(bundleFlags).then((bundleInfo : bundleManager.BundleInfo) => {
            console.info(`bundleName:${bundleInfo.name}`);
            console.info(`供应商:${bundleInfo.vendor}`);
            console.info(`版本号:${bundleInfo.versionCode}`);
            console.info(`版本描述:${bundleInfo.versionName}`);
            console.info(`分布式场景下应用兼容的最低版本:${bundleInfo.minCompatibleVersionCode}`);
            console.info(`应用运行目标版本:${bundleInfo.targetVersion}`);
            // 权限信息:bundleFlags需要包含GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION
            let permissions = bundleInfo.reqPermissionDetails;
            console.info(`应用运行时需向系统申请的权限集合的详细信息:${JSON.stringify(permissions)}`);

            // 应用程序的配置信息,GET_BUNDLE_INFO_WITH_APPLICATION
            let applicationInfo = bundleInfo.appInfo;
            console.info(`bundleName:${applicationInfo.name}`);
            let descriptionId = applicationInfo.descriptionId;
            if (descriptionId) {
              console.info(`应用描述详细信息: ${this.getUIContext().getHostContext()!.resourceManager.getStringSync(descriptionId)}`);
            }
            let labelId = applicationInfo.labelId;
            if (labelId) {
              console.info(`label: ${this.getUIContext().getHostContext()!.resourceManager.getStringSync(labelId)}`);
            }
            let iconId = applicationInfo.iconId;
            if (iconId) {
              let icon = this.getUIContext().getHostContext()!.resourceManager.getMediaContentSync(iconId);
              console.info(`icon: ${buffer.from(icon.buffer).toString()}`);
            }

            // 获取模块配置信息, GET_BUNDLE_INFO_WITH_HAP_MODULE
            let hapInfos = bundleInfo.hapModulesInfo;
            for (let hapInfo of hapInfos) {
              console.info(`模块名称:${hapInfo.name}`);
              console.info(`当前模块的入口UIAbility名称:${hapInfo.mainElementName}`);
              console.info(`模块支持安装运行的设备类型的集合:${JSON.stringify(hapInfo.deviceTypes)}`);
              let abilitiesInfo = hapInfo.abilitiesInfo;
              for (let ability of abilitiesInfo) {
                console.info(`ability信息: ${JSON.stringify(ability)}`);
              }
              // 获取当前模块所有ExtensionAbility的信息,需要额外的GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY
              let extensionAbilitiesInfo = hapInfo.extensionAbilitiesInfo;
              for (let extensionAbilityInfo of extensionAbilitiesInfo) {
                console.info(`extensionAbility信息: ${JSON.stringify(extensionAbilityInfo)}`);
              }
              // 获取模块元信息, 需要额外的GET_BUNDLE_INFO_WITH_METADATA
              let metaData = hapInfo.metadata;
              console.info(`当前模块的元数据: ${JSON.stringify(metaData)}`);
            }

          }).catch((err: BusinessError) => {
            console.info(`查询应用包基础信息失败。code: ${err.code}; message: ${err.message}`);
          });
        })
    }
    .height('100%')
    .width('100%')
  }
}