做者: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)——初探