【HarmonyOS NEXT】FAQ之应用框架(程序包结构2)

1、如何判断应用可被卸载

A:两种方法

  1. 使用bundleManager.getApplicationInfo获取applicationInfo应用程序信息。

  2. applicationInfo应用程序信息具有removable属性,可通过该属性判断应用是否可被卸载。

2、HAR、HSP不能支持ability、Page声明,限制的理由是什么?后续是否会支持

A:Page:HAR和HSP支持page;只不过HAR中的page需要通过命名路由的方式跳转,详见下面的参考资料。

Ability:HAR和HSP不支持,后续也没有支持的计划,推荐在HAP中配置Ability。

3、是否允许HAR的循环依赖

A:不允许循环依赖。

4、HAP依赖HAR A,HAR A依赖HAR B,HAP能否调用HAR B提供的接口?如果不支持间接依赖HAR,这么设计的原因是什么?

A:不支持传递依赖。

间接依赖的版本是不可控的,如果代码里使用到某个版本的间接依赖,不同时间安装的依赖可能版本不一致,程序运行可能出现意想不到的错误。举例说明:依赖关系:project->A(1.0.0)->B(^1.0.0)->C (latest)

在dependencies只声明了A,但是工程中import了B和C。而B和C的版本是不可控的,如果C的开发者发布了一个2.0.0的版本,下次安装依赖时,可能会安装C的2.0.0的版本。然后就有可能出现一些问题,例如:在代码没有任何改动的情况下,程序运行却出现报错,不同时间不同PC上构建的应用运行表现不一致等。

所以ohpm为了解决幽灵依赖的问题,设计了一个特殊的存储结构,从技术上进行限制、不允许引用间接依赖,从而避免出现幽灵依赖问题。在上面例子中表现就是:代码里只能引用A,引用B或C就会编译报错,提醒用户修改依赖配置。

5、HAP/HAR/HSP的关系是什么?是否都可以声明注册Ability和Page?三种类型分别推荐哪些的使用场景?选择原则是什么

A:详细如下

HAP:应用安装和运行的基本单元。支持在配置文件中声明abilities、extensionAbilities组件,支持在配置文件中声明pages页面。

主要使用场景:

  • Entry:应用的主模块,用于实现应用的入口界面、入口图标、主特性功能等。

  • Feature:应用的特性模块,用于实现应用的特性功能。

HAR:静态共享包。编译态复用,不支持在配置文件中声明abilities、extensionAbilities组件,不支持在配置文件中声明pages页面,支持Navigation组件导航。

主要使用场景:

  • 作为二方库,发布到OHPM私仓,供公司内部其他应用依赖使用。

  • 作为三方库,发布到OHPM中心仓,供其他应用依赖使用。

HSP:动态共享包。运行时复用,不支持在配置文件中声明abilities、extensionAbilities组件,支持在配置文件中声明pages页面。

主要使用场景:

  • 多模块共用的代码、资源可以使用HSP,提高代码的可重用性和可维护性。

  • 元服务分包预加载。

6、如何跨模块访问HSP/HAR包中resources目录的element目录、media目录和rawfile目录资源文件

A:可以通过以下几种方式访问HSP/HAR里面的资源:

  • 通过createModuleContext(moduleName)接口创建同应用中不同module的上下文,获取resourceManager对象后,调用不同接口访问不同资源。

    例如:getContext.createModuleContext(moduleName).resourceManager.getStringByNameSync('app.string.xxx')。

  • 通过"$r"或"$rawfile"引用资源,例如:Text($r('[hsp].string.test_string')),其中“hsp”为HSP包模块/HAR包模块的名称。

    说明

    在HarmonyOS NEXT Developer Beta1及以上版本支持直接通过"$r"或"$rawfile"引用HSP或者HAR包的资源。

  • 通过HSP包下实现一个资源管理类,以封装对外导出的资源。

    HAP中访问HAR包中resources目录的rawfile原始文件资源。

    例如在HAR包(不妨设名称为library)的“\library\src\main\resources\rawfile”目录中有“iconHar.png”文件。

    1. 在HAR包中将rawfile目录下的“iconHar.png”文件封装成一个方法,例如在“\library\src\main\ets\components\mainpage\MainPage.ets”文件中封装一个方法。

      export function rawFileIconHarPng() {  return $rawfile('iconHar.png');}
    2. 在“\library\Index.ets”文件中导出rawFileIconHarPng()方法。

      export { rawFileIconHarPng } from './src/main/ets/components/mainpage/MainPage';
    3. 在HAP中的“entry\src\main\ets\pages\Index.ets”文件中通过导入rawFileIconHarPng()方法后直接使用即可。

      import { rawFileIconHarPng } from 'library';
      @Entry@Componentstruct Index {  
          build() {    
              Row() {      
                  Column() {        
                      Image(rawFileIconHarPng())          
                          .width(100)          
                          .height(100)      
                  }      .width('100%')    }    
              .height('100%')  
          }
      }

