最美应用-从Android研发工程师的角度之厨房故事

@author ASCE1885的 Github 简书 微博 CSDN

本文我们将如约来分析下厨房故事这款德国app的技术堆栈。由于国内和国外网络环境,技术环境的不同,我们将会看到它和最美时光很不一样的东西。我们需要思考的是如果是自己开发一款全新的app时,会如何选择属于自己的技术堆栈呢?

使用的开源函数库

1. 底层库集合Bolts-Android

Bolts是一个由Parse和Facebook设计的面向iOS和Android的底层库集合,最初用于公司内部使用。它主要包含两个特性:

  • Tasks:更好的组织管理复杂的异步代码,类似于JavaScript的Promise。
  • 实现了App Links协议,帮助我们链接到其他app的提供的内容,同时处理接收到的deep-link。

参考文档:
Parse发布Bolts,一个面向iOS和Android的底层库集合

2. 开源日志记录函数库JakeWharton’s Timber

Timber是明星程序员JakeWharton开源的一个日志记录函数库,它基于Android Log类基础上, 提供了简洁可扩展的API。

日志记录行为被抽象为一颗一颗的树��,例如有打印日志到Logcat的树,有打印日志到文件的树等等,如果我们要使用某种类型的树,首选需要创建一个实例,并调用Timber.plant函数将其种植下来,之后就可以随意使用了。

3. 视图注入函数库Butterknife

Butterknife同样是JakeWharton的一个知名作品,基于编译时注解方式实现Android视图属性和方法的绑定,主要特性如下:

  • 在属性上使用@Bind注解代替findViewById
  • 支持多个类似的View组成一个列表或者数组,并一次性实现数组里面所有View的注入
  • 使用@OnClick对函数进行注解,可以替换匿名内部类的使用
  • 在属性上使用资源注解可以替换传统的资源查找方式

参考文档:
官方文档
ButterKnife–View注入框架

4. JSON解析函数库GSON

GSON是Google出品的函数库,可以将JSON字符串反序列化为对应的Java对象,或者反过来将Java对象序列化为对应的JSON字符串。免去了开发者手动通过JSONObject和JSONArray逐个JSON字段进行解析的烦恼,也减少了出错的可能性,增强了代码的质量。

参考文档:
官方的用户指南
第三方的用户指南

5. 现代的I/O操作函数库okio

okio作为java.io和java.nio的补充,是由square公司开发的一个函数库,使得开发者可以更方便的访问,存储和处理数据。一开始是作为okhttp的一个组件存在的,当然我们也可以单独使用它。

6. 现代的HTTP函数库OkHttp

OkHttp是一个高效的HTTP客户端,具有如下特性:

  • 支持HTTP/2和SPDY,对同一台主机的所有请求共享同一个socket
  • 当SPDY不可用时,使用连接池减少请求的延迟
  • 透明的GZIP压缩减少下载的数据大小
  • 缓存响应避免重复的网络请求

OkHttp在网络性能很差的情况下能够很好的工作,它能够避免常见的网络连接问题。如果你的HTTP服务由多个IP地址,OkHttp在第一次连接失败时,会尝试其他可选的地址。这对于IPv4+IPv6以及托管在冗余数据中心的服务来说是必要的。OkHttp使用现代的TLS特性(SNI, ALPN)初始化HTTP连接,但握手失败时,会降级使用TSL1.0尝试初始化连接。

更详细的使用方法参见文档。

7. 图片异步加载缓存函数库Android-Universal-Image-Loader

这个函数库简称UIL,是一个功能强大灵活且高度可自定义的用于加载,缓存和显示图片的开源函数库,它提供一系列配置选项,并能很好的控制图片加载和缓存的过程。

主要特性有:

  • 同步或者异步的多线程图片加载
  • 高度可自定义:线程池,下载器,解码器,内存和磁盘缓存,图片显示选项等等
  • 每张图片的显示支持多种自定义选项:默认存根图片,缓存切换,解码选项,Bitmap处理和显示等
  • 图片可缓存在内存或者磁盘(设备的文件系统或者SD卡)上
  • 可实时监听图片加载流程,包括下载进度。

参考文档:
Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
Android 开源框架Universal-Image-Loader完全解析
Android Universal Image Loader 源码分析

8. 内存泄露检测函数库LeakCanary

LeakCanary是Square公司又一力作,可用于Debug版本中监控Activity,Fragment等的内存泄露,使用这个函数库后,square修复了很多内存泄露问题,甚至发现了Android SDK中的泄露,号称解决了自家产品中94%的oom泄露问题。

参考文档:
LeakCanary:检测所有的内存泄漏
利用 LeakCanary 来检查 Android 内存泄漏

9. 专为移动设备而生的数据库Realm

Realm是一个现代的移动平台数据库,用于替换SQLite和Core Data,它的主要特性有:

  • 移动优先:第一个专为手机,平板和可穿戴设备而生的数据库
  • 使用简单:Realm不是基于SQLite之上的ORM框架,相反,它实现了自己的持久化引擎,专注于简单和速度。
  • 跨平台:Realm支持iOS & OS X(Objective-C & Swift)& Android三个平台,可以跨平台共享Realm文件,在Java,Swift和Objective-C中使用相同的模型类,在所有平台上实现相似的业务逻辑。
  • 快速:归功于零拷贝设计,Realm比ORM框架快很多,通常情况下也快于原生SQLite数据库。
  • 良好的支持:官方在Github,StackOverflow和Twitter上都提供良好的技术支持。

