0%

始发站,将通往何处

起床,吃饭,就到了晌午。
这周的任务还没有完成,在家里总是慵懒的状态,转念来到楼下的咖啡馆—HappyTree,躺在沙发上思考这个奇怪的问题。不想写鸡汤或者感悟,但是这文风不对啊!
这是一篇Guide,罗列一些技术的兴奋点(G点?)。虽然我属于杂牌军系列,什么都想搞一些,可是现在还是专注于Android方向。

切入点

不管在哪工作,一直都在思考或者观察这两个问题

  • 如何搭建一个高效的开发框架
  • 如何组建一个有战斗力的团队

本文主要从第一点思考问题,一个合格的框架是怎样组成的?谈谈我经历的两个团队(有机会写文章细谈),第一团队,简单规范的开发框架,入门程序员也可以完成开发,第二个团队,项目太久,框架太多导致没有框架,自由发挥。理所当然地认为前者niubility,后者太low。但是在第一个团队有一种错觉,技术就是这些东西,没有什么可以说的了。直到现在,当自己思考如何构建一个框架的时候,发现世界如此精彩。
用时刻准备创业的心态去思考工作。所以,现在我在始发站,总有一天会启程。最近有一篇很不错的微信团队的文章《创业码农的一些建议》,核心思想:“不要重复发明轮子”,当然这不意味着不需要知道怎么制造轮子。那么,看看如何用这些轮子来造车。

构建一个App

一个完备的app应当具有这些基础能力

  • 网络能力(https、下载、升级等)
  • 图片库
  • 数据库框架
  • 开发框架(模式)
  • 公共库/控件库/工具库
  • apk打包与瘦身
  • bug跟踪机制/质量保证
  • 用户分析系统
  • 推送机制/长连接方案
  • 对内规范(工程结构、代码style等)
  • 对外规范(接口规范、沟通规范)

一个优秀的app应当具有这些技术能力

  • 灰度发布能力
  • 插件化技术
  • 热修复技术
  • Android测试技术
  • mock系统
  • 性能优化(内存,启动时间等)
  • apk安全问题

团队协作的基础设施

  • 版本管理工具
  • Code Review工具
  • 持续集成

网络能力

okhttp 现在使用中,http基础库,良好的同步/异步接口

android-async-http 之前使用,比较老,功能也比较完备

okhttp\android-async-http\volley\retrofit 比较
okhttp 和 async http是一个基础的通信库,都很强大,但需要自己封装使用才更方便。另外okhttp已经被谷歌官方用在android源码中了。 retrofit和 volley是属于比较高级点的封装库了。其中 retrofit是默认使用okhttp,volley也支持okhttp作为其底层通信的部件。retrofit的特点是使用清晰简单的接口,非常方便,而 volley在使用的时候也还简单,不过要使用高级一点的功能需要自己自定义很多东西,个人常用 retrofit+okhttp
链接:https://www.zhihu.com/question/35189851/answer/62857319
来源:知乎

Gson json解析,一直使用这个库

jackson 没有使用过,有空研究一下

jackson gson fastjson
jackson 似乎有优势,尤其是大文件多并发的情况下

图片库

Android-Universal-Image-Loader 使用过且阅读过源码,比较简单,功能较弱,无法很好应当OOM

Glide 目前使用的的库,在非专业图片应用中强烈推荐,综合各种数据最优秀的Lib,同时也是Google推荐的。支持gif(webp动图不支持?video支持?)源码中大量的接口的设计,十分值得学习。大小500kb以内。

fresco 最优秀的内存管理和最强大的功能,支持WebP动图。FB出品,一些黑科技,代码复杂,压缩后通用安装包代码1M(包含两个平台的so)。

Fresco vs UIL vs Glide vs Piasso
UIL 比较老,功能比较弱(不支持Gif WebP),
Fresco最为强大,问题是对外接口不友好(需要替换ImageView),在使用过程遇到问题很难修改源码解决问题,比较复杂,建议不是图片特别重的App不要使用。
Piasso 都没有使用过,对外接口简单。据说:『Glide的性能更好一些,并且支持更多格式的图片』,以后有时间调研一下Glide。

数据库框架

DBFlow

开发框架

这里包括且不限于:一些设计模式(MVC等),一些多线程工具库(代替AsyncTask,如Bolts等)

Bolts-Android android多线程,取代AsyncTask作为统一的线程池。具有链式调用的结构,可指定运行的不通线程。FB出品,现在在使用中,入门简单,使用代价很小。

MVP && MVVM MVP是在开发中常用的设计模式,当前使用中。

Flow 思想 一种单向数据流的思想,在React框架中使用,可以在移动开发中使用。FB出名,学习ing,没有实践过。

Flow VS MVP ?

RxJava RxAndroid ReactiveX的Java版本和Android扩展,强大!链式调用,可以代替Bolts的所有功能(也可以封装后代替EventBus),一种完备的开发框架(思想)。微软出品,学习中,入门较难,对团队要求很高,可以极大简化代码。

