写点什么

专访何红辉:谈谈 Android 源码中的设计模式

  • 2015-11-01
  • 本文字数:2990 字

    阅读完需:约 10 分钟

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

受访嘉宾介绍:
何红辉( @MrSimp1e ),前友盟 Android 工程师,活跃于国内各大技术社区,热爱开源,热爱技术,热爱分享。Android 开源库 AndroidEventBus Colorful 作者,开发技术前线站长,《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 日之前上市,到时候还希望大家多多支持。

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

2015-11-01 23:039848
用户头像

发布了 164 篇内容, 共 108.1 次阅读, 收获喜欢 392 次。

关注

评论

发布
暂无评论
发现更多内容

21年字节+美团+腾讯,大厂必问面试真题总结(Java岗)

Java架构师迁哥

自动交Y机器人开发|市值机器人源码搭建

量化系统19942438797

【墨天轮专访第三期】达梦数据库冯源:丢掉幻想投入战斗,国产数据库的机遇窗口已经来临!

墨天轮

数据库 国产数据库 达梦

网络攻防学习笔记 Day128

穿过生命散发芬芳

开发安全 9月日更

用友YonSuite在基于六力模型的SaaS产品中位居业界前列

海比研究院

没项目经历,面试有点怂....

Java架构师迁哥

TLS协议分析 (二) 架构总览

OpenIM

NeonIO 云原生存储简介与应用

QingStor分布式存储

云原生 分布式存储

从 ClickHouse 到自研 ByteHouse:实时数据分析场景下的优化实践

火山引擎开发者社区

Clickhouse

【LeetCode】数据流中的中位数Java题解

Albert

算法 LeetCode 9月日更

学生管理系统详细架构设计

Nullrable

关于takin-data,你想知道的都在这里(二)trace日志篇

TakinTalks稳定性社区

♟Go语言那些事儿之Redis连接与数据操作♟

Regan Yue

Go 语言 9月日更

关于takin-data,你想知道的都在这里(一)启动命令篇

TakinTalks稳定性社区

金融科技成为服贸会热议话题:数字化转型中如何保障金融安全

CECBC

从电视购物到电商直播,什么造就了「带货的参差」

融云 RongCloud

MVP验证方向,差异化策略超越竞争

石云升

MVP 9月日更

小游戏 合成

游戏开发_软件开发

关于比特币和区块链的3件重要事项

CECBC

卖NFT表情包赚上百万,区块链技术终于找到了真正价值?

CECBC

LeetCode刷题283-简单-移动零

ベ布小禅

9月日更

学习笔记:TCP传输控制协议(一)

姬翔

9月日更

为什么说敏捷开发是应用程序的未来?

优秀

敏捷开发

做百度AI工程师,还要会“相牛”?

百度大脑

人工智能

架构实战营模块7课后作业

燕燕 yen yen

架构实战营

Premo测试框架详解

趣链科技

区块链 测试工具 测试发开

逐梦航天—数字孪生技术仿真火箭发射!

ThingJS数字孪生引擎

大前端 物联网 可视化 航天 数字孪生

tomcat启动失败常见错误

hasWhere

执行update语句,用没用到索引,区别大吗?

Simon

MySQL 索引

浅谈实时语音质量监控系统

声网

音视频

三涧溪村:乡村产业插上数字化翅膀

工业互联网

专访何红辉:谈谈Android源码中的设计模式_移动_徐川_InfoQ精选文章