#HarmonyOS NEXT体验官#ArkUI-X支持动态化探索 原创

小方头狮子
发布于 2024-8-5 07:38
浏览
0收藏

ArkUI-X支持动态化探索

ArkUI-X支持动态化,使用者可以根据自己需要动态发布跨平台内容,从而使跨平台部分和宿主应用进行解耦。动态化能力支持如下两个典型场景:

  1. 框架动态化:指ArkUI跨平台开发框架本身可以做到动态下发,即应用发布时可以不带框架基础库,降低应用原始发布包体积,在需要时才从云端动态下发和执行加载;

  2. 特性动态化:指用ArkTS语言开发的特性可以做到动态化,和宿主应用解耦,独立发布、升级版本;

说明:应用在使用动态化能力时需要遵循目标终端操作系统应用上架规则,如果违规可能有下架风险,风险由各自应用承担。

这里我们以安卓为例,给大家举例说明,首先在开始之前,我们一起来看一下它的适用场景。

适用场景

动态化主要包括两个典型场景:

  • 场景1:框架动态化,为了降低应用ROM体积占用,及满足动态升级框架目的;
  • 场景2:特性Bundle动态化,特性和宿主应用发布解耦;

了解完以后,我们就可以进入到开发的步骤。

开发指南

这里面的开发,我们从三个维度去考虑,

  1. 目录结构
  2. 加载优先级
  3. 框架初始化

接下来我们进入正题。

目录说明

应用沙箱内目录架构

动态加载时要求应用沙箱内目录架构如下所示:

/data/data/应用/files/arkui-x    
├── feature1                    # 跨平台特性1
│   ├── ets                     # ets目录
│   │   ├──sourceMaps.map
│   │   └──modules.abc
│   ├── resources.index         
│   ├── resources              
│   ├── module.json
│   └── libs                    # 特性bundle带的so库
│       ├── arm64-v8a
│       ├── armeabi-v7a
│       └── x86_64  
├── systemres                   # ArkUI公共资源
└── libs                        # 根目录下libs库
    ├── arm64-v8a               
    │    └──libarkui_android.so    # ArkUI-X引擎
    ├── armeabi-v7a           
    └── x86_64
  1. /data/data/应用/files/arkui-x 可以视为ArkUI-X动态加载的沙箱根目录,框架和特性Bundle均需要放在这个目录下;

  2. 根目录下的libs文件夹放置引擎(libarkui_android.so),及其他公共库;

  3. 根目录下要求按照module级别组织,不可以重名

为了帮助大家理解,我觉得我有必要把ArkUI-X应用工程目录结构也给大家提醒一下。

ArkUI-X应用工程目录结构

ArkUI-X应用工程目录结构
  ├── .arkui-x
  │   ├── android                 // Android平台相关代码
  │   └── ios                     // iOS平台相关代码
  ├── AppScope
  ├── entry
  ├── hvigor
  ├── build-profile.json5
  ├── hvigorfile.ts
  ├── hvigorw
  ├── hvigorw.bat
  ├── local.properties
  └── oh-package.json5

以及Android的应用目录结构

Android应用目录结构

ArkUI-X Android应用工程
├── app
│   ├── libs
│   │   ├── arkui_android_adapter.jar                   // ArkUI-X跨平台适配层,在SDK中发布
│   │   └── arm64-v8a
│   │       └── libarkui_android.so                     // ArkUI-X跨平台引擎库,在SDK中发布
│   │       └── libhilog.so                             // ArkUI-X日志库,在SDK中发布
│   │       └── libresourcemanager.so                   // ArkUI-X资源管理库,在SDK中发布
│   ├── src
│   │   ├── androidTest
│   │   ├── main
│   │   │   ├── assets
│   │   │   │   └── arkui-x                             // ArkUI应用编译后的字节码文件和Resources,作为资源文件存放在assets/arkui-x中
│   │   │   │       ├── entry                           // ArkUI单个模块的编译结果
│   │   │   │       │   ├── ets                         // ArkUI单个模块代码的编译结果:包括字节码文件以及sourceMap文件
│   │   │   │       │   │   ├── sourceMaps.map
│   │   │   │       │   │   └── modules.abc
│   │   │   │       │   ├── resources.index             // ArkUI单个模块资源的编译结果:resources资源的编译结果
│   │   │   │       │   ├── resources                   // resources资源中的rawfile资源,不会进行编译。
│   │   │   │       │   └── module.json
│   │   │   │       ├── entry_test                      // ohosTest,仅仅Debug模式构建包含。
│   │   │   │       └── systemres                       // ArkUI框架自带的系统资源
│   │   │   ├── java/com/example/mayapp
│   │   │   │   ├── MyApplication.java                  // 基于StageApplication扩展MyApplication
│   │   │   │   └── EntryEntryAbilityActivity.java      // 基于StageActivity扩展EntryEntryAbilityActivity
│   │   │   ├── res
│   │   │   └── AndroidManifest.xml
│   │   └── test
│   ├── build.gradle
│   └── proguard-rules.pro
├── gradle/wrapper
├── build.gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

通过上面的目录结构,不知道大家能不能理解。

最后给大家说一下这里面的应用加载的优先级,以及框架初始化的流程。

加载优先级

  • 引擎so库:优先加载应用lib目录下,如果未找到则去应用沙箱根目录加载;

  • 插件so库:优先加载应用lib目录下,如果未找到则去应用沙箱根目录尝试加载,最后去插件自身的libs目录加载;

  • module加载:优先从应用assets目录下寻找,如果找不到则去沙箱内尝试加载;

  • systemres加载:同上,优先加载应用assets目录,找不到则去沙箱内加载;

    注意:不建议应用同一个module,即预制到应用assets内又在沙箱同时部署。

框架初始化

如果应用使用了框架引擎动态化,首次下载引擎库后将其放置/data/data/应用/files/arkui-x/libs/arm64-v8a

目录,之后再打开对应跨平台界面时初始化框架:

appDelegate = new StageApplicationDelegate();
appDelegate.initApplication(this)

后续再打开应用,建议按照正常流程在Application里初始化框架,提前完全引擎库加载,提高跨平台模块加载速度;

到这里,大家是不是就已经知道啦。

最后我们就可以通过IDE,去开发啦。

最后来看一下我用动态化,开发的应用demo吧。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