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