最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍《Android源码设计模式解析与实战》上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计模式,以及近期Android开发中的一些热点话题。

受访嘉宾介绍:

何红辉(@MrSimp1e),前友盟Android工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享。Android开源库 AndroidEventBusColorful 作者, 开发技术前线 站长,《Android源码设计模式解析与实战》作者。

InfoQ:祝贺您的新书出版,我看到Github上有一个和书名相同的项目,这本书的内容生产模式是什么样的?

何红辉:其实写这本书我很早就有规划了,这个想法诞生于我还未参加工作之前,因为国内确实没有这方面的著作。只是当时能力不足、资历尚浅,因此也就把这个想法埋在心中了。

2014年4月份我开始在博客发表《Android源码分析之设计模式》系列文章,慢慢将本书的雏形建立起来。2014年底开始活跃于开源社区,到2015年2月份突然想到可以在Github上创建这样一个 项目 ,通过开源的形式让更多的人参与进来,分享自己对模式的见解,或者说让大家把软件设计重视起来。

为了降低我个人在项目中的文章数量,我将分析的素材推荐给其他参与进来的同学,让他们来执笔,这样能够提升大家的积极性。同时,我作为整个系列 文章的审稿人员把握文章质量。经过大家一个月的努力,Android源码设计模式分析的Github项目正式对外发布,一经发布得到了业界的广泛好评。这 让我很受鼓舞,因此出版的想法又再次浮现出来。

由于第一次写书出版,资历尚浅,特意邀请了关爱民老师与我一起撰写本书。在书中我们重写了所有章节,在深度、难度上都比Github上的开源文章有了大幅度的提升。因此,Github上的文章与书中的内容是有很大差距的。

InfoQ:关于Java设计模式已经有很多经典的书籍,为什么还会想要写Android源码的设计模式?

何红辉:Java设计模式方面的书籍通常只是通过Java语言来讲解设计模式,并非深入到一个系统中剖析设 计模式的运用。这类书籍是教读者什么是设计模式,而我们的书籍除了教读者什么是设计模式之外,更是深入剖析Android源码中设计模式的应用,让读者从 具体的代码中体会设计模式的使用场景、作用,真正领悟到软件设计之美。

InfoQ:您是怎么阅读和分析Android源码的,有哪些好用的工具?

何红辉:由于我分析源码只是分析特定的部分,因此对于工具并没有什么太高的要求,方便搜索与跳转即可。因此只是通过Sublime Text 2,安装上插件即可方便的阅读代码,Atom也是一个很好的选择。

InfoQ:最近Android 6.0源码对外开放,对这次更新您有哪些感兴趣的内容?

何红辉:对于6.0我并没有重点去关注,毕竟对于Android应用开发来说,用户设备的系统更新不像 iOS那么及时。但是6.0中的App Permissions、Android Pay、App Links这几项新特性倒是值得关注,这些新特性对于应用开发来说相关性相对高一些。而我真正关注的是Android的整个生态在不断的扩大,在智能车、 智能手表以及物联网平台都有了比较大的进展,这对于从事Android人员的人来说才是最好的消息。

InfoQ:在Android开发中,哪些设计模式最常见?哪些设计模式受到误解最多?

何红辉:GOF的《设计模式:可复用面向对象软件的基础》一书中总结了23种设计模式,但在开发中比较常用 的也就是单例、Builder、适配器、观察者、抽象工厂、外观、模板方法、策略这几个设计模式。学习任何东西都不能生搬硬套,设计模式更是如此。在合适 的场景中运用前人总结的设计模式解决自己的问题,这才是提出设计模式的初衷。

说到受到误解最多的设计模式可能要数工厂方法和抽象工厂两个模式了,这两个也是常用的设计模式,而且比较简单。受误解的原因是这两个模式容易让大家混淆,比如这里有两个问题:它们的作用是什么,它们的区别是什么?如果你没有一个确切的答案,那么应该回去翻翻书了。

InfoQ:最近Android开发里对RxJava研究比较多,您对响应式编程模式怎么看?

何红辉:响应式编程能够非常好的简化代码,让代码的可读性、稳定性都得到很大程度的提高。开发技术前线也翻 译了多篇高质量的关于RxJava的文章。但是RxJava的问题是在于它的库过大,超过700KB的大小让我有点不能接受。因此,如果你想使用响应式编 程来简化一些代码,那么可以参考 《 NotRxJava懒人专用指南 》这篇文章来创建一个简单的Rx库。这样既能对响应式编程有更深入的了解,也能了解实现响应式编程的实现原理,更能够提升自己的技术能力。

InfoQ:Android源码中有哪些经典的架构,它们的好处是什么?

何红辉:Android中最直观的分层架构和微服务架构。我们最常看到的Android体系架构就是一个典 型的分层架构,分为应用层、Framework层、Native层、内核层。上层是下层的调用端,下层则为上层提供服务,每一层都代表了应用的一个功能, 每一层的职责也相对较单一,这样使得系统的模块化程度、可测试性更高。