Realm相对于SQLite而言是一个较新的函数库,还在快速发展进化中,喜欢尝试新技术的同学可以试试看,当然机遇和挑战并存,你可能会遇到一些隐藏的bug需要花精力修复,不过一个人想要追求技术的进步就是需要不断挑战自我的。

目前试用Realm的知名产品如下图所示:

参考文档:
Realm数据库基础教程

10. 依赖注入函数库Dagger

Dagger是Square公司开源的一个针对Android和Java的快速依赖注入函数库,是受到Guice的启发创建的。它在编译时实现绑定,并使用反射机制实现图的构成。

Dagger算是一个比较成熟稳定的函数库了,Google维护了一个新分支,习惯上称之为Dagger2,它在Dagger的基础上不断进化,取消了反射的使用,提供了更好的性能,因此,目前来看,如果要使用Dagger作为依赖注入函数库的话,推荐采用Dagger2。

参考文档:
Dagger: 一种Android平台的依赖注入框架
Dagger 源码解析
详解Dagger2

11. EventBus

GreenRobot开发的EventBus是一个专门为Android平台优化过的发布订阅事件总线系统。它简化了Android四大组件之间的通信,使得系统更好的解耦。EventBus的优点是代码简洁,使用简单,并将事件发布与订阅充分解耦。比较有名的另外一个事件总线函数库Square公司是otto。

参考文档:
EventBus 源码解析
EventBus使用详解
跟我一起写EventBus

12. Design Support Library

Google I/O 2015为Android开发者带来的一个全新的开发函数库,使得开发者更容易创建符合材料设计的移动应用。

Android的材料设计兼容库(Design Support Library)

使用的第三方SDK

1. 云服务Parse SDK

Parse是一个国外的云服务平台,一年多前被Facebook收购,目前办公地点在美国的加利福尼亚。厨房故事app使用了这家的云服务,因此引入了对应平台的SDK。

2. Crash统计SDK Crashlytics

Crashlytic 成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具。2013年1月,Crashlytics被Twitter收购,成为又一个成功的创业产品。Crashlytics是功能强大且轻量级的Crash统计SDK,支持Java层和NDK层崩溃统计与分析。

参考文档:
Android下使用Crashlytics
iOS开发工具——统计Crash的工具Crashlytics

3. Facebook SDK

Facebook由于某些众所周知的原因,在国内是几乎用不了的,但这并不妨碍我们进行介绍,有兴趣的话你还可以下载这个SDK下来看下源码,还是有值得学习的地方的。翻不了墙的可以到我的网盘下载。

参考文档:
Android下使用最新FaceBook SDK 3.0

4. Google推送服务GMS

还是由于某些众所周知的原因,国内的app几乎没有使用GMS的,但作为Android开发者还是应该知道它的存在的。

5. amplitude sdk

实时的用户统计分析工具,类似国内的友盟,知道用户使用app的行为,能够帮助产品经理更好的不断改进产品。

分析与总结

和最美时光相比,厨房故事虽然在某些开源库的选择上有些重叠(都使用了GSON,OkHttp,okio,UIL,Timber等),但主体上可以看出很大的不同,厨房故事使用的开源函数库更“前卫”一些。无论是全新数据库Realm的使用,Google刚推出不久的Design Support Library的使用,还是LeakCanary的引入,使用RecyclerView代替ListView,抑或是充分利用依赖注入如ButterKnife,dagger来简化代码,都可以看出厨房故事更善于,更有勇气利用新技术来为自身服务。

另一方面,从使用的第三方SDK可以看出国内app和国外app的显著不同之处。当然,每个app的技术堆栈都会千差万别,这取决于团队的梯队建设和成员质量,每一个开源函数库的选择都会是折衷的,不存在哪一个函数库是必选的,总会有替代品,有时选择可能只是一念之差。但我们总是应该不断进步,不断发现或创造新的函数库,并应用到实际产品开发中,使得我们的工作和生活越来越美好,这个是大势所趋。

文末摄影鉴赏

更多相关文章

  1. Android(安卓)官方 Training 文档学习总结系列之「支持不同的设
  2. 关于 Android(安卓)Fragment的官方说明文档
  3. dom读取xml文档---android
  4. Develop -- Training(十四) -- 打印内容
  5. Android采用Pull解析和生成xml文档
  6. Android(安卓)判断是否有刘海屏
  7. Symbian/Android/iOS/WM应用程序开发感受对比
  8. Daager2-初认识一
  9. 【开源项目推荐】Android(安卓)Jetpack 官方文档 中文翻译

随机推荐

  1. android下载的进度条
  2. android 上层wifi模块调用分析
  3. android 定时器与Canvas结合使用
  4. android关闭或开启移动网络数据(关闭后,设
  5. android的crash log
  6. Ubuntu10.10上的Android开发环境搭建
  7. android 设置桌面背景
  8. Android(安卓)8.0 设置默认闹钟提示音或
  9. Android核心基础(十)
  10. android学习轨迹之二:Android权限标签uses