#盲盒+码#[十七]如何编译hap程序 原创 精华

左翼风发
发布于 2022-11-23 09:25
浏览
4收藏

作者:王石,胡瑞涛

上节回顾

在[六]如何编写hap文件,我们学习了hap文件的结构框架和如何自己开发一个简单的hap程序。接下来我们来学习如何在OpenHarmony环境下编译hap程序。

安装使用说明(OpenHarmony)

在OpenHarmony系统下

  • 蓝牙专项应用程序路径为:foundation/communication/bluetooth/test/example/BluetoothTest

  • 目录结构

    .
    ├── example
    │   ├── BluetoothTest
    │   │   ├── build-profile.json5
    │   │   ├── hvigorfile.js
    │   │   ├── package.json
    │   │   ├── package-lock.json
    │   │   ├── BUILD.gn
    │   │   ├── entry/src/main
    │   │   │   ├── config.json
    │   │   │   ├── ets
    │   │   │   │   ├── Component
    │   │   │   │   ├── MainAbility
    │   │   │   │   │   ├── app.ets
    │   │   │   │   │   ├── controller
    │   │   │   │   │   ├── model
    │   │   │   │   │   ├── pages
    │   │   │   │   │   └── res
    │   │   │   │   │       └── image
    │   │   │   │   ├── MainAbility2 
    │   │   │   │   └── Utils
    │   │   │   └── resources
    │   │   │       └── base
    │   │   │           ├── element
    │   │   │           └── media
    │   │   └── signature
    ├── fuzztest
    ├── moduletest
    └── unittest
    
  • 在OpenHarmony下的编译,是套用了原本系统中编写好的hap程序编译模板,因此保留了一些模板中的结构,如:MainAbility2 和config.json中的js语句;对程序本身的编译没有影响。

  • 在bundle.json中添加编译命令

    路径为:foundation/communication/bluetooth/bundle.json
    命令为:
    "test": [
       ...
       "//foundation/communication/bluetooth/test/example/example_btTest:BluetoothTest"
    ]
    
  • 添加BUILD.gn

    foundation/communication/bluetooth/test/example/BluetoothTest/BUILD.gn
    import("//test/xts/tools/build/suite.gni")
    ohos_hap("BluetoothTest") {
      hap_profile = "entry/src/main/config.json"
      hap_name = "BluetoothTest"
      subsystem_name = XTS_SUITENAME
      final_hap_path =
          "${SUITES_OUTPUT_ROOT}/${XTS_SUITENAME}/testcases/${hap_name}.hap"
      deps = [
        ":bluetooth_resources",
        ":bluetooth_ts_assets",
      ]
      certificate_profile = "signature/auto_ohos_default_com.ohos.bttest.p7b"
    }
    
    ohos_js_assets("bluetooth_ts_assets") {
      source_dir = "entry/src/main/ets"
      hap_profile = "entry/src/main/config.json"
      ets2abc = true
    }
    
    ohos_resources("bluetooth_resources") {
      sources = [ "entry/src/main/resources" ]
      hap_profile = "entry/src/main/config.json"
    }
    
  • 创建signature文件夹,添加签名文件

    路径为:foundation/communication/bluetooth/test/example/example_btTest/signature
    签名文件为:Dev-Eco自动签名生成的文件:auto_ohos_default_com.ohos.bttest.p7b
    
  • config.json

    {
      "app": {
        "vendor": "samples",
        "bundleName": "ohos.samples.bttest",
        "version": {
          "code": 1000000,
          "name": "1.0.0"
        },
        "apiVersion": {
          "compatible": 8,
          "target": 8
       }
      },
      "deviceConfig": {},
      "module": {
        "mainAbility": ".MainAbility",
        "deviceType": [
          "default",
          "phone"
        ],
        "reqPermissions": [
          {
            "reason": "",
            "name": "ohos.permission.DISCOVER_BLUETOOTH"
          },
          {
            "reason": "",
            "name": "ohos.permission.USE_BLUETOOTH"
          },
          {
            "name": "ohos.permission.LOCATION"
          }
        ],
        "abilities": [
          {
            "skills": [
              {
                "entities": [
                  "entity.system.home"
                ],
                "actions": [
                  "action.system.home"
                ]
              }
            ],
            "orientation": "unspecified",
            "visible": true,
            "srcPath": "MainAbility",
            "name": ".MainAbility",
            "srcLanguage": "ets",
            "icon": "$media:icon",
            "description": "$string:MainAbility_desc",
            "formsEnabled": false,
            "label": "$string:MainAbility_label",
            "type": "page",
            "launchType": "singleton"
          },
          {
            "orientation": "unspecified",
            "visible": true,
            "srcPath": "MainAbility2",
            "name": ".MainAbility2",
            "srcLanguage": "ets",
            "icon": "$media:icon",
            "description": "$string:MainAbility2_desc",
            "formsEnabled": false,
            "label": "$string:MainAbility2_label",
            "type": "page",
            "launchType": "singleton"
          }
        ],
        "distro": {
          "moduleType": "entry",
          "installationFree": false,
          "deliveryWithInstall": true,
          "moduleName": "entry"
        },
        "package": "ohos.samples.bttest",
        "srcPath": "",
        "name": ".entry",
        "js": [
          {
            "mode": {
              "syntax": "ets",
              "type": "pageAbility"
            },
            "pages": [
              "pages/homePage",
              "pages/manualApiTestPage",
               ...
            ],
            "name": ".MainAbility",
            "window": {
              "designWidth": 720,
              "autoDesignWidth": false
            }
          },
          {
            "mode": {
              "syntax": "ets",
              "type": "pageAbility"
            },
            "pages": [
              "pages/index"
            ],
            "name": ".MainAbility2",
            "window": {
              "designWidth": 720,
              "autoDesignWidth": false
            }
          }
        ]
      }
    }
    
  • 编译命令

    # 全量编译
    ./build.sh --product-name {product_name}
    
    # 单独编译HAP
    ./build.sh --product-name {product_name} --build-target BluetoothTest
    
  • 生成文件

    • 使用 find out -name “BluetoothTest.hap*” 查找生成文件,或者直接查看config.json所写的生成路径。
    • 将生成文件拷到本地电脑上,连接板子,使用命令 hdc_std.exe install BluetoothTest进行安装。
    • 使用命令 hdc_std uninstall {安装包名} 进行卸载。
    • 安装包名在 entry\src\main\config.json 如:"bundleName": "com.ohos.bttest"
  • 补充

    在OpenHarmony系统下编译,仍存在高版本对低版本的编译不兼容性问题。即在mater版本下编译的hap无法在beta2版本运行;反之则可以。

  • 可能出现的编译报错

    • 一些属性必须初始化一个默认值。如:The @State property ‘bgColor’ ‘settingArrow’ ‘settingSummary’ must be specified a default value。
    • 注意引用路径中的文件名大小写问题。
    • 一些属性名与关键词或类名重复会起冲突。如:Property ‘height’/“onClick”/“enabled” in type ‘EntryComponent’ is not assignable to the same property in base type 'CustomComponent。将其改成例如"isOnClick"/"isEnabled"即可。
    • 一些资源,如:@State settingSummary: Resource 必须是resource 不能加 |string 或者赋值为string。Type ‘Resource’ is not assignable to type ‘string’. 反之同理。Type ‘string’ is not assignable to type ‘Resource’。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2023-1-12 11:10:41修改
6
收藏 4
回复
举报
3条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

很详细的流程

回复
2022-11-23 10:06:42
带带小老弟
带带小老弟

干货,支持

回复
2022-11-23 18:08:51
0aaron
0aaron

从开发到编译,一点点积累学习

回复
2022-11-25 14:30:29
回复
    相关推荐