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

#### 问题现象

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

#### 背景知识

[bundleManager.getBundleInfoForSelf](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-bundlemanager#bundlemanagergetbundleinfoforself)：根据给定的bundleFlags获取当前应用的BundleInfo。使用Promise异步回调。

[BundleFlag](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-bundlemanager#bundleflag)：包信息标志，指示需要获取的包信息的内容。

[应用配置文件概述（Stage模型）](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-configuration-file-overview-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%')
  }
}