# 17.9:项目签名和打包

《极简计算器》项目开发完成后,就可以对其打包外发布了,对外发布前需要对其进行签名操作,目的是保证应用的完整性和来源可靠性,应用经过签名后才可以在设备上安装、运行和调试,本节笔者简单介绍一下 OpenHarmony 项目的签名打包操作。

# 17.9.1:添加签名配置

对 OpenHarmony 项目签名有两种方案,一种是使用 Dev Eco Studio 自带的自动化签名方案,另一种是手动签名方案。

  • 自动化签名方案

    Dev Eco Studio 为开发者提供了自动化的签名方案,可以一键完成应用签名配置,具体操作如下:

    1. 点击 Dev Eco Studio 的 File 菜单项,选择 Project Structure,如下所示:

      17_9_1_1
    2. Project Structure 页面选择 Project,然后在 Signing Configs 界面勾选 Automatically generate signing,等待自动签名完成即可,点击 OK,如下图所示:

      17_9_1_2
    3. 设置完自动化签名配置后,项目根目录下的 build-profile.json5 中会自动添加签名配置,内容如下所示:

      17_9_1_3

    📢:如果在 config.json 中配置了system_basic权限 (opens new window),可以点击 Show Restricted Premissions 查看使用的受限权限,然后在使用自动签名时,DevEco Studio会自动将受限权限添加到签名文件中。

  • 手动签名方案

    由于API 7 和 API 8 对应的签名工具不同,因此签名方案会存在不同,笔者就不再介绍这两种签名方案的具体操作了,读者可在官网查看具体操作。

# 17.9.2:项目打包

签名信息配置之后,就可以对项目打包然后在真机设备上运行查看运行效果了,对项目打包前为了消除历史编译构建生成的文件对构建结果的影响,在新的编译构建操作前通常先进行文件清理操作。

点击 Dev Eco Studio 的 Build 菜单项,选择 Clean Project 选项进行清理,如下图所示:

17_9_2_1

执行清理操作后,就可以打 Hap 包了,选择 Build Hap(s)/APP(s) > Build Hap(s),如下所示:

17_9_2_2

Build Hap(s) 执行完后,就可以在 entry 目录下的 build 文件夹下查看打包的 hap 文件了,如下图所示:

17_9_2_3

# 17.9.3:Hap包结构探究

OpenHarmony 的 hap 包本质上是一个压缩包,可以更改后缀名解压压缩包看下 hap 包里的文件结构,笔者解压出来的文件结构如下所示:

17_9_3_1

hap 包解压后,里边包含了一个 assets 目录和两个配置文件,assets 里边存放的是资源文件和 ets 源码编译后的文件,configs.json 和 pack.info 是 hap 包的配置文件,config.json 如下图所示:

