Google新技术:Instant App全拆解(4)——架构(完结)

做者: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

1.Instant App程序的结构及概念

在以前的课程咱们有介绍,要想进行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

好的,咱们开始根据官方的图来进行程序架构分析。想要分析程序的结构,应从大到小、从外向内进行分析。咱们会从下面两个方向进行分析,也就是从外到内。

  • 从程序功能划分程序结构
  • 从功能结构划分工程架构

1.1 从程序功能划分程序结构

若是你的应用程序是带有即时应用的话,那么你在构建你的项目之时,会带有一个或多个即时应用程序APK。这是根据你的程序划分程序功能状况而定,每一个功能,能够生成对应功能的即时应用程序APK。

好,明白了这个功能APK后,咱们再来看看它是怎么架构的。

咱们先来从官方的一张图提及:

FeaturesDiagram

从图中咱们可知,一个Instant App APK程序内,只有一个Base feature APK,而能够有多个feature APK来构成。换句话说,每一个即时应用程序,都会有且只有一个基础功能APK。

换个角度想,若是你的即时应用程序只有一个功能,那么你只需有一个基础功能APK就够了;若是你的即时应用程序有多个功能,那么你须要一个基础功能APK,它包含其余功能所须要用到的共有数据便可,好比不一样功能间,界面内会有一些公用的控件、基本信息等,那么这些共有数据就能够放在基础功能APK内,而其余功能APK,具有不一样功能便可。

还有另一种状况。用户已经体验了一个功能了,系统已为用户下载了基础功能APK以及功能APK,若是须要在这个功能内请求数据到另一个功能内的状况下,系统只会为你下载另外一项功能的代码,由于这是基础功能的代码已经存在本地了,无需再次下载了。

怎么样,Google大大的这个设计,是否是感受简直逆天到爆?总结一句话就是,须要的就下载;不须要的,不下载。这为咱们在必定程度上节省了不少宝贵的流量,也减小应用程序所占用的系统空间。(土豪请随意)?

1.2 从功能结构划分工程架构

从上面的小结咱们能够知道,你的程序实际上是按照功能的不一样进行区分的,全部功能应有一个基础功能,在基础功能之上,将整个程序划分出不一样的功能。那么不一样的功能之间,该如何进行代码模块的划分架构呢?

咱们再来看下官方发布的另一张结构图:

FeaturesSingle

从上图咱们很清楚的知道,一个Instant App 程序内,只会包含一个基本的功能,而自定义的模块,会依赖于基本的功能块。这是一个很典型的瞬时加载程序的一个单一功能模块的程序架构。而Instant app module是瞬时加载程序的入口点,App module是功能程序的完整代码部分。

好的,咱们了解了模块该如何划分后,就能够具体来看下,划分模块时须要配置的详细代码了。(不要跟我说看代码头疼,咱们都是程序员?‍?‍)

2.构建单个功能模块的Instant App

想要构建单个功能模块,咱们假如按照最简单的结构,能够分为以下:

  • Base features module
  • Android Instant Apps module
  • App module (APK)

这三个方面足以说明一个简单的Instant App结构了。下面咱们来逐个详细的了解。

2.1 按模块划分

2.1.1 Base features module

Base Features module的说明,咱们能够从两方面谈起。

  • manifest文件的修改

在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中,应是须要的就加载,不须要的就不加载。

  • build.gradle的修改

    这里指的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大大已经封装得多么简洁了,真心爽啊。

2.1.2 Android Instant Apps module

在这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包也是没用的。故能够将其删除。

2.1.3 App module (APK)

在这个模块里,若是你须要构建你的Instant App的话,那么这个模块须要包含要全部功能的模块内容和产品的APK。在这个模块内也是比较特殊的 , manifest文件内不包含除<manifest>之外的其余配置标签,由于有关于applicationactivityuses-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模块的语句配置。

2.2 总结

在本章内,咱们知道了如何将一个已有的项目,变为Instant App程序架构。其最主要的思想,咱们能够总结以下:

  • 抽象父feature module:

    是将程序架构成拥有一个最顶级的feature module,这个feature module内集合你的Instant App或者其余子module在运行时须要的一些必要资源内容,包括Activity、Fragment等资源。这样能相对减小你的子module的资源大小,从而减小你宝贵的流量消耗。

  • APK module及Instant App module,共同构成base feature module:

    同第一条总结的,当你抽象出base级的feature后,他们构成整体的结构,包括apk module及instantapp module。固然这不只限于这两个!

  • Instant App应使用App Links做为功能的接入口:

    由于App Links具备独特的验证方式,能与Google服务进行互通,且瞬时加载程序是依托于Chrome浏览器来进行交互的。因此须要使用App Links做为功能的接入口。如何验证App Links的重要性也就不言而喻了。若是须要回顾这块儿的课程,请翻阅以前我写过的文章,在那里我有详细介绍有关于App Links的使用。

3.多个feature构建你的Instant App

若是想了解多个feature是如何工做的,那么你首先、务必、必定要理解上个章节的内容,也就是单个功能模块是如何工做的,只有这样你才能很快的理解本章节内容。

3.1 按模块划分

多个feature工做起来其实并不复杂,原理跟单个feature实际上是同样的。这里我依照贴心的放上google的官方图片来解释:

FeaturesMulti

有人会说,为何你只会引官方的图,而不本身作图呢。我想说,官方的图已经很简明扼要的阐述了内容,咱们为何还要重复造轮子呢?

好了废话很少说,来看图说话。看上去连线之间交叉复杂,可是这里面包含很清晰的逻辑关系。别急,跟着个人思路,一点一点理解上面的图。

第一,咱们抛开浅绿色以上的图先不看,咱们只看浅蓝色如下的部分。一个完整的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配置文件内进行额外配置。图中并无进行描述。这一点须要格外注意。

3.2 总结

好了,此次咱们就很容易的理解多个Feature是如何构架你的程序的。思路也不是很复杂,咱们总结以下:

  • 将你的程序的大功能模块,分为若干个不一样的小feature module。注意,咱们以前提到过的不要忘记,每一个feature module,尽可能不要超过4MB大小。固然这仅仅是建议,尽可能去知足他。
  • Instant App module、app module,要实现自每一个feature,这样才能让App Links找到不一样功能的Feature module。
  • 你的instant app module和app module(假设你有这两个模块做为实现feature的子模块),那么你须要分别实现自base feature module。这样你的子feature才能生效。

本文着重对Instant App程序架构的阐述,从基本的架构概念,到单个功能模块的架构,再到复杂的多功能模块架构,很详细的说明了其结构上的关联性,能让你更轻松的理解Instant App程序开发。

不难看出,其实若是搞懂了Instant App程序架构,那么你在进行程序开发时就会变得易如反掌了。相信看完这篇文章后,后续的课程对于聪明的你来说,简直能够轻松驾驭。

至此,关于Instant App程序开发,咱们已经摸清了头绪。咱们能够很轻松的驾驭它,而且应用到本身的项目中了。

Enjoy it!!

广告位:更多、更有料的IT前沿技术课程,尽在顶级云加。详情请持续关注顶级云加的惟一官方网站:https://yunp.top


《Google新技术:Instant App全拆解》系列回顾:

第一篇:Google新技术:Instant App全拆解(1)——初探

第二篇:Google新技术:Instant App全拆解(2)——剖析

第三篇:Google新技术:Instant App全拆解(3)——着手

相关文章
相关标签/搜索