微信号:MobileDevTips

介绍:专注与原创或者分享Android,iOS,ReactNative,Web前端移动开发领域高质量文章,主要包括业界最新动态,前沿技术趋势,开源函数库与工具等

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

2016-07-14 20:24 asce1885

@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 的树,有打印日志到文件的树等等,如果我们要使用某种类型的树,首选需要创建一个实例,并调用 Timer.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 的技术堆栈都会千差万别,这取决于团队的梯队建设和成员质量,每一个开源函数库的选择都会是折衷的,不存在哪一个函数库是必选的,总会有替代品,有时选择可能只是一念之差。但我们总是应该不断进步,不断发现或创造新的函数库,并应用到实际产品开发中,使得我们的工作和生活越来越美好,这个是大势所趋。

欢迎关注我的微信公众号 ASCE1885,专注与原创或者分享 Android,iOS,ReactNative,Web 前端移动开发领域高质量文章,主要包括业界最新动态,前沿技术趋势,开源函数库与工具等。


 
ASCE1885 更多文章 我的 React Native 技能树点亮计划 の React Native 从 ES5 到 ES6 的语法升级 互联网公司技术分享形式的探讨 关于Android 启动连续闪退保护方案的思考 移动开发工具巡礼 の 编码时间统计工具 WakaTime 移动开发工具巡礼 の 四象限时间管理利器 Focus Matrix
猜您喜欢 【游戏用户体验大会实录】周湘君:游戏视觉及社区文化 请不要惹程序员 后果很严重!!!! 数据库schema设计与优化 微信JS-SDK实例分享 .NET委托解析