{
    "app": {
        "apiVersion": {
            "compatible": 8,
            "releaseType": "Release",
            "target": 8
        },
        "bundleName": "com.arkui.simple.calculator",
        "vendor": "example",
        "version": {
            "code": 1000000,
            "name": "1.0.0"
        }
    },
    "deviceConfig": {
        "default": {
            "debug": true
        }
    },
    "module": {
        "abilities": [
            {
                "description": "$string:calculator",
                "descriptionId": 16777216,
                "formsEnabled": false,
                "icon": "$media:ic_launcher",
                "iconId": 16777221,
                "label": "$string:calculator",
                "labelId": 16777216,
                "launchType": "standard",
                "name": ".MainAbility",
                "orientation": "unspecified",
                "skills": [
                    {
                        "actions": [
                            "action.system.home"
                        ],
                        "entities": [
                            "entity.system.home"
                        ]
                    }
                ],
                "srcLanguage": "ets",
                "srcPath": "MainAbility",
                "type": "page",
                "visible": true
            }
        ],
        "deviceType": [
            "phone",
            "tablet"
        ],
        "distro": {
            "deliveryWithInstall": true,
            "installationFree": false,
            "moduleName": "entry",
            "moduleType": "entry",
            "virtualMachine": "ark" // 项目打包时添加的额外字段
        },
        "js": [
            {
                "mode": {
                    "syntax": "ets",
                    "type": "pageAbility"
                },
                "name": ".MainAbility",
                "pages": [
                    "pages/main/index",
                    "pages/setting/index",
                    "pages/setting/login"
                ],
                "window": {
                    "autoDesignWidth": false,
                    "designWidth": 720
                }
            }
        ],
        "mainAbility": ".MainAbility",
        "name": ".entry",
        "package": "com.example.entry",
        "reqPermissions": [
            {
                "name": "ohos.permission.DISTRIBUTED_DATASYNC"
            }
        ],
        "srcPath": ""
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

config.json 是项目里的默认配置文件,只是在打包的时候添加了一些额外的默认配置,比如 distro 下添加了值为 arkvirtualMachine 字段,表示当前 hap 包表运行在 ark 虚拟机里,其他的字段说明,读者自行查看文档介绍。

pack.info 内容如下所示:

{
    "summary": {
        "app": {
            "bundleName": "com.arkui.simple.calculator",
            "version": {
                "code": 1000000,
                "name": "1.0.0"
            }
        },
        "modules": [
            {
                "mainAbility": ".MainAbility",
                "deviceType": [
                    "phone",
                    "tablet"
                ],
                "abilities": [
                    {
                        "name": ".MainAbility",
                        "label": "$string:calculator",
                        "visible": true
                    }
                ],
                "distro": {
                    "moduleType": "entry",
                    "installationFree": false,
                    "deliveryWithInstall": true,
                    "moduleName": "entry"
                }
            }
        ]
    },
    "packages": [
        {
            "deviceType": [
                "phone",
                "tablet"
            ],
            "moduleType": "entry",
            "deliveryWithInstall": true,
            "name": "entry-default-unsigned"
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

看pack.info里的字段配置,是 config.json 的精简版,这个没什么好介绍的,接下来我们看下assets目录下的文件。entry 目录下存储的是项目里的资源文件,这里主要看js目录下的文件,截图如下所示:

17_9_3_2

源码 ets 文件打包成了 js 文件和 abc 文件,了解过方舟编译器的读者应该清楚 abc 文件表示方舟字节码(ark bytecode,简称 abc),所以项目运行的时候 ark 虚拟机需要加载运行这些 abc 文件,这对我们接下来分析 APP 的启动是有帮助的。map 文件内容截取如下:

{
    "version": 3,
    "file": "./app.js",
    "mappings": ";;;;;;;;;;;;AACA****;WAEA;WACA;WACA;;;;;UEhDA;UACA;UACA;UACA;UACA",
    "sources": [
        "webpack:***/SimpleCalculator/entry/src/main/ets/MainAbility/app.ets",
        "webpack:***/SimpleCalculator/entry/src/main/ets/MainAbility/common/manager/expression_manager.ets",
        "webpack:***/SimpleCalculator/entry/src/main/ets/MainAbility/common/modules/expression.ets",
        "webpack:///webpack/bootstrap",
        "webpack:///webpack/runtime/chunk loaded",
        "webpack:///webpack/runtime/hasOwnProperty shorthand",
        "webpack:///webpack/runtime/jsonp chunk loading",
        "webpack:///webpack/before-startup",
        "webpack:///webpack/startup",
        "webpack:///webpack/after-startup"
    ],
    "names": [
    ],
    "sourceRoot": ""
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

map文件也是一个配置项,整个项目打包后的结构就是这样了,读者大致清楚打包后的文件结构就行了。

笔者接下来尝试从源码角度分析一下 hap 包安装在设备后,在桌面点击 APP 图标,项目的启动过程,比如 ability 的启动,abc 的加载解析,acecontainer、component、element、rendernode以及 fronted 等,敬请期待……

(adsbygoogle = window.adsbygoogle || []).push({});
请作者喝杯咖啡

津公网安备 12011402001367号

津ICP备2020008934号-2