EventBus 一种总线机制,使用发布-订阅的方式解耦模块,没有使用过。类似的还有Otto

关于一些团队内部使用的框架:大致思想类似于bolts这一类框架再封装一下网络框架。方便开发者快速发起Rest请求并且在合适的线程处理数据和UI。

其他:
EventBus VS RxJava

待补充:一些其他的注入框架,和如何联合使用这些框架。

公共库/控件库/工具库

待补充,主要是一些通用的公共组件和工具类,可能包含BaseActivity\BaseFragment,xxxUtils。一些动画库nineOld
Timber:开源日志记录函数库,JakeWharton开发,默认打印类名。
其他辅助开发工具

bug跟踪机制/质量保证

发现问题的能力是App的一种重要的能力,类似百度使用的Crab平台跟踪用户崩溃和bug率是重要的。

bug跟踪系统 上报用户崩溃数据,部分用户分析工具具备此功能(如GA),但是建议加入专门的bug上报工具,类似百,功能强大。

用户反馈的设计 一般app都需要反馈模块供用户主动反应问题。

性能、内存监控 主要是开发阶段使用,暴露问题。例如LeakCanary、BlockCanary

用户分析系统

跟踪用户行为,收集数据是持续优化的基础,也是产品重要能力。基本的埋点机制或者类似于Google Analyse的分析系统

App埋点设计与数据上报

接入第三方分析系统 获取用户行为数据,形成画像是这些系统的重要功能。

推送机制/长连接方案

推送的第三方方案,信鸽、other?
部分应用可能需要长连接,MQTT

对内规范

构建工程结构 如何构建合理的工程结构,依据业务?功能?,如何方便扩展功能,发布不通版本?

代码Style Square的java-code-styles,也可以自己fork做相应的修改

资源Style Android特有的问题,dimens,styles,strings中按照UI需求设计一些基本的公共值(业务无关?)。否则会导致不可控。

代码检测 代码静态检测,动态检测,提前发现潜在问题,提高代码质量。

CodeReview 代码提交commit前的审核流程

对外规范

网络请求 http or https,get or post ,是否使用私有证书?

json格式规范 使用标准的json格式,定义合理的返回结构和状态码(错误码建议不要使用http head中的代码,部分广告工具/防火墙拦截,而是定义在json中)。

加密方式服规范 定义不同信息的安全等级以及对应加密算法—DES or RSA or MD5校验

迭代流程与发版规范 敏捷流程,灰度/发版标准(bug率?)

问题解决流程 次奥,这些问题太多了

灰度发布

待研究,GooglePlay具有此功能,也可以自行开发,对于用户量较多的App此功能具有重要意义,防止新版本问题影响到全部用户和验证功能效果都有作用。

插件化技术

简单可靠的插件化技术 插件化是大型产品的框架需求,尤其是平台化产品或者对App安装包大小有严格限制的应用。同时也是对65535限制的技术解决方案。

热修复技术

热修复技术研究 热修复技术是产品上线后紧急修复的需要,是对灰度发布补充。

mock系统

client团队内部开发使用,可以部分解决server与client开发不协调的问题,尤其是server进度慢于client的情况,也可以用于client程序员自己调试程序。

性能优化

App迭代到一定阶段,自然而然地会进入这么一个阶段。一个好的框架可能会暂时隐藏这些问题。但是对系统的持续监控(性能分析报告)是必不可少,及早发现问题与定位,寻求时间优化问题十分重要。

版本管理工具

git 使用较多的版本管理工具,代替svn等传统工具
git flow git版本管理的工作流的最佳实践。满足正式开发、新特性预研、灰度、Release等版本的发布需求。
git服务器搭建
gitlab 开源的本地管理系统,类似github的功能

Code Review工具

Gerrit 适用于团队内部开发代码提交审核的工具。以及该工具与IDE、Git的集成。

持续集成

jenkins+git+gerrit方案 将Android的Gradle build 持续集成

是否考虑第三方服务?

趋势

作为一个程序员,能感受到Android开发技术发展迅速,新技术目不暇接。分享一些信息获取渠道。对于趋势,类比于其他技术是种不错的思路,《从中间件的历史来看移动App开发的未来》给我一些启发。

React FB提出的一种Js的mvc开发框架,虚拟dom具有高效的特点,并且可以扩展到App中。JavaScript有望占领前后端(Node.js)和各个平台。

React Native React的android版本,有望取代其他的hybrid开发框架。

最后一些话

至此,基本总结了App开发的技术点,留了很多坑等着以后慢慢填,每一点展开都能写很多。后续会不断更新这些文章到自己的博文,也可能增删一些内容。从哪里开始写还没有想好,期间会插入一些小项目。打算在春节前写一个抢红包的系列文章,主要分析一些抢红包插件的源码。

本人一年多的工作经验,大部分的内容也在探索中或者只有一些概念,任何问题欢迎提出。

欢迎关注我的其它发布渠道