另一个明显的架构模式就是微服务架构。微服务架构的体现是System Service与Framework层的设计上。Android系统在启动时会启动ActivityManagerService、 PackageManagerService、WindowManagerService等系统服务,用户在执行操作时,会通过Framework层向对 应的Service发出请求,具体的Service接到指令之后做出反应。这样一来,Framework与这些System Service就构成了一个微服务架构,它们通过Binder进行通信,既解除了耦合,又提升了灵活性、可扩展性。

像Android这类大型应用中自然还有很多经典架构模式的运用,大家可以根据Android系统的源码中的线索来查找这些优秀运用示例。

InfoQ:能否谈下Android开发中MVP/MVVM架构的优点和缺点?它的使用场景是什么?

何红辉:MVP与MVVM都是Android中比较好的应用架构模式,它们的优点都是能够降低耦合,提升应 用模块的可测试性,并且能够在一定程度上避免过于复杂的Fragment、Activity类型,使得整个软件架构变得更为简单、清晰。它们缺点主要是职 责分得比较细,这样必然会产生很多类型。例如一个Activity,需要有Model、View、Presenter三个元素,这三个元素又要分接口、实 现类,页面一多各种Model、View、Presenter类型就繁杂起来。当然,通过合理的分包也能够在一定程度上缓解这个问题带来的负面影响。因 此,只要你想让你的应用架构更灵活、可扩展、易测试,MVP、MVVM都是很好的选择。

InfoQ:接下来您有何学习或写作计划?

何红辉:在完成《Android源码设计模式解析与实战》之后我就马上开始着手写另一本书, 《Android开发进阶-从小工到专家》。这本书的定位是学习Android开发的第二本书,本书首先对Android开发的核心知识点进行深入讲解, 包括View与动画、网络、多线程、数据库,然后介绍单元测试、代码规范、版本控制、重构、架构等重要知识点,使得读者在深入技术的同时开阔眼界,能够以 更专业的方式设计应用软件,完成从只会实现功能的“码农”到软件工程师、设计师的过渡。《Android开发进阶-从小工到专家》预计将于2015年12 月31日之前上市,到时候还希望大家多多支持。

这两本书就是目前我这两年想写的全部内容了,完成这两本书之后自己也可以静下心来进行进一步的学习。不断的补充知识、更新知识,才能与这个行业保持同步,内心也能够得到满足。最后,希望大家多多向我 反馈建议 ,多多交流,共同进步。

访何红辉:谈谈Android源码中的设计模式的更多相关文章

  1. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  2. 在Android源码中查找Java代码中native函数对应的C++实现

    Android源码中很多关键代码都是C++实现的,java通过jni来调用,经常会看到java中这样的代码: static native Thread currentThread(); 如何根据方法名 ...

  3. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  4. Android源码中的FLAG为何使用16进制

    1.在阅读源码的时候经常发现有一些标志属性使用一些位操作来判断是否具有该标志,增加标志或者去除标志. 比如View.java中的 /** * This view does not want keyst ...

  5. 关于android源码中的APP编译时引用隐藏的API出现的问题

    今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...

  6. Eclipse与Android源码中ProGuard工具的使用(代码混淆)

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  7. android studio应用修改到android源码中作为内置应用

    1. 方法一:导入,编译(太麻烦,各种不兼容问题) android studio和eclipse的应用结构目录是不同的,但是在android源码中的应用基本上都是使用的eclipse目录结构(在/pa ...

  8. Android源码中添加C可执行程序

    在Android源码中添加C/CPP可执行程序一般保存在external目录中 下面是每个文件的内容 ①add.c #include "add.h" int add (int a, ...

  9. 导入android源码中的APP源码到eclipse

    导入android源码中的APP源码到eclipse 一般最简单的办法就是创建新的android工程,选择create project from existing source选项,直接导入源码就OK ...

随机推荐

  1. c语言,变长数组

    下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...

  2. 基于visual Studio2013解决C语言竞赛题之1082迷宫

        题目 解决代码及点评 /************************************************************************/ /* ...

  3. 例解 autoconf 和 automake 生成 Makefile 文件

    本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法.主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Con ...

  4. jquery mobile切换页面的几种方法

    jquery mobile切换页面的几种方法 - 不厚道青蛙之焦油潭 - 博客频道 - CSDN.NET jquery mobile切换页面的几种方法 分类: phonegap html5 2012- ...

  5. 页面爬虫(获取其他页面HTML)加载到自己页面

    //前台 <div id="showIframe"></div> $(document).ready(function() { var url = &quo ...

  6. HTML5 input placeholder 颜色 改动

    David Murdoch:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: CSS input[placeholder], [placeholder], ...

  7. View实现涂鸦、撤销以及重做功能

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  8. EasyUI - Progressbar 进度条控件

    效果: html代码: <div id="p" style="width:400px;"></div> JS代码: $(function ...

  9. Delphi XE2 升级项目编译ralease版本,无法添加UAC解决方法

    我今天把一个原来是Delphi2007的工程升级到了Delphi XE2,在编译ralease版本时候,发现无法添加UAC,我觉得可能是升级的原因,随后我用XE2新建了一个工程,但是在编译raleas ...

  10. POI读取公式的值

    excel中的数据: package poi; import java.io.FileInputStream; import java.io.IOException; import java.io.I ...