当前位置: 首页 > 科技观察

App和Hap,Entry和Feature,BundleName和Package,一定要看懂

时间:2023-03-13 23:23:49 科技观察

想了解更多开源,请访问:开源基础软件社区https://ost.51cto。com前言App与Hap、Entry与feature、bundleName与package是HarmonyOS基础知识必须涵盖的关键词,也是我们最容易忽略的知识点。当我们真正需要它们的时候,我们往往因为没有完全理解它们的意思,从而导致混淆,从而导致它们所造成的问题找不出任何理由。因为刚开始的时候往往没有它们的典型案例,尤其是比较深的对比案例的演示,往往会导致理解不清。下面我将结合他们的案例以及他们造成的具体bug进行对比,并进行详细的说明。相信看完我的文章后,您会充分了解它们的重要作用,不会再低估它们。下面的App和Hap、Entry和feature直接引用了官网的描述。官网上的这段小段子其实包含了很多信息,尤其是刚入门的时候看这段话,往往会有一点理解,所以很多知识是需要反复咀嚼的,那就是,刚入门的时候看一遍。中途遇到相关知识再看一遍,后面学到一定程度再回去再看一遍,会有不一样的滋味。App包就是我们最终使用DevEcoStudio打包发布到华为应用市场的软件包。如何打包成App包,如下图:打包后的App包所在位置如下图:将这个App包发布到哪里,如下图:发布到应用后市场等待官方审核完成后,即可通过应用市场将应用安装到手机上。最后说一下app包:app包不能直接安装在手机上运行,??也就是不能通过hdc工具安装,也不能复制到手机上点击安装。它仅用于发布到应用商店。那么发布前如何调试呢?在发布之前,只能借助hap包进行调试。我们也可以在DevEcoStudio中构建hap。如果鼠标选中单个模块开始构建,则只会构建该模块的hap包。如果选择整个项目开始构建,则该项目下的所有模块都会构建hap包。搭建完成后的位置如下:我的项??目中有两个模块,分别是entry和myapplication,myapplication是一个feature类型,这个feature携带了FA。上面的entry和myapplication都带有FA,也就是都有UI页面。它们在调试阶段可以通过hdc工具直接安装到手机上独立运行调试,并且有自己的UI页面,但是我们安装到手机上之后你会发现一个重要的区别,entry会创建一个桌面上的入口图标,功能没有入口图标。也就是说,您不能通过桌面门户直接打开该功能。最终发布时,会加入到整个App包中进行发布。发布后,您可以通过与能力相关的API接口调用该特性中的相关FA。这里的坑是因为feature和entry共享同一个bundleName,所以手机上只能安装一个同bundleName的应用。在调试阶段,每一个hap都被当作一个独立的应用,这就导致了这两个hap不能同时安装在手机上。安装一个会先自动卸载另一个,但是app包发布后才有可能,因为app包是一个独立的应用(里面包含多个haps,正式发布后是独立的。应用是以app为单位的而不是hap)。这会在实际项目制作中带来很大的问题。比如我做了一个很大的项目应用,里面有一个入口,还有很多功能。在调试阶段,同一部手机不能同时安装这些入口和特性进行测试。而且我打包成app后无法安装到手机上进行测试。发布到应用商店后再去测试就更扯淡了。相信很多大厂在开发HarmonyOS应用的时候都遇到过这个问题。这里我只能给出一个体验不好的解决方案,即调试阶段每次hap使用不同的bundleName,代码中需要用到的bundleName必须同步修改。测试完成后,在发布之前,全部修改回同一个bundleName。bundleName和package在上面已经提到了bundleName的一个重要作用。下面详细分析一下bundleName和package这两个概念的对比和陷阱,防止大家一头雾水掉入陷阱。首先我们看一下官网对bundleName和package的解释,如下图:官网说bundleName是应用的包名。如果是java或者Android开发的,小伙伴们可能会晕,会误以为这不是包?其实把去掉它的那句话理解为表示应用程序的包名更好。直接说就是应用的唯一标识,就是你的手机不能同时安装两个bundleName相同的应用。Android开发从eclipse过渡到Androidstudio开发后,在gradle配置中增加了一个applicationId。这个bundleName实际上是针对applicationId进行基准测试的。关于这个唯一标识的作用,在上面讲解App和Hap的时候已经详细说明了,这里不再赘述。package是真正的包名,是每个hap的包结构名。同一个App下的bundleName是一样的,只是包名不一样。这个就是我们平时在java中引用的包名。例如有一个名为MainAbility的类,它所属的包名为com.xdw.jstest。我们在使用很多api接口时,往往会调用完整的类名,即com.xdw.jstest.MainAbility。下面将结合一个核心的JsApi来说明bundleName和package组合的应用场景,容易混淆和出错。对了,从Api8开始,HarmonyOS就彻底抛弃了java,这里使用的api也是8版本。截取官网某个API的使用说明,如下图:以后遇到这种API的时候要小心了。下面abilityName前面的一长串是package,不是bundleName。官网截图中的都是同一个字符串。但是不要误以为它们一定是一样的。调用此类API时,一定要在module下的config.json文件中仔细复制自己的bundleName和package,尤其是最新992版的DevEcoStudio开发工具。项目中只提供了输入bundleName的地方,没有提供输入package的地方,默认生成的package和bundleName是不一样的。如果你想当然地认为它们是一样的,那么在调用上图中的api时,就会导致api无法生效。小结相信看完整篇文档,你不会再对这些重要的概念感到困惑。了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。