摘要:只有當(dāng)理解這些后,才能很順利的進(jìn)行程序重構(gòu),或者進(jìn)行程序開發(fā)。不難發(fā)現(xiàn),這個功能,肯定和完整有著某種密切的聯(lián)系。還有另外一種情況。故可以將其刪除。及,共同構(gòu)成同第一條總結(jié)的,當(dāng)你抽象出級的后,他們構(gòu)成總體的結(jié)構(gòu),包括及。
作者:Darkbug
原文標(biāo)題:Google新技術(shù):Instant App全拆解(4)——架構(gòu)(完結(jié))
原文鏈接:https://segmentfault.com/a/11...
首發(fā)地址:http://www.doncc.org
轉(zhuǎn)發(fā)請注明轉(zhuǎn)載地址,請尊重原創(chuàng)作者權(quán)益!
《Google新技術(shù):Instant App全拆解》系列回顧:
第一篇:Google新技術(shù):Instant App全拆解(1)——初探
第二篇:Google新技術(shù):Instant App全拆解(2)——剖析
第三篇:Google新技術(shù):Instant App全拆解(3)——著手
本文著重介紹在進(jìn)行Instant App程序開發(fā)時需要理解的程序架構(gòu),同學(xué)們需要首先理解架構(gòu)里的幾個基本概念,然后再需要理解如何進(jìn)行基本的功能模塊架構(gòu),甚至更為復(fù)雜的程序功能模塊架構(gòu)。只有當(dāng)理解這些后,才能很順利的進(jìn)行程序重構(gòu),或者進(jìn)行Instant App程序開發(fā)。
有描述不正確的地方,請及時聯(lián)系我,我將吸取意見并改正。
1.Instant App程序的結(jié)構(gòu)及概念在之前的課程我們有介紹,要想進(jìn)行Instant App的程序開發(fā),必須基于Android Studio 3.0集成開發(fā)環(huán)境。故后面介紹的所有關(guān)于代碼的書寫,以及在集成開發(fā)環(huán)境內(nèi)進(jìn)行程序架構(gòu),本人均在Android Studio 3.0 preview版進(jìn)行(因?yàn)閷戇@文章的時候,最新版也就是preview版)。 -_-||
在Instant App內(nèi),有幾個非常重要的概念。比如feature、feature modules、feature APK。在做之前,必須先搞懂這幾個概念,才能做好你的Instant App程序開發(fā)。
瞬時加載程序應(yīng)該起到的作用是,當(dāng)你在需要一個功能需求時,從Google Play上可以下載這個程序的部分功能,從而體驗(yàn)到App級的用戶體驗(yàn),用戶使用完這個應(yīng)用的功能模塊后,系統(tǒng)會丟掉這個功能模塊的代碼。不難發(fā)現(xiàn),這個功能,肯定和完整App有著某種密切的聯(lián)系。那么是什么聯(lián)系呢?
好的,我們開始根據(jù)官方的圖來進(jìn)行程序架構(gòu)分析。想要分析程序的結(jié)構(gòu),應(yīng)從大到小、從外向內(nèi)進(jìn)行分析。我們會從下面兩個方向進(jìn)行分析,也就是從外到內(nèi)。
從程序功能劃分程序結(jié)構(gòu)
從功能結(jié)構(gòu)劃分工程架構(gòu)
1.1 從程序功能劃分程序結(jié)構(gòu)如果你的應(yīng)用程序是帶有即時應(yīng)用的話,那么你在構(gòu)建你的項(xiàng)目之時,會帶有一個或多個即時應(yīng)用程序APK。這是根據(jù)你的程序劃分程序功能情況而定,每個功能,可以生成對應(yīng)功能的即時應(yīng)用程序APK。
好,明白了這個功能APK后,我們再來看看它是怎么架構(gòu)的。
我們先來從官方的一張圖說起:
從圖中我們可知,一個Instant App APK程序內(nèi),只有一個Base feature APK,而可以有多個feature APK來構(gòu)成。換句話說,每個即時應(yīng)用程序,都會有且只有一個基礎(chǔ)功能APK。
換個角度想,如果你的即時應(yīng)用程序只有一個功能,那么你只需有一個基礎(chǔ)功能APK就夠了;如果你的即時應(yīng)用程序有多個功能,那么你需要一個基礎(chǔ)功能APK,它包含其他功能所需要用到的共有數(shù)據(jù)即可,比如不同功能間,界面內(nèi)會有一些公用的控件、基本信息等,那么這些共有數(shù)據(jù)就可以放在基礎(chǔ)功能APK內(nèi),而其他功能APK,具備不同功能即可。
還有另外一種情況。用戶已經(jīng)體驗(yàn)了一個功能了,系統(tǒng)已為用戶下載了基礎(chǔ)功能APK以及功能APK,如果需要在這個功能內(nèi)請求數(shù)據(jù)到另外一個功能內(nèi)的情況下,系統(tǒng)只會為你下載另一項(xiàng)功能的代碼,因?yàn)檫@是基礎(chǔ)功能的代碼已經(jīng)存在本地了,無需再次下載了。
怎么樣,Google大大的這個設(shè)計(jì),是不是感覺簡直逆天到爆?總結(jié)一句話就是,需要的就下載;不需要的,不下載。這為我們在一定程度上節(jié)省了很多寶貴的流量,也減少應(yīng)用程序所占用的系統(tǒng)空間。(土豪請隨意)?
1.2 從功能結(jié)構(gòu)劃分工程架構(gòu)從上面的小結(jié)我們可以知道,你的程序其實(shí)是按照功能的不同進(jìn)行區(qū)分的,所有功能應(yīng)有一個基礎(chǔ)功能,在基礎(chǔ)功能之上,將整個程序劃分出不同的功能。那么不同的功能之間,該如何進(jìn)行代碼模塊的劃分架構(gòu)呢?
我們再來看下官方發(fā)布的另外一張結(jié)構(gòu)圖:
從上圖我們很清楚的知道,一個Instant App 程序內(nèi),只會包含一個基本的功能,而自定義的模塊,會依賴于基本的功能塊。這是一個很典型的瞬時加載程序的一個單一功能模塊的程序架構(gòu)。而Instant app module是瞬時加載程序的入口點(diǎn),App module是功能程序的完整代碼部分。
好的,我們了解了模塊該如何劃分后,就可以具體來看下,劃分模塊時需要配置的詳細(xì)代碼了。(不要跟我說看代碼頭疼,我們都是程序員????)
2.構(gòu)建單個功能模塊的Instant App想要構(gòu)建單個功能模塊,我們假如按照最簡單的結(jié)構(gòu),可以分為如下:
Base features module
Android Instant Apps module
App module (APK)
這三個方面足以說明一個簡單的Instant App結(jié)構(gòu)了。下面我們來逐個詳細(xì)的了解。
2.1 按模塊劃分 2.1.1 Base features moduleBase Features module的說明,我們可以從兩方面談起。
manifest文件的修改
在AndroidManifest.xml文件中,你需要修改application標(biāo)簽的內(nèi)容。像如下內(nèi)容:
在這里,我們需要修改的東西會多一些。如果細(xì)心的同學(xué)會發(fā)現(xiàn),其實(shí)修改的內(nèi)容,和我們之前接觸的App Links的配置是一致的。這就應(yīng)了我們之前所述的,Instant App的實(shí)現(xiàn)是依賴于App Links的。固然在配置上也是一致的。
這到底是為什么呢?
別忘了,我們根據(jù)之前的架構(gòu)可知,base features module是所有module的基礎(chǔ)。也就是說,當(dāng)系統(tǒng)加載程序時,首先加載的就是這個base features module,那么固然基礎(chǔ)信息也就被系統(tǒng)讀取到了。
所以你也就可以這么修改你的程序。當(dāng)你需要一些基礎(chǔ)信息,比如
或許,你應(yīng)該懂得,不是整個程序的基礎(chǔ)信息,都必須加載進(jìn)base feature module的manifest中,應(yīng)是需要的就加載,不需要的就不加載。
build.gradle的修改
這里指的gradle文件,是base feature的gradle配置文件。你可以在里面找到android的相關(guān)配置。在內(nèi)部,添加baseFeature true這樣的配置即可。比如下面的代碼所示:
apply plugin: "com.android.feature" android { ... //add this line baseFeature true ... defaultConfig{ //delete applicationId ... } }
這樣系統(tǒng)在讀取gradle配置信息時,會知道這個模塊是屬于base feature,就會繼續(xù)找它相應(yīng)的子模塊。你看Google大大已經(jīng)封裝得多么簡潔了,真心爽啊。
2.1.2 Android Instant Apps module在這Instant App模塊內(nèi),情況有些特殊。這個模塊內(nèi)不包含任何的代碼,只包含有構(gòu)建信息的配置。比如下面的build.gradle文件配置:
apply plugin: "com.android.instantapp" ... dependencies { implementation project(":base") }
在這里,我們需要把apply plugin這個配置改為"com.android.instantapp",這是告知構(gòu)建器本模塊是Instant App模塊。并且在dependencies模塊內(nèi),需要指定Instant App模塊是實(shí)現(xiàn)自誰,也就是從結(jié)構(gòu)上它是誰的子結(jié)構(gòu)。關(guān)于結(jié)構(gòu)是怎么分,還需讀懂上面的【圖FeaturesSingle.png】為妙。
在這個模塊內(nèi),你可以刪除掉這個模塊代碼的src包,因?yàn)檫@個模塊內(nèi),沒有代碼,所以即使添加src包也是沒用的。故可以將其刪除。
2.1.3 App module (APK)在這個模塊里,如果你需要構(gòu)建你的Instant App的話,那么這個模塊需要包含要所有功能的模塊內(nèi)容和產(chǎn)品的APK。在這個模塊內(nèi)也是比較特殊的 , manifest文件內(nèi)不包含除
這里我們也有個配置樣例,可參考如下:
在上述代碼中,manifest內(nèi)的package值,要和你的base feature module所配置的包名保持一致。并且你需要移除掉生成的
而在build.gradle文件內(nèi),我們也需要進(jìn)行一些修改:
apply plugin: "com.android.application" ... dependencies { implementation project(":base") }
不難發(fā)現(xiàn),如果我們需要構(gòu)建一個完整的Instant App,我們需要在這個模塊內(nèi)添加結(jié)構(gòu)是實(shí)現(xiàn)自誰。根據(jù)上面的【圖FeaturesSingle.png】可知,我們這個模塊是實(shí)現(xiàn)自base模塊,所以我們需要在build.gradle內(nèi)填寫實(shí)現(xiàn)自base模塊的語句配置。
2.2 總結(jié)在本章內(nèi),我們知道了如何將一個已有的項(xiàng)目,變?yōu)镮nstant App程序架構(gòu)。其最主要的思想,我們可以總結(jié)如下:
抽象父feature module:
是將程序架構(gòu)成擁有一個最頂級的feature module,這個feature module內(nèi)集合你的Instant App或者其他子module在運(yùn)行時需要的一些必要資源內(nèi)容,包括Activity、Fragment等資源。這樣能相對減少你的子module的資源大小,從而減少你寶貴的流量消耗。
APK module及Instant App module,共同構(gòu)成base feature module:
同第一條總結(jié)的,當(dāng)你抽象出base級的feature后,他們構(gòu)成總體的結(jié)構(gòu),包括apk module及instantapp module。當(dāng)然這不僅限于這兩個!
Instant App應(yīng)使用App Links作為功能的接入口:
因?yàn)锳pp Links具有獨(dú)特的驗(yàn)證方式,能與Google服務(wù)進(jìn)行互通,且瞬時加載程序是依托于Chrome瀏覽器來進(jìn)行交互的。所以需要使用App Links作為功能的接入口。如何驗(yàn)證App Links的重要性也就不言而喻了。如果需要回顧這塊兒的課程,請翻閱之前我寫過的文章,在那里我有詳細(xì)介紹有關(guān)于App Links的使用。
3.多個feature構(gòu)建你的Instant App如果想了解多個feature是如何工作的,那么你首先、務(wù)必、一定要理解上個章節(jié)的內(nèi)容,也就是單個功能模塊是如何工作的,只有這樣你才能很快的理解本章節(jié)內(nèi)容。
3.1 按模塊劃分多個feature工作起來其實(shí)并不復(fù)雜,原理跟單個feature其實(shí)是一樣的。這里我依照貼心的放上google的官方圖片來解釋:
有人會說,為什么你只會引官方的圖,而不自己做圖呢。我想說,官方的圖已經(jīng)很簡明扼要的闡述了內(nèi)容,我們?yōu)槭裁催€要重復(fù)造輪子呢?
好了廢話不多說,來看圖說話。看上去連線之間交叉復(fù)雜,但是這里面包含很清晰的邏輯關(guān)系。別急,跟著我的思路,一點(diǎn)一點(diǎn)理解上面的圖。
第一,我們拋開淺綠色以上的圖先不看,我們只看淺藍(lán)色以下的部分。一個完整的Instant App,依舊有一個Base Feature,那么它可以引伸出兩個子feature,分別是Feature 1、Feature 2。這是什么意思呢?這和我們之前講過的內(nèi)容正好相匹配上,一個父級的Feature,可能包含很多子級的Feature,而這些諸多的子Feature共同構(gòu)成了一個完整的App功能。這也就是Instant App架構(gòu)的精髓,把一個大的功能完全拆分成不同小部分的小功能,從而減少每個功能塊的代碼量的大小。
第二,我們再來看淺綠色的區(qū)域。我們會發(fā)現(xiàn),Instant App module分別指向了Feature 1和Feature 2,并且App module也分別指向了Feature 1和Feature 2。這里有什么?膩么?
還記得App Links的特點(diǎn)么,在你要鏈接到的Activity,會在manifest文件處進(jìn)行App Links的配置,鏈接到你想要訪問的Activity。而Instant App恰恰就是運(yùn)用App Links的機(jī)制。也就是說,從Instant App程序入口的操作,會在內(nèi)部識別你請求的到底是哪個Activity,也就是哪個功能Feature。這樣你才會看到,淺綠色的Instant App module分別指向了Feature 1和Feature 2。
第三,我們要格外注意的是,淺綠色的Instant app module和app module需要同時實(shí)現(xiàn)自深藍(lán)色的Base Feature,這需要在gradle配置文件內(nèi)進(jìn)行額外配置。圖中并沒有進(jìn)行描述。這一點(diǎn)需要格外注意。
3.2 總結(jié)好了,這次我們就很容易的理解多個Feature是如何構(gòu)架你的程序的。思路也不是很復(fù)雜,我們總結(jié)如下:
將你的程序的大功能模塊,分為若干個不同的小feature module。注意,我們之前提到過的不要忘記,每個feature module,盡量不要超過4MB大小。當(dāng)然這僅僅是建議,盡量去滿足他。
Instant App module、app module,要實(shí)現(xiàn)自每個feature,這樣才能讓App Links找到不同功能的Feature module。
你的instant app module和app module(假設(shè)你有這兩個模塊作為實(shí)現(xiàn)feature的子模塊),那么你需要分別實(shí)現(xiàn)自base feature module。這樣你的子feature才能生效。
本文著重對Instant App程序架構(gòu)的闡述,從基本的架構(gòu)概念,到單個功能模塊的架構(gòu),再到復(fù)雜的多功能模塊架構(gòu),很詳細(xì)的說明了其結(jié)構(gòu)上的關(guān)聯(lián)性,能讓你更輕松的理解Instant App程序開發(fā)。
不難看出,其實(shí)如果搞懂了Instant App程序架構(gòu),那么你在進(jìn)行程序開發(fā)時就會變得易如反掌了。相信看完這篇文章后,后續(xù)的課程對于聰明的你來講,簡直可以輕松駕馭。
至此,關(guān)于Instant App程序開發(fā),我們已經(jīng)摸清了頭緒。我們可以很輕松的駕馭它,并且應(yīng)用到自己的項(xiàng)目中了。
Enjoy it!!
廣告位:更多、更有料的IT前沿技術(shù)課程,盡在頂級云加。詳情請持續(xù)關(guān)注頂級云加的唯一官方網(wǎng)站:https://yunp.top
《Google新技術(shù):Instant App全拆解》系列回顧:
第一篇:Google新技術(shù):Instant App全拆解(1)——初探
第二篇:Google新技術(shù):Instant App全拆解(2)——剖析
第三篇:Google新技術(shù):Instant App全拆解(3)——著手
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/24975.html
摘要:只有當(dāng)理解這些后,才能很順利的進(jìn)行程序重構(gòu),或者進(jìn)行程序開發(fā)。不難發(fā)現(xiàn),這個功能,肯定和完整有著某種密切的聯(lián)系。還有另外一種情況。故可以將其刪除。及,共同構(gòu)成同第一條總結(jié)的,當(dāng)你抽象出級的后,他們構(gòu)成總體的結(jié)構(gòu),包括及。 作者:Darkbug原文標(biāo)題:Google新技術(shù):Instant App全拆解(4)——架構(gòu)(完結(jié))原文鏈接:https://segmentfault.com/a/1...
摘要:系統(tǒng)環(huán)境要求開發(fā)不是在所有的集成開發(fā)環(huán)境都可以進(jìn)行的。這里注意,的架構(gòu)方式不能為的方式,絕對不能真機(jī)的準(zhǔn)備工作運(yùn)行于及以上的系統(tǒng)手機(jī)廠商親兒子三星服務(wù)框架已安裝在手機(jī)上。 作者:Darkbug原文標(biāo)題:Google新技術(shù):Instant App全拆解(3)——著手原文鏈接:https://segmentfault.com/a/11...首發(fā)地址:http://www.doncc.org...
閱讀 2655·2021-11-24 10:44
閱讀 1896·2021-11-22 13:53
閱讀 1907·2021-09-30 09:47
閱讀 3704·2021-09-22 16:00
閱讀 2431·2021-09-08 09:36
閱讀 2312·2019-08-30 15:53
閱讀 2790·2019-08-30 15:48
閱讀 976·2019-08-30 15:44