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```