7、如何正确处理HAR/HSP包模块间的依赖关系

A:在HarmonyOS应用开发过程中,处理包(HAR/HSP)模块间的依赖是一个常见的需求。正确的依赖处理方式不仅能确保代码的模块化和可维护性,还能减少团队开发中的管理和沟通成本。以下是关于如何引用包模块的推荐和不推荐做法。

  • 推荐方式:

    import { add } from "library";

  • 不推荐方式:

    使用相对路径或绝对路径进行引用:虽然技术上可行,但这种做法不推荐。使用相对或绝对路径引用模块会破坏模块间的隔离性,增加团队开发的管理和沟通成本,且难以维护。例如:

    import { add } from "../../library/src/main/ets/page/Index";

8、如何引用HSP库

A:如需在应用内共享HSP,请将HSP共享包上传至私仓,动态共享包 HSP 包不能直接发布在私仓内,需要先转化为 .tgz 包,请先按以下操作编译生成*.tgz包。

1.将编译模式切换成release模式。

点击放大

2.选中HSP模块的根目录,点击Build > Make Module ${libraryName}启动构建。

img

3.构建完成后,build目录下生成HSP包产物,其中.tgz用来上传至私仓(请参考将三方库发布到 ohpm-repo)。

点击放大

4.上传到仓里然后通过ohpm install的方式安装到工程的依赖里(oh-package.json5的dependencies字段),然后就可以看到对应HSP里对外共享的方法等。

9、从HAP的拆包中,如何区分是HAR和HSP

A:HAP包拆包只能在module.json文件的dependencies字段看到引用的HSP模块名,看不到引用的HAR。这是因为HAR在编译的时候已经打包在HAP包里了。HSP是单独成包的,.app文件安装时HSP与HAP是处于同一级别的。

10、在HAP中调用createModuleContext方法获取的Context是什么层级

A:四点注意

  1. createModuleContext获取的是基类Context,主要是用来根据不同模块名获取Context,分别指向不同的HSP。

  2. HSP只是一个动态共享包,其包含了静态资源,但是本身是没有上下文的概念。所以需要通过创建Context的方式去获取该资源或者Module的信息。

  3. createModuleContext获取的是一个通用的、模块级的Context,不是ApplicationContext。

  4. 所有的上下文都可以理解为单例模型:它总是指向应用或特定UIAbility的上下文,通过它获取的信息和执行的行为针对也直接是应用或特定UIAbility。

11、如何获取当前HAP的BundleName

A:通过bundleManager模块的getBundleInfoForSelf接口获取所有信息:

GET_BUNDLE_INFO_DEFAULT:接口默认的参数,返回结果的name字段对应BundleName。

GET_BUNDLE_INFO_WITH_APPLICATION:除基本字段外,能够额外获取到ApplicationInfo字段,ApplicationInfo的name字段也对应BundleName。

12、如何实现在不使用UIAbility的情况下,能够模块化管理代码,并且各个模块之间可以相互路由跳转

A:采用HSP进行模块管理,可以实现页面之间的跳转,无需导入导包即可跳转,跳转方式如下:

方式一:所有跳转到HSP内的页面需要使用特定的格式跳转:’@bundle:包名(bundleName)/模块名(moduleName)/路径/页面所在的文件名(不加.ets后缀)’。

方式二:正常entry内模块路由跳转:‘pages/页面所在的文件名(不加.ets后缀)’。

  • entry跳转到HSP页面:使用方式一。

  • HSP跳转到entry页面:使用方式二。

  • HSP跳转到HSP页面:使用方式一。

更多详情查看 :文档中心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值