HarmonyOS 宿主应用搭建
HarmonyOS 宿主应用搭建
一. 环境准备
| 步骤 | 详细说明 | 关键配置与要求 |
|---|---|---|
| 安装 DevEco Studio | 下载并安装最新版官方 IDE。 DevEco Studio提供开箱即用的开发体验,将HarmonyOS SDK、Node.js、Hvigor、OHPM、模拟器平台等进行合一打包,简化DevEco Studio安装配置流程。 | 建议使用最新稳定版 DevEco Studio。 |
| SDK | HarmonyOS SDK已嵌入DevEco Studio中,无需额外下载配置。 HarmonyOS SDK可以在DevEco Studio安装位置下DevEco Studio\sdk目录中查看。如需进行OpenHarmony应用开发,可通过File > Settings > OpenHarmony SDK页签下载OpenHarmony SDK。 | |
| 开发者账号 | 注册华为开发者账号,完成实名认证(企业或个人)。 | 必须实名认证才能申请正式证书。 |
注:OpenHarmony 是开源的技术底座(不含安卓代码),HarmonyOS 是兼容安卓应用的商业发行版,而 HarmonyOS Next 则是完全剥离安卓、仅支持原生应用(HAP)的纯血商用系统。
二. 创建HarmonyOS工程
a. 创建流程
- 在DevEco Studio的欢迎页,选择Create Project开始创建一个新工程。
- 根据工程创建向导,选择创建Application、Native C++,然后单击Next。

- 在工程配置页面,需要根据向导配置工程的基本信息。
- Project name:工程的名称,可以自定义,由大小写字母、数字和下划线组成,必须由大小写字母开头,长度为1~200个字符。
- Bundle name:标识应用的包名,用于标识应用的唯一性。

- Save location:工程文件本地存储路径,由大小写字母、数字和下划线等组成,不能包含中文字符。
- Compatible SDK:兼容的最低API Version。
- Module name: 模块的名称。
- Device type:该工程模板支持的设备类型。设备类型说明请参考deviceTypes标签。
- C++ Standard:C++标准库,取值包括:Toolchain Default、C++11、C++14。

