Android开发人员应该知道的一些技术

一、Android MVC、MVP以及MVVM框架模式

MVC开发框架

  • View:对应于布局文件和自定义View,负责将用户的请求通知Controller,并根据model更新界面;
  • Controller:对应于Activity、Fragement,负责处理业务逻辑接收用户请求并更新model;(而事实上我们的Activity同时承担着MVC3种角色,代码动不动就上千行!)
  • Model:数据模型,负责数据处理相关的逻辑,封装应用程序状态,响应状态查询,通知View改变。


    MVC

MVP开发框架

  • View 对应于Activity,负责View的绘制以及与用户交互
  • Model 依然是数据模型,负责数据处理相关的逻辑和实体模型
  • Presenter 负责完成View于Model间的交互,处理业务逻辑


    MVP

MVP框架的优点:
①Model层和View层充分解耦。
②复杂的任务被分成细小的任务,并且很容易解决。越小的东西,bug越少,越容易debug,更好测试。
③在MVP模式下的View层将会变得简单,简单直观。
④后台任务不再和Activity联系在一起,这既不会导致内存泄露(OOM),也不依赖于Activity的重建。
⑤Persnter层负责处理业务逻辑,这样业务逻辑就被剥离了出来,不在担心需求的不停变更,可以使开发者更专注解决问题。
⑥可以直接单元测试Persenter层,以致于无需实现和View层和Model层。
MVP框架的缺点:
需要写很多类,原本一个类可以完成的事,现在需要写6个!

MVVM开发框架

  • MVVM可以算是MVP的升级版,将 Presenter 改名为 ViewModel。关键在于ViewModel和Model的双向绑定,当View有用户输入后,ViewModel通知Model更新数据,同理Model数据更新后,ViewModel通知View更新。
  • MVVM的出现还是为了解决View层和Model层之间的解耦,实现了充分解耦。
  • MVVM相比MVP,很大程度上解决了MVP的缺点
  • Android Google在2015年提出的DataBinding Library技术,使得ViewModel和Model之间的双向绑定更加容易。IOS上如果要实现类似功能,使用KVO也可实现。


    MVVM

MVVM框架的优点
①继承了MVP框架的所有优点
②书写更加方便,不必创建很多个类。使得视图层,业务逻辑层,数据模型层,层次结构更加清晰。
③再Model层和View层充分解耦的同时,还实现了数据和视图的双向绑定,数据变化时,视图自动更新。这个特性很有用,对于一些实时性较高的应用来说无疑是最佳的解决方案。例如炒股的一些APP。
MVVM框架在Android工程上的实现的基本要求
①开发工具目前只支持Android Stduio,很显然eclipse已经被Google淘汰。
②Android Studio需要1.3版本以上
③Gradle版本需要2.2以上版本
④Android plugin for gradle 1.3.0及以上版本

二、Android组件化开发和插件化开发技术

Android组件化开发

1、什么是组件化开发?
所谓组件化开发就单独的业务模块抽取出来。每一个模块是一个module,正常一个App中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library,组件化开发就是要每个module都可以运行起来,因此在开发期间每个module均设置为application,发布时再进行合并。
2、为什么要使用组件化开发?
① Android项目中代码量达到一定程度,编译将是一件非常痛苦的事情,短则一两分钟,长则达到五六分钟。组件化开发可以有效降低代码模块的耦合度,使代码架构更加清晰,同时模块化的编译可以有效减少编译时间,当然总的编译时间是不会减少的,只是App模块化之后开发某个模块时,只需要编译特定模块,可以快速编译调试。
②组件化实现了业务的解耦和重用。

组件化开发模式的演变

(1) 单工程开发模式


单工程开发模式

该种开发模型已经有了明确的模块划分,并且通过逻辑上的分层呈现出较好结构,该模型最为我们所熟悉,通常用于早期产品的快速开发,团队规模较小的情况下,随着产品的迭代,业务越来越复杂,随之带来的是项目结构复杂度的极度增加,此时我们面临着几个问题:

  • 实际业务变化非常快但是工程之前的业务模块耦合度太高,牵一发而动全身.
  • 对工程所做的任何修改都必须要编译整个工程
  • 功能测试和系统测试每次都要进行.
  • 团队协同开发存在较多的冲突.不得不花费更多的时间去沟通和协调,并且在开发过程中,任何一位成员没办法专注于自己的功能点,影响开发效率.
  • 不能灵活的对工程进行配置和组装.比如今天产品经理说加上这个功能,明天又说去掉,后天在加上.

