做者:Darkbug
原文標題:Google新技術:Instant App全拆解(4)——架構(完結)
原文連接:https://segmentfault.com/a/11...
首發地址:http://www.doncc.org
轉發請註明轉載地址,請尊重原創做者權益!android
《Google新技術:Instant App全拆解》系列回顧:程序員
第一篇:Google新技術:Instant App全拆解(1)——初探segmentfault
第二篇:Google新技術:Instant App全拆解(2)——剖析瀏覽器
第三篇:Google新技術:Instant App全拆解(3)——着手架構
本文着重介紹在進行Instant App程序開發時須要理解的程序架構,同窗們須要首先理解架構裏的幾個基本概念,而後再須要理解如何進行基本的功能模塊架構,甚至更爲複雜的程序功能模塊架構。只有當理解這些後,才能很順利的進行程序重構,或者進行Instant App程序開發。app
有描述不正確的地方,請及時聯繫我,我將吸收意見並改正。gradle
在以前的課程咱們有介紹,要想進行Instant App的程序開發,必須基於Android Studio 3.0集成開發環境。故後面介紹的全部關於代碼的書寫,以及在集成開發環境內進行程序架構,本人均在Android Studio 3.0 preview版進行(由於寫這文章的時候,最新版也就是preview版)。 -_-||網站
在Instant App內,有幾個很是重要的概念。好比feature、feature modules、feature APK。在作以前,必須先搞懂這幾個概念,才能作好你的Instant App程序開發。ui
瞬時加載程序應該起到的做用是,當你在須要一個功能需求時,從Google Play上能夠下載這個程序的部分功能,從而體驗到App級的用戶體驗,用戶使用完這個應用的功能模塊後,系統會丟掉這個功能模塊的代碼。不難發現,這個功能,確定和完整App有着某種密切的聯繫。那麼是什麼聯繫呢?this
好的,咱們開始根據官方的圖來進行程序架構分析。想要分析程序的結構,應從大到小、從外向內進行分析。咱們會從下面兩個方向進行分析,也就是從外到內。
若是你的應用程序是帶有即時應用的話,那麼你在構建你的項目之時,會帶有一個或多個即時應用程序APK。這是根據你的程序劃分程序功能狀況而定,每一個功能,能夠生成對應功能的即時應用程序APK。
好,明白了這個功能APK後,咱們再來看看它是怎麼架構的。
咱們先來從官方的一張圖提及:
從圖中咱們可知,一個Instant App APK程序內,只有一個Base feature APK,而能夠有多個feature APK來構成。換句話說,每一個即時應用程序,都會有且只有一個基礎功能APK。
換個角度想,若是你的即時應用程序只有一個功能,那麼你只需有一個基礎功能APK就夠了;若是你的即時應用程序有多個功能,那麼你須要一個基礎功能APK,它包含其餘功能所須要用到的共有數據便可,好比不一樣功能間,界面內會有一些公用的控件、基本信息等,那麼這些共有數據就能夠放在基礎功能APK內,而其餘功能APK,具有不一樣功能便可。
還有另一種狀況。用戶已經體驗了一個功能了,系統已爲用戶下載了基礎功能APK以及功能APK,若是須要在這個功能內請求數據到另一個功能內的狀況下,系統只會爲你下載另外一項功能的代碼,由於這是基礎功能的代碼已經存在本地了,無需再次下載了。
怎麼樣,Google大大的這個設計,是否是感受簡直逆天到爆?總結一句話就是,須要的就下載;不須要的,不下載。這爲咱們在必定程度上節省了不少寶貴的流量,也減小應用程序所佔用的系統空間。(土豪請隨意)?
從上面的小結咱們能夠知道,你的程序實際上是按照功能的不一樣進行區分的,全部功能應有一個基礎功能,在基礎功能之上,將整個程序劃分出不一樣的功能。那麼不一樣的功能之間,該如何進行代碼模塊的劃分架構呢?
咱們再來看下官方發佈的另一張結構圖:
從上圖咱們很清楚的知道,一個Instant App 程序內,只會包含一個基本的功能,而自定義的模塊,會依賴於基本的功能塊。這是一個很典型的瞬時加載程序的一個單一功能模塊的程序架構。而Instant app module
是瞬時加載程序的入口點,App module
是功能程序的完整代碼部分。
好的,咱們瞭解了模塊該如何劃分後,就能夠具體來看下,劃分模塊時須要配置的詳細代碼了。(不要跟我說看代碼頭疼,咱們都是程序員??)
想要構建單個功能模塊,咱們假如按照最簡單的結構,能夠分爲以下:
這三個方面足以說明一個簡單的Instant App結構了。下面咱們來逐個詳細的瞭解。
Base Features module的說明,咱們能夠從兩方面談起。
在AndroidManifest.xml文件中,你須要修改application
標籤的內容。像以下內容:
<application> <activity android:name=".MainActivity"> <intent-filter android:order="1"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="myfirstinstantapp.doncc.org" android:path="/" android:scheme="https" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
在這裏,咱們須要修改的東西會多一些。若是細心的同窗會發現,其實修改的內容,和咱們以前接觸的App Links的配置是一致的。這就應了咱們以前所述的,Instant App的實現是依賴於App Links的。當然在配置上也是一致的。
這究竟是爲何呢?
別忘了,咱們根據以前的架構可知,base features module是全部module的基礎。也就是說,當系統加載程序時,首先加載的就是這個base features module,那麼當然基礎信息也就被系統讀取到了。
因此你也就能夠這麼修改你的程序。當你須要一些基礎信息,好比<activity>
、uses-permission
等基礎信息,能夠在base feature module的manifest
文件中進行聲明,做爲基礎須要的資源。
或許,你應該懂得,不是整個程序的基礎信息,都必須加載進base feature module的manifest
中,應是須要的就加載,不須要的就不加載。
這裏指的gradle文件,是base feature的gradle配置文件。你能夠在裏面找到android
的相關配置。在內部,添加baseFeature true
這樣的配置便可。好比下面的代碼所示:
apply plugin: 'com.android.feature' android { ... //add this line baseFeature true ... defaultConfig{ //delete applicationId ... } }
這樣系統在讀取gradle配置信息時,會知道這個模塊是屬於base feature,就會繼續找它相應的子模塊。你看Google大大已經封裝得多麼簡潔了,真心爽啊。
在這Instant App模塊內,狀況有些特殊。這個模塊內不包含任何的代碼,只包含有構建信息的配置。好比下面的build.gradle
文件配置:
apply plugin: 'com.android.instantapp' ... dependencies { implementation project(':base') }
在這裏,咱們須要把apply plugin
這個配置改成'com.android.instantapp'
,這是告知構建器本模塊是Instant App模塊。而且在dependencies
模塊內,須要指定Instant App模塊是實現自誰,也就是從結構上它是誰的子結構。關於結構是怎麼分,還需讀懂上面的【圖FeaturesSingle.png】爲妙。
在這個模塊內,你能夠刪除掉這個模塊代碼的src
包,由於這個模塊內,沒有代碼,因此即便添加src
包也是沒用的。故能夠將其刪除。
在這個模塊裏,若是你須要構建你的Instant App的話,那麼這個模塊須要包含要全部功能的模塊內容和產品的APK。在這個模塊內也是比較特殊的 , manifest
文件內不包含除<manifest>
之外的其餘配置標籤,由於有關於application
、activity
、uses-permission
等配置信息,已經在base feature module中配置了,因此不用再進行配置。
這裏咱們也有個配置樣例,可參考以下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.doncc.instantapp"> <!--remove application--> </manifest>
在上述代碼中,manifest
內的package
值,要和你的base feature module所配置的包名保持一致。而且你須要移除掉生成的<application>
標籤。
而在build.gradle文件內,咱們也須要進行一些修改:
apply plugin: 'com.android.application' ... dependencies { implementation project(':base') }
不難發現,若是咱們須要構建一個完整的Instant App,咱們須要在這個模塊內添加結構是實現自誰。根據上面的【圖FeaturesSingle.png】可知,咱們這個模塊是實現自base模塊,因此咱們須要在build.gradle內填寫實現自base模塊的語句配置。
在本章內,咱們知道了如何將一個已有的項目,變爲Instant App程序架構。其最主要的思想,咱們能夠總結以下:
是將程序架構成擁有一個最頂級的feature module,這個feature module內集合你的Instant App或者其餘子module在運行時須要的一些必要資源內容,包括Activity、Fragment等資源。這樣能相對減小你的子module的資源大小,從而減小你寶貴的流量消耗。
同第一條總結的,當你抽象出base級的feature後,他們構成整體的結構,包括apk module及instantapp module。固然這不只限於這兩個!
由於App Links具備獨特的驗證方式,能與Google服務進行互通,且瞬時加載程序是依託於Chrome瀏覽器來進行交互的。因此須要使用App Links做爲功能的接入口。如何驗證App Links的重要性也就不言而喻了。若是須要回顧這塊兒的課程,請翻閱以前我寫過的文章,在那裏我有詳細介紹有關於App Links的使用。
若是想了解多個feature是如何工做的,那麼你首先、務必、必定要理解上個章節的內容,也就是單個功能模塊是如何工做的,只有這樣你才能很快的理解本章節內容。
多個feature工做起來其實並不複雜,原理跟單個feature實際上是同樣的。這裏我依照貼心的放上google的官方圖片來解釋:
有人會說,爲何你只會引官方的圖,而不本身作圖呢。我想說,官方的圖已經很簡明扼要的闡述了內容,咱們爲何還要重複造輪子呢?
好了廢話很少說,來看圖說話。看上去連線之間交叉複雜,可是這裏麪包含很清晰的邏輯關係。別急,跟着個人思路,一點一點理解上面的圖。
第一,咱們拋開淺綠色以上的圖先不看,咱們只看淺藍色如下的部分。一個完整的Instant App,依舊有一個Base Feature,那麼它能夠引申出兩個子feature,分別是Feature 一、Feature 2。這是什麼意思呢?這和咱們以前講過的內容正好相匹配上,一個父級的Feature,可能包含不少子級的Feature,而這些諸多的子Feature共同構成了一個完整的App功能。這也就是Instant App架構的精髓,把一個大的功能徹底拆分紅不一樣小部分的小功能,從而減小每一個功能塊的代碼量的大小。
第二,咱們再來看淺綠色的區域。咱們會發現,Instant App module分別指向了Feature 1和Feature 2,而且App module也分別指向了Feature 1和Feature 2。這裏有什麼?膩麼?
還記得App Links的特色麼,在你要連接到的Activity,會在manifest文件處進行App Links的配置,連接到你想要訪問的Activity。而Instant App偏偏就是運用App Links的機制。也就是說,從Instant App程序入口的操做,會在內部識別你請求的究竟是哪一個Activity,也就是哪一個功能Feature。這樣你纔會看到,淺綠色的Instant App module分別指向了Feature 1和Feature 2。
第三,咱們要格外注意的是,淺綠色的Instant app module和app module須要同時實現自深藍色的Base Feature,這須要在gradle配置文件內進行額外配置。圖中並無進行描述。這一點須要格外注意。
好了,此次咱們就很容易的理解多個Feature是如何構架你的程序的。思路也不是很複雜,咱們總結以下:
本文着重對Instant App程序架構的闡述,從基本的架構概念,到單個功能模塊的架構,再到複雜的多功能模塊架構,很詳細的說明了其結構上的關聯性,能讓你更輕鬆的理解Instant App程序開發。
不難看出,其實若是搞懂了Instant App程序架構,那麼你在進行程序開發時就會變得易如反掌了。相信看完這篇文章後,後續的課程對於聰明的你來說,簡直能夠輕鬆駕馭。
至此,關於Instant App程序開發,咱們已經摸清了頭緒。咱們能夠很輕鬆的駕馭它,而且應用到本身的項目中了。
Enjoy it!!
廣告位:更多、更有料的IT前沿技術課程,盡在頂級雲加。詳情請持續關注頂級雲加的惟一官方網站:https://yunp.top
《Google新技術:Instant App全拆解》系列回顧:
第一篇:Google新技術:Instant App全拆解(1)——初探