1、如何判断应用可被卸载
A:两种方法
-
使用bundleManager.getApplicationInfo获取applicationInfo应用程序信息。
-
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”文件。
-
在HAR包中将rawfile目录下的“iconHar.png”文件封装成一个方法,例如在“\library\src\main\ets\components\mainpage\MainPage.ets”文件中封装一个方法。
export function rawFileIconHarPng() { return $rawfile('iconHar.png');}
-
在“\library\Index.ets”文件中导出rawFileIconHarPng()方法。
export { rawFileIconHarPng } from './src/main/ets/components/mainpage/MainPage';
-
在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}启动构建。
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:四点注意
-
createModuleContext获取的是基类Context,主要是用来根据不同模块名获取Context,分别指向不同的HSP。
-
HSP只是一个动态共享包,其包含了静态资源,但是本身是没有上下文的概念。所以需要通过创建Context的方式去获取该资源或者Module的信息。
-
createModuleContext获取的是一个通用的、模块级的Context,不是ApplicationContext。
-
所有的上下文都可以理解为单例模型:它总是指向应用或特定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页面:使用方式一。
更多详情查看 :文档中心