(2)主工程多组件开发模型
在"单工程"模型的基础上,将业务层中的各业务抽取出来,封装成相应的业务组件,将基础库中各部分抽取出来,封装成基础组件,而主工程是一个可运行的app,作为各组件的入口(主工程也被称之为壳程序).这些组件或以jar的形式呈现,或以aar的形式呈现.主工程通过依赖的方式使用组件所提供的功能.


主工程多组件开发模型

优点:
①每个成员可以专注自己所负责的业务,并不影响其他业务,同时借助稳定的基础组件,可以极大减少代码缺陷,因而整个团队可以以并行开发的方式高效的推进开发进度.
②原有的业务不需要再次进行功能测试,可以专注于发生变化的业务的测试,以及最终的集成测试即可.
缺点:
到现在为止,我们已经有效解决了"单工程开发模型"中一些问题,对于大部分团队来说这种已经可以了,但是该模型仍然存在一些可以改进的点:每次修改依赖包,就需要重新编译生成lib或者aar.比如说小颜同学接手了一个项目有40多个组件,在最后集成所有组件的时候,小颜同学发现其中某组件存在问题,为了定位和修改该组件中的问题,小颜同学不断这调试该组件.由于在该模型下,组件不能脱离主工程,那么意味着,每次修改后,小颜同学都要在漫长的编译过程中等待.更糟糕的是,现在离上线只有5小时了,每次编译10分钟,为改这个bug,编译了20次,恩....什么也不用干了,可以提交离职报告了

(3)主工程多子工程开发模型
不难发现,该种开发模型在结构上和"主工程多组件"并无不同,唯一的区别在于:所有业务组件不再是mouble而是作为一个子工程,基础组件可以使moudle,也可以是子工程,该子工程和主工程不同:Debug模式下下作为app,可以单独的开发,运行,调试;Release模式下作为Library,被主工程所依赖,向主工程提供服务.

主工程多子工程开发模型

优点:
①在该种模型下,当小颜同学发现某个业务组件存在缺陷,会如何做呢?比如是基础组件2出现问题,由于在Debug模式下,基础组件2作为app可以独立运行的,因此可以很容易地对该模块进行单独修改,调试.最后修改完后只需要重新编译一次整个项目即可。
②不难发现该种开发模型有效的减少了全编译的次数,减少编译耗时的同时,方便开发者进行开发调试。
③对测试同学来说,功能测试可以提前,并且能够及时的参与到开发环节中,将风险降到最低。

Android插件化开发

插件化和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk或者Dex包(组件化的每个模块是个lib,尽管调试时是一个应用,打包时还是作为lib处理),最终打包的时候将宿主apk和插件apk分开或者联合打包。

Android插件化和组件化

1、为什么会产生插件化开发模式?
我们知道一个APK包只有一个classes.dex文件,但dex文件最大的方法数为65535。
如果一个应用的业务逻辑十分庞大,例如淘宝、京东。很显然如果只有一个APK文件是远远不够的。那么有什么解决方法,有如下几个:

  • 用 H5、React Native、Flutter 代替部分逻辑
  • 删无用代码
  • 买付费版的 Proguard
  • 另外还有一个就是插件化模式。

2、插件化的优点

  • 模块解耦
  • 应用可以实现动态升级(热更新,差异包更新)
  • 可以动态修复线上应用Bug,而无需重新构建版本,再次升级。
  • 高效并行开发
  • 按需加载相应模块,内存占用率更低
  • 节省流量升级

3、Android插件化基础知识

  • Android进程间通信(IPC)binder机制
  • APP打包流程
  • APP安装流程
  • APP启动流程
  • 资源加载机制
  • Gradle脚本

4、Android插件化实现目前的技术流派

  • 动态替换
  • 静态代理
  • Dex合并(Dex合并就是Android热修复的思想)

5、目前比较流行的第三方插件化框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容