4. 单击Finish,工具会自动生成示例代码和相关资源,等待工程创建完成。
b. 项目文件结构
使用 Native C++模板创建项目会自动生成cpp文件夹、types文件夹、CMakeList.txt文件,开发者可以根据实际情况自行添加修改其他文件及文件夹。
├── AppScope // 项目配置:包名、版本号、游戏名等。
├── entry/Build // 构建输出目录,编译后自动生成,存放最终的 .hap 或 .app 安装包。
├── entry/libs // 预编译库目录,存放.so动态库,不同架构以目录区分。如:libs/arm64-v8a/...
├── entry/src
│ ├── main
│ │ ├── cpp // C++代码区
│ │ │ ├── CMakeLists.txt // CMake编译配置文件
│ │ │ ├── napi_init.cpp // C++源代码,声明C++方法,供ArkTS调用
│ │ │ └── types // 接口存放文件夹
│ │ │ └── libentry
│ │ │ ├── index.d.ts // 接口文件
│ │ │ └── oh-package.json5 // 接口注册配置文件
│ │ ├── ets // 代码区
│ │ │ ├── entryability
│ │ │ │ └── EntryAbility.ts // 程序入口类,进行一些必要设置和初始化。Unreal引擎的初始化通常在此被调用。
│ │ │ └── pages // UI
│ │ │ └── Index.ets // 默认生成的UI页面
│ │ ├── resources // 资源文件目录
│ │ │ ├── base/media // 媒体资源, 存放应用内图标、启动图等。
│ │ │ └── rawfile // 虚幻引擎的 .pak 资源文件必须放在此处,才能通过 ResourceManager 接口由 C++ 端读取。
│ │ │
│ │ └── module.json5 // 模块配置,声明应用权限(网络、存储等)、窗口显示模式(全屏/横屏)。
│ │
│ ├── build-profile.json5 // 模块构建配置
│ └── oh-package.json5 // 模块包管理信息,依赖配置
├── hvigor // 构建工具配置,可以修改Hvigor版本号
├── build-profile.json5 // 应用级构建配置
└── oh-package.json5 // 应用级包管理信息
三. 工程实现
a. 应用级配置
-
app.json5用于定义全局属性,如唯一标识、厂商、版本号、版本名称、应用图标、版本号。
{
"app": {
"bundleName": "com.example.game",
"vendor": "example",
"versionCode": 1000000,
"versionName": "1.0.0",
"icon": "$media:app_icon",
"label": "$string:app_name"
}
}
-
build-profile.json5用于配置整个项目的模块列表、签名信息以及编译方案。
{
"app": {
"signingConfigs": [], // 自动化签名生成的配置存放在此
"compileSdkVersion": 12,
"compatibleSdkVersion": 12,
"products": [
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "6.0.0(20)",
"runtimeOS": "HarmonyOS", // 华为鸿蒙系统
}
]
},
"modules": [ // 定义项目包含的所有模块及其物理路径
{ "name": "entry", "srcPath": "./entry", "targets": [{ "name": "default" }] }
]
}
-
oh-package.json5用于声明项目范围内公用的依赖包以及版本覆盖(Overrides)。
{
"modelVersion": "1.1.0", // 必须字段,定义 ohpm 包管理规范的版本
"description": "Please describe the basic information.",
// 项目全局依赖配置:
// 在这里定义的依赖可以被 entry 或其他 feature 模块引用。
"dependencies": {
"@ohos/library_name": "file:./libs/common_utils.har" // 示例:引用本地 HAR 包路径
},
// 开发环境依赖:
// 仅在编译和构建阶段使用的工具。
"devDependencies": {
"@ohos/hyperspace": "1.0.0"
},
// 版本约束/强制重写(可选):
// 当多个模块依赖冲突时,强制指定全局使用的版本。
"overrides": {
"@ohos/lottie": "2.0.0"
}
}
b. 模块级配置
-
module.json5定义模块的基本信息,权限声明和页面属性。
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility", // Module入口UIAbility
"deviceTypes": [ // 可运行的设备类型
"phone",
"tablet"
],
"requestPermissions": [
{ "name": "ohos.permission.INTERNET" }, // 申请网络权限
{ "name": "ohos.permission.KEEP_RUNNING" } // 申请常驻运行
],
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ts",
"orientation": "landscape" // 强制横屏(游戏常用)
}
]
}
}
-
build-profile.json5 **(模块编译细节)**这是 Native 开发最关键的文件。它决定了 C++ 编译的架构、CMake 的参数以及 ABI 过滤。
{
"apiType": "stageMode",
"buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt", // 指定 CMakeLists 位置
"arguments": "", // 传递给 CMake 的额外参数(如 -D宏定义)
"abiFilters": ["arm64-v8a"], // 指定打包对应的 SO 库,默认arm64-v8a
"cppFlags": ""
}
}
}
-
oh-package.json5 **(模块局部依赖)**声明当前模块运行所需的 HAR 包或三方库依赖。
{
"name": "entry",
"version": "1.0.0",
"dependencies": {
"libentry.so": "file:./src/main/cpp/types/libentry" // 关联 Native 接口
}
}
c. 编写项目文件
-
Native层开发在CMakeLists.txt中配置你的 C++ 源码和依赖库。
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.5.0)
# 声明 CMake 最低版本要求
project(Projects)
# 引入预编译的虚幻引擎库 (UE4/UE5.so)
# UBT 编译生成的 so 文件通常会被拷贝到 entry/libs/${OHOS_ARCH} 目录下
set(UE_LIB_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/arm64-v8a)
# 自动生成的,将napi_init.cpp的C++方法暴露给ArkTS端
add_library(entry SHARED napi_init.cpp)
# 链接库文件
target_link_libraries(entry PUBLIC libace_napi.z.so)
target_link_libraries(${PROJECT_NAME} PUBLIC ${UE_LIB_PATH}/libUnreal.so)
-
EntryAbility.ets程序入口实现EntryAbility是应用的生命周期管理中心。在虚幻引擎适配中,它负责加载 Native 库并通知引擎窗口已准备就绪。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
// 在此处可以进行一些不依赖 UI 的 Native 初始化
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// 设置全屏,这是游戏开发的常规操作
let windowClass: window.Window = windowStage.getMainWindowSync();
windowClass.setWindowLayoutFullScreen(true);
// 加载 Index 页面
windowStage.loadContent('pages/Index', (err) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
});
}
onForeground(): void {
// 应用回到前台,通知虚幻引擎恢复运行/渲染
}
onBackground(): void {
// 应用进入后台,通知虚幻引擎暂停渲染以省电
}
}
-
ArkTS 与 Native (跨语言)交互以下示例代码使用鸿蒙提供的 Node-API 完成。另外,OpenHarmony 官方提供 aki(Alpha Kernel Interacting) 框架,为 OpenHarmony Native 开发提供 JS与C/C++ 跨语言访问支持。这里暂未做展示。
模块初始化
// entry/src/main/cpp/napi_init.cpp EXTERN_C_START // 模块初始化 static napi_value Init(napi_env env, napi_value exports) { // ArkTS接口与C++接口的绑定和映射 napi_property_descriptor desc[] = { // 注:仅需复制以下两行代码,Init在完成创建Native C++工程以后在napi_init.cpp中已配置好。 {"callNative", nullptr, CallNative, nullptr, nullptr, nullptr, napi_default, nullptr}, {"nativeCallArkTS", nullptr, NativeCallArkTS, nullptr, nullptr, nullptr, napi_default, nullptr} }; // 在exports对象上挂载CallNative/NativeCallArkTS两个Native方法 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); return exports; } EXTERN_C_END在
index.d.ts文件中,提供JS侧的接口方法。// entry/src/main/cpp/types/libentry/index.d.ts export const callNative: (a: number, b: number) => number; export const nativeCallArkTS: (cb: (a: number) => number) => number;在
oh-package.json5 文件中将index.d.ts与 cpp 文件关联起来。// entry/src/main/cpp/types/libentry/oh-package.json5 { "name": "libentry.so", "types": "./index.d.ts", "version": "", "description": "Please describe the basic information." }在
CMakeLists.txt文件中配置 CMake 打包参数。# entry/src/main/cpp/CMakeLists.txt cmake_minimum_required(VERSION 3.4.1) project(MyApplication2) set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) include_directories(${NATIVERENDER_ROOT_PATH} ${NATIVERENDER_ROOT_PATH}/include) # 添加名为entry的库 add_library(entry SHARED napi_init.cpp) # 构建此可执行文件需要链接的库 target_link_libraries(entry PUBLIC libace_napi.z.so)实现Native侧的
CallNative以及NativeCallArkTS接口。具体代码如下:// entry/src/main/cpp/napi_init.cpp static napi_value CallNative(napi_env env, napi_callback_info info) { size_t argc = 2; // 声明参数数组 napi_value args[2] = {nullptr}; // 获取传入的参数并依次放入参数数组中 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); // 依次获取参数 double value0; napi_get_value_double(env, args[0], &value0); double value1; napi_get_value_double(env, args[1], &value1); // 返回两数相加的结果 napi_value sum; napi_create_double(env, value0 + value1, &sum); return sum; } static napi_value NativeCallArkTS(napi_env env, napi_callback_info info) { size_t argc = 1; // 声明参数数组 napi_value args[1] = {nullptr}; // 获取传入的参数并依次放入参数数组中 napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); // 创建一个int,作为ArkTS的入参 napi_value argv = nullptr; napi_create_int32(env, 2, &argv ); // 调用传入的callback,并将其结果返回 napi_value result = nullptr; napi_call_function(env, nullptr, args[0], 1, &argv, &result); return result; }ArkTS侧调用C/C++方法实现ArkTS侧通过import引入Native侧包含处理逻辑的so来使用C/C++的方法。
// entry/src/main/ets/pages/Index.ets // 通过import的方式,引入Native能力。 import nativeModule from 'libentry.so' @Entry @Component struct Index { @State message: string = 'Test Node-API callNative result: '; @State message2: string = 'Test Node-API nativeCallArkTS result: '; build() { Row() { Column() { // 第一个按钮,调用callNative方法,对应到Native侧的CallNative方法,进行两数相加。 Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { this.message += nativeModule.callNative(2, 3); }) // 第二个按钮,调用nativeCallArkTS方法,对应到Native的NativeCallArkTS,在Native调用ArkTS function。 Text(this.message2) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { this.message2 += nativeModule.nativeCallArkTS((a: number)=> { return a * 2; }); }) } .width('100%') } .height('100%') } }
-
Index.etsUI 界面实现通过XComponent组件,将 ArkTS 的 UI 层与 Native 的渲染表面(Surface)进行绑定。
// 导入 Native 模块
import nativeModule from 'libentry.so';
@Entry
@Component
struct Index {
private xComponentContext: Record<string, Object> | undefined = undefined;
// 软键盘、命令窗口、侧滑返回等功能处理。
build() {
Column() {
// XComponent 是承载虚幻引擎渲染画面的核心组件
XComponent({
id: 'UnrealXComponent',
type: XComponentType.SURFACE, // 类型必须为 surface 以获取渲染表面
libraryname: 'entry' // 对应 CMake 中的库名
})
.onLoad((context) => {
this.xComponentContext = context as Record<string, Object>;
hilog.info(0x0000, 'testTag', 'XComponent onLoad');
// 启动虚幻引擎
nativeModule.initUnreal();
})
.onDestroy(() => {
hilog.info(0x0000, 'testTag', 'XComponent onDestroy');
})
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
}
四. 加载三方库
HarmonyOS 使用 oh-package.json5 进行包管理。
- 添加本地 HAR 包:将
.har 文件放入项目目录(如libs)。 - 配置依赖:在模块级
oh-package.json5 中添加:见第三点,工程实现中的配置。 - 安装依赖: 在终端执行
ohpm install命令。
ohpm install [options] [[<@group>/]<pkg>[@<version> | @tag:<tag>]] ...
ohpm install [options] <folder>
ohpm install [options] <har file>
说明:
-
@group:三方库的命名空间,可选。 -
pkg:三方库名称,可选;当 install 后面没有指定三方库名称时,会根据当前目录下oh-package.json5定义的依赖关系进行全量安装。 -
version:三方库的版本号,可选。 -
tag:三方库的标签,标签会标记三方库的某个版本号,可选。
五. 打包、签名与部署
a. 打包
构建命令完成后,工程或模块下build目录中会生成相应的hap/hsp/har/app编译产物。
# 根据业务情况,执行相应的构建命令, 示例如下
# clean工程
hvigorw clean --no-daemon
# 构建Hap, 生成产物:${PROJECT_PATH}/{moduleName}/build/{productName}/outputs/{targetName}/xxx.hap
hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
# 构建Hsp, 生成产物:${PROJECT_PATH}/{moduleName}/build/{productName}/outputs/{targetName}/(xxx.har | xxx.hsp)
hvigorw assembleHsp --mode module -p module=library@default -p product=default --no-daemon
# 构建Har, 生成产物:${PROJECT_PATH}/{moduleName}/build/{productName}/outputs/{targetName}/outputs/xxx.har
hvigorw assembleHar --mode module -p module=library1@default -p product=default --no-daemon
# 构建App, 生成产物: ${PROJECT_PATH}/build/outputs/{productName}/xxx.app
hvigorw assembleApp --mode project -p product=default -p buildMode=debug --no-daemon
- 表1 HarmonyOS应用构建常用扩展参数
| 选项 | 说明 |
|---|---|
| -p buildMode= | 采用debug/release模式进行编译构建。 缺省时:构建Hap/Hsp/Har时为debug模式,构建App时为release模式。 |
| -p product= | 指定product进行编译, 编译product下配置的module target。 缺省时:默认为default。 |
| -p module={ModuleName}@ | 指定模块及target进行编译,可指定多个相同类型的模块进行编译以逗号分割;TargetName不指定时默认为default。 限制:此参数需要与--mode module参数搭配使用。 缺省时:执行AssembleHap任务会编译工程下所有模块,默认指定target为default。 |
| -p ohos-test-coverage= | 执行测试框架代码覆盖率插桩编译。 |
- 表2 HarmonyOS应用编译构建相关任务
| 选项 | 说明 |
|---|---|
| clean | 清理构建产物 |
| assembleHap | 构建Hap应用 |
| assembleApp | 构建App应用 |
| assembleHsp | 构建Hsp包 |
| assembleHar | 构建Har包 |
b. 签名
签名方式
- 自动签名 (Auto Signing):通过 DevEco Studio 自动生成并配置调试证书,适合日常真机调试。
- 操作方式:在 IDE 的
Signing Configs 中勾选 Automatically generate signature。 - 资源文件获取:自动连接华为开发者帐号在线获取(需要连接外网)。
- 手动签名 (Manual Signing):由开发者自行管理密钥库文件,根据证书来源和工具不同分为两个子类:A. 官方渠道方式 (标准 App 开发)在官网申请合规证书后,在 IDE 中手动关联文件。
- 操作方式:在
Signing Configs 中手动填入.p12、.cer、.p7b文件路径。 - 资源文件获取:从 AppGallery Connect 或华为开发者联盟后台申请下载。
B. 命令行方式 (系统级/定制化开发)使用内置工具对 HAP 包进行特权签名。
- 操作方式:使用
hap-sign-tool 命令行工具,通过指令配置私有密钥和 Profile。 - 资源文件获取:从本地的 OpenHarmony SDK 中获取:秘钥库、Profile 证书、签名工具等文件。
签名流程
这里介绍的是以命令行方式进行手动签名的方法,签名所需文件如下:
- 签名密钥库文件:
OpenHarmony.p12 -
Profile 签名证书:OpenHarmonyProfileRelease.pem、OpenHarmonyProfileDebug.pem -
Profile 模板文件:UnsgnedReleasedProfileTemplate.json、UnsgnedDebugProfileTemplate.json - 签名工具:
hap-sign-tool.jar
以上文件可在SDK中会获得(也可以在 dist · OpenHarmony/developtools_hapsigner 里获取):

-
rootCA.cer:OpenHarmony 系统内置根签名文件 -
subCA.cer:OpenHarmony 系统内置中间签名文件
上述文件可以在 autosign/result · OpenHarmony/developtools_hapsigner 里获取
- 生成密钥对(.p12)
java -jar hap-sign-tool.jar generate-keypair -keyAlias "oh-app1-key-v1" -keyAlg "ECC" -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "123456" -keystorePwd "123456"
接口说明:
generate-keypair : 生成密钥对
├── -keyAlias # 密钥别名,必填项,不区分大小写
├── -keyPwd # 密钥口令,可选项
├── -keyAlg # 密钥算法,必填项,包括RSA/ECC
├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384
├── -keystoreFile # 密钥库文件,必填项
├── -keystorePwd # 密钥库口令,可选项
- 生成应用签名证书(.pem)
- 格式: PEM(Privacy Enhanced Mail)是一种文本格式,使用 Base64 编码。
- 内容结构: .pem 格式的优势在于它可以包含多个证书,按照顺序堆叠在一起,从而形成完整的证书链 (Certificate Chain)(即:您的应用证书 + 中间 CA 证书 + 根 CA 证书)。
- 鸿蒙中使用: 在鸿蒙的 OpenHarmony 或某些手动签名场景中,appCertFile 参数要求传入的证书链通常是合并后的 .pem 格式。
java -jar hap-sign-tool.jar generate-app-cert -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "app1.pem" -keyPwd "123456" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365"
接口说明:
generate-app-cert:生成应用签名证书
├── -keyAlias # 用于生成应用签名证书的密钥别名,请与第一步生成密钥对的密钥别名-keyAlias保持一致
├── -signAlg # 签名算法,必填项,包括 SHA256withECDSA / SHA384withECDSA
├── -issuer # 颁发者主题,填写已提供的中间CA证书主题,该参数必填且不能修改
├── -issuerKeyAlias # 颁发者密钥别名,填写中间CA证书密钥别名,该参数必填且不能修改
├── -subject # 证书主题,请参照命令实例中内容保证顺序不变,该参数必填
├── -issuerKeyPwd # 颁发者密钥口令,填写中间CA证书密钥口令,该参数必填,指定“123456”,不可修改
├── -keystoreFile # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改
├── -rootCaCertFile # 根CA证书文件,指定为已提供的根CA证书,该参数必填且不可修改
├── -subCaCertFile # 中间CA证书文件,指定为已提供的中间CA证书,该参数必填且不可修改
├── -outForm # 输出证书文件格式,推荐使用certChain
├── -outFile # 可选项,建议填写,不填则默认输出到控制台
├── -keyPwd # 密钥口令,可选项,为第一步生成的密钥对口令
├── -keystorePwd # 密钥库口令,默认为“123456”
├── -validity # 证书有效期,可选项,默认为3650天
- 生成Profile文件(.p7b)
- Profile模板文件中会定义当前应用名称"bundle-name"、应用的权限等级"apl"。
- 权限等级有normal、system_basic、system_core三种,默认等级为normal。
- 应用名称改为用户自定义的包名即可
{
"version-name": "2.0.0", // 应用版本号(供显示)
"version-code": 2, // 应用内部版本代码(每次更新需递增)
"app-distribution-type": "os_integration", // 应用分发渠道(如 os_integration, app_gallery)
"uuid": "5027b99e-5f9e-465d-9508-a9e0134ffe18", // 配置文件的唯一标识
"validity": { // 配置文件的有效期范围
"not-before": 1594865258,
"not-after": 1689473258
},
"type": "release", // 配置文件类型(debug 或 release)
"bundle-info": { // 应用包和开发者信息容器
"developer-id": "OpenHarmony",
// 发布版应用的签名证书内容
"distribution-certificate": "-----BEGIN CERTIFICATE-----\nMIICFTCCAZmgAwIBAgIEFRGSbjAMBggqhkjOPQQDAwUAMGMxCzAJBgNVBAYTAkNO\nMRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkgVGVh\nbTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjIwNDAy\nMDY1OTA4WhcNMzIwMzMwMDY1OTA4WjBKMRUwEwYDVQQDDAxpZGVfZGVtb19hcHAx\nDTALBgNVBAsTBFVuaXQxFTATBgNVBAoTDE9yZ2FuaXphdGlvbjELMAkGA1UEBhMC\nQ04wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARGc9ftjM6ncln8AqF0AhTsyphc\nhmKWktwgsZwisqy7X+clViYnbw9WpRRoxJYeZ6GL3MUiOHiM9UDpwOmjdYPOo1Iw\nUDAdBgNVHQ4EFgQUG91q9tKNxBRQgQFzfuSnhrP/mKcwDgYDVR0PAQH/BAQDAgeA\nMB8GA1UdIwQYMBaAFNuGtyIW1QuhS7fdJXu58QV9oi1HMAwGCCqGSM49BAMDBQAD\naAAwZQIweNK78cfmJdBVSMowMukZoIevBFNRNVYaUxxWpbn+X2Y9x8STmxqHhPj6\np0wKd9qnAjEAuU/AuW9NO04joHCJnM0I2PkDWJKw+eJiVc3ggLAOJTE9TfXyN0JM\nUdjqqzpQQj4u\n-----END CERTIFICATE-----\n",
"bundle-name": "com.example.zjxapp", // 应用的唯一包名
"apl": "system_core", // 应用权限级别(Ability Privilege Level,如 system_core)
"app-feature": "hos_system_app" // 应用类型标识(如 hos_system_app)
},
"acls": { // 访问控制列表
"allowed-acls": [
""
]
},
"permissions": { // 应用请求的受限权限列表
"restricted-permissions": [
]
},
"issuer": "pki_internal" // 配置文件颁发者
}
使用 hap-sign-tool.jar 工具生成签名Profile。
java -jar hap-sign-tool.jar sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "UnsgnedReleasedProfileTemplate.json" -keystoreFile "OpenHarmony.p12" -outFile "app1-profile.p7b" -keyPwd "123456" -keystorePwd "123456"
接口说明:
sign-profile : ProvisionProfile文件签名
├── -mode # 签名模式,必填项,包括localSign,remoteSign
├── -keyAlias # 密钥别名,必填项,不区分大小写
├── -keyPwd # 密钥口令,可选项
├── -profileCertFile # Profile签名证书(证书链,顺序为实体证书-中间CA证书-根证书),必填项
├── -inFile # 输入的原始Provision Profile文件,必填项
├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
├── -keystoreFile # 密钥库文件,localSign模式时为必填项
├── -keystorePwd # 密钥库口令,可选项
├── -outFile # 输出签名后的Provision Profile文件,p7b格式,必填项
- 生成签名应用包经过上面的步骤之后,得到了如下信息:
- Store file(*.p12):OpenHarmony.12
- keyAlias:oh-app1-key-v1
- Store Password:123456
- key Password:123456
- Profile file(*.p7b):app1-profile.p7b
- certChain file(*.pem):app1.pem
java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "app1.pem" -profileFile "app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "OpenHarmony.p12" -outFile "app1-signed.hap" -keyPwd "123456" -keystorePwd "123456"
接口说明:
sign-app : 应用包和二进制工具签名
├── -mode # 签名模式,必填项,包括localSign,remoteSign
├── -keyAlias # 密钥别名,必填项,不区分大小写
├── -keyPwd # 密钥口令,可选项
├── -appCertFile # 应用签名证书文件(证书链,顺序为实体证书-中间CA证书-根证书),必填项
├── -profileFile # 签名后的Provision Profile文件名,profileSigned为1时为p7b格式,profileSigned为0时为json格式,应用包签名必填项,二进制工具签名选填
├── -profileSigned # 指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项
├── -inForm # 输入的原始文件的格式,枚举值:zip、elf或bin;zip应用包对应zip,二进制工具对应elf,bin应用包为bin,默认zip;可选项
├── -inFile # 输入的原始文件,应用包、elf或bin文件,必填项
├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
├── -keystoreFile # 密钥库文件,localSign模式时为必填项
├── -keystorePwd # 密钥库口令,可选项
├── -outFile # 输出签名后的包文件,必填项
├── -signCode # 是否启用代码签名,1表示开启代码签名,0表示关闭代码签名。可选项。默认对hap、hsp、hqf、elf开启代码签名,通过参数配置为0关闭。
c. 部署
略