• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 原子化服务
2
3## 原子化服务分包预加载
4
5### 使用分包
6
7为了加快首次启动原子化服务时的速度,可以采用分包策略,原子化服务的代码包可以被划分为几个:一个是类型为entry的模块,包含原子化服务启动时会打开的页面代码和相关资源;其余是“分包”,包含其余的代码和资源。这样,启动原子化服务时,只需下载和安装entry模块,即可立刻启动原子化服务,大大降低原子化服务下载的时间。
8
9#### 配置方法
10
11原子化服务分包可以在`DevEco Studio`中创建,我们以创建一个原子化服务为例。基本的工程目录结构大致如下:
12
13```
14├── AppScope
15|    ├── resources
16|    └── app.json5
17├── entry
18|    └── src/main
19|       ├── ets
20|       ├── resources
21|       └── module.json5
22├── feature
23|    └── src/main
24|       ├── ets
25|       ├── resources
26|       └── module.json5
27├── library
28|    └── src/main
29|       ├── ets
30|       ├── resources
31|       └── module.json5
32├── node_modules
33```
34
35注意,开发者需要在[app.json5](app-configuration-file.md)中`bundleType`字段指定为`atomicService`,标识当前应用是原子化服务。`app.json5`(路径为:`AppScope/app.json5`)的内容为:
36
37```json
38{
39  "app": {
40    "bundleName": "com.example.hmservice",
41    "bundleType":"atomicService",
42    "vendor": "example",
43    "versionCode": 1000000,
44    "versionName": "1.0.0",
45    "icon": "$media:app_icon",
46    "label": "$string:app_name",
47    "targetAPIVersion": 9
48  }
49}
50```
51
52具体分包攻略,详细可参考[多hap开发](multi-hap-objective.md)。
53
54#### 限制
55
561. 原子化服务中每个模块对应的配置文件[module.json5](module-configuration-file.md)中`installationFree`字段必须为`true`。
57
582. 打包原子化服务时,需遵循以下大小校验规则:
59
60- 原子化服务中,所有包的大小总和不能超过10M。
61
62- 单个包加上其依赖的所有[共享包](in-app-hsp.md),大小不能超过2M。
63
64
65### 使用预加载
66
67开发者可以通过配置,在原子化服务进入某个模块时,由系统自动预下载可能需要的模块,从而提升进入后续模块的速度。
68
69原子化服务预加载目前只支持通过配置方式使用,暂不支持通过调用API使用。
70
71#### 配置方法
72
73原子化服务预加载行为在点击进入某个模块时,第一帧绘制结束之后触发,可以通过在相应模块的[module.json5](module-configuration-file.md)文件中配置`atomicService`标签下的`preloads`字段来控制,以下为entry模块的`module.json5`(路径为:`entry/src/main/module.json5`)文件内容:
74
75```json
76{
77  "module": {
78    "name": "entry",
79    "type": "entry",
80    "srcEnty": "./ets/Application/MyAbilityStage.ts",
81    "description": "$string:entry_desc",
82    "mainElement": "MainAbility",
83    "deviceTypes": [
84      "default",
85      "tablet"
86    ],
87    "deliveryWithInstall": true,
88    "installationFree": true,
89    "pages": "$profile:main_pages",
90    "atomicService": {
91      "preloads": [
92        {
93          "moduleName": "feature"
94        }
95      ]
96    },
97    "abilities": [
98      {
99        "name": "MainAbility",
100        "srcEnty": "./ets/MainAbility/MainAbility.ts",
101        "description": "$string:MainAbility_desc",
102        "icon": "$media:icon",
103        "label": "$string:MainAbility_label",
104        "startWindowIcon": "$media:icon",
105        "startWindowBackground": "$color:white",
106        "exported": true,
107        "skills": [
108          {
109            "entities": [
110              "entity.system.home"
111            ],
112            "actions": [
113              "action.system.home"
114            ]
115          }
116        ]
117      }
118    ]
119  }
120}
121```
122
123在完成entry模块的第一帧绘制结束后,会自动执行预加载去下载和安装模块名为feature的模块。
124
125#### 限制
126
127preloads列表配置的moduleName对应的[moduleType(模块类型)](../reference/apis/js-apis-bundleManager.md#moduletype)不能为entry。
128
129## 原子化服务中使用动态共享包
130
131[Harmony动态共享包](shared-guide.md)(Harmony Shared Package),简称HSP,其可以包含其他模块公用的代码、C++库、资源和配置文件等。
132在原子化服务中使用HSP,可以参考[应用内HSP开发指导](in-app-hsp.md)。
133
134#### 配置方法
135
136假设工程目录结构如下:
137```
138├── AppScope
139|    ├── resources
140|    └── app.json5
141├── entry
142|    └── src/main
143|       ├── ets
144|           ├── entryAbility
145|           └── pages
146|               └── Index.ets
147|       ├── resources
148|       └── module.json5
149├── feature
150|    └── src/main
151|       ├── ets
152|       ├── resources
153|       └── module.json5
154├── library
155|    └── src/main
156|       ├── ets
157|           └── pages
158|               └── menu.ets
159|       ├── resources
160|       └── module.json5
161├── node_modules
162```
163
164若开发者想在entry模块中,添加一个按钮跳转至library模块中的menu页面(路径为:`library/src/main/ets/pages/menu.ets`),那么可以在使用方的代码(entry模块下的Index.ets,路径为:`entry/src/main/ets/MainAbility/Index.ets`)里这样使用:
165
166```ts
167import router from '@ohos.router';
168
169@Entry
170@Component
171struct Index {
172    @State message: string = 'Hello World'
173
174    build() {
175    Row() {
176        Column() {
177        Text(this.message)
178            .fontSize(50)
179            .fontWeight(FontWeight.Bold)
180        // 添加按钮,以响应用户点击
181        Button() {
182            Text('click to menu')
183            .fontSize(30)
184            .fontWeight(FontWeight.Bold)
185        }
186        .type(ButtonType.Capsule)
187        .margin({
188            top: 20
189        })
190        .backgroundColor('#0D9FFB')
191        .width('40%')
192        .height('5%')
193        // 绑定点击事件
194        .onClick(() => {
195            router.pushUrl({
196              url: '@bundle:com.example.hmservice/library/ets/pages/menu'
197            }).then(() => {
198              console.log("push page success");
199            }).catch(err => {
200              console.error(`pushUrl failed, code is ${err.code}, message is ${err.message}`);
201            })
202        })
203      .width('100%')
204    }
205    .height('100%')
206    }
207  }
208}
209```
210
211其中`router.pushUrl`方法的入参中`url`的内容为:
212```ets
213'@bundle:com.example.hmservice/library/ets/pages/menu'
214```
215`url`内容的模板为:
216```ets
217'@bundle:包名(bundleName)/模块名(moduleName)/路径/页面所在的文件名(不加.ets后缀)'
218```