App與Hap、Entry與Feature,BundleName與Packge,務(wù)必弄明白
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
前言
App與Hap,Entry與feature,bundleName與packge這幾個關(guān)鍵字是HarmonyOS入門基礎(chǔ)中必講的,也是我們最容易忽略的知識點,而又真需要用到它們時,往往又會因為沒完全弄明白它們的意思導(dǎo)致混淆不清,導(dǎo)致因為它們產(chǎn)生的問題而找不出原因。
因為前期在剛?cè)腴T的時候往往沒有它們的典型案例,特別是比較深的對比案例做演示,往往會導(dǎo)致對它們的理解不夠清晰。下面我就結(jié)合它們案例和具體因為它們導(dǎo)致的bug來做對比后詳細講解,相信大家看完我這篇文章之后會完全理解它們的重要作用了,也不會再輕視它們了。
App與Hap、Entry與feature
下面先直接引用官網(wǎng)的一段描述。
官網(wǎng)這小小的一段話,其實信息量還是很大的,特別是剛?cè)腴T的時候看這段話,往往會一知半解,所以好多知識是要反復(fù)咀嚼才行,即剛開始入門的時候看一遍,學(xué)到中途的時候涉及到相關(guān)知識再來看一遍,后面學(xué)到一定程度了再回頭復(fù)盤看一遍就會又有另一番滋味。
App包是我們最終使用DevEco Studio打包發(fā)布到華為應(yīng)用市場的軟件包,如何打包成App包呢,如下圖:
打包之后的App包所在的位置如下圖:
在哪里發(fā)布這個App包呢,如下圖:
發(fā)布到應(yīng)用市場等待官方審核完成之后,你就可以在手機上通過應(yīng)用市場安裝該應(yīng)用了。
最后關(guān)于App包來個點睛的話:App包不能直接安裝到手機上運行,即不能通過hdc工具安裝,也不能拷貝到手機上之后點擊安裝,它僅僅用來向應(yīng)用商店發(fā)布。
那么我發(fā)布之前該如何進行調(diào)試呢?發(fā)布之前只能借助hap包來調(diào)試了。
我們在DevEco Studio中還可以build出hap,如果鼠標(biāo)選中單個module開始build,則只會構(gòu)建該module的hap包,如果選中整個工程project開始build,則工程下的所有module都會構(gòu)建hap包,hap包構(gòu)建完成之后的位置如下圖:
我的工程里面有兩個module,分別為entry和myapplication,而myapplication為feature類型,并且該feature是攜帶FA的。
?上面的entry和myapplication都攜帶了FA,即都有UI頁面,它們都可以在調(diào)試階段直接通過hdc工具安裝到手機上獨立運行調(diào)試,并且都有各自的UI頁面,但是我們安裝到手機上之后會發(fā)現(xiàn)一個重要區(qū)別,entry會在桌面上創(chuàng)建一個入口圖標(biāo),而feature是沒有入口圖標(biāo)的。也就是說Feature你沒法直接通過桌面入口去打開它的,它最終發(fā)布的時候會附加在整個App包中進行發(fā)布,發(fā)布之后可以通過在ability相關(guān)的api接口來調(diào)起來feature中的相關(guān)FA。
這里有個比較坑的點就是,由于feature和entry共用的同一個bundleName,而手機上同一個bundleName的應(yīng)用只能安裝一個,在調(diào)試階段每個hap都被當(dāng)做了一個獨立應(yīng)用,就導(dǎo)致了這兩個hap不能在手機上同時安裝,安裝一個就會自動先卸載掉另一個,但是在以app包發(fā)布之后是可以的,因為app包是一個獨立應(yīng)用(里面包含多個hap,正式發(fā)布之后獨立應(yīng)用是以app為單位的而不是hap了)。這里就會帶來一個實際項目生產(chǎn)中的大問題,比如我做了一個大項目應(yīng)用,里面有一個entry同時還會有很多feature,我調(diào)試階段同一個手機無法同時安裝這些entry和feature進行測試,而我打成app包又不能安裝到手機上進行測試,等發(fā)布到應(yīng)用商店之后再來測試那就更扯淡了。相信很多大廠在做HarmonyOS應(yīng)用開發(fā)的時候都遇到這個問題了吧。
這里我只能給個體驗感不太好的解決方案,那就是在調(diào)試階段給每個hap都取用不同的bundleName,以及代碼中需要使用的bundleName都要同步修改,待測試完成之后,在發(fā)布之前全部統(tǒng)一修改回同一個bundleName。?
bundleName與package
在上面已經(jīng)提到了bundleName的一個重要作用,下面就來具體分析下bundleName與package這兩個概念的對比以及坑點,防止大家混淆和入坑。
首先還是來看官網(wǎng)描述bundleName和package的解釋,如下圖:
官網(wǎng)說了bundleName是應(yīng)用的包名,如果是從java或者Android開發(fā)過來的朋友估計就暈了,會誤以為這不就是package嗎?
其實去掉它表示應(yīng)用的包名這句話就更好理解了,直接說它是應(yīng)用的唯一標(biāo)識符,即你的手機上不能同時安裝有兩個bundleName一樣的應(yīng)用。在Android開發(fā)從eclipse過度到Android studio開發(fā)之后,在gradle配置中加入了一個applicationId,這個bundleName其實是和applicationId對標(biāo)的。關(guān)于這個唯一標(biāo)識的作用,在上面講解App與Hap的時候已經(jīng)詳細講解了,這里就不再重復(fù)贅述了。
package是真正的包名,它是每個hap的包結(jié)構(gòu)名稱,同一個App下的bundleName相同,但是package名稱不同,這個就是我們通常java中提到的包名了,比如有一個類名為MainAbility,它所屬的包名為com.xdw.jstest,我們在好多api接口使用的時候經(jīng)常會調(diào)用完整類名,即com.xdw.jstest.MainAbility。下面就結(jié)合一個核心Js Api來講解bundleName和package結(jié)合使用的應(yīng)用場景,容易混淆出錯的地方。這里順帶提一下,從Api8之后HarmonyOS也完全拋棄java了,這里用的api也是8版本。
截取官網(wǎng)上的一個api使用描述,如下圖:
以后遇到這種api就要長個心眼,下面abilityName中前面的那一長串是package,而不是bundleName,官網(wǎng)截圖中它們是同一串字符串,但是千萬不要誤以為它們必須一樣,在調(diào)用這類api的時候一定要仔細去module下的config.json文件中分別復(fù)制自己的bundleName和package,特別是最新的992版本的DevEco Studio開發(fā)工具在創(chuàng)建工程的時候只提供輸入bundleName的地方而不提供輸入package的地方,并且默認生成的package和bundleName是不一樣的,如果你這里想當(dāng)然的它們就是一樣的,那么調(diào)用上圖中的api的時候就會導(dǎo)致api無法生效。
小結(jié)
相信讀完全篇文檔之后,大家不會再對這些重要概念再混淆不清了吧。