Android 开发进阶指南

之前有人在朋友圈评论我说,现在学习Android 遇到了瓶颈,基本上一般的API,市面上大部分App UI 都能做出来,该怎么提高?然后我回复他了,我学习Android 也有一年左右,也是个菜鸟,也遇到这样的问题,所以就各种查资料,看看大神们都在研究什么技术,也跟着学习学习。当初在逛知乎看到了一些问题(PS:逛知乎还是很有好处的嘛!!!),看到很多回答就觉得很受启发,还有看别人的博客,也很受用,想要写一篇文章的想法,等了一两周才开始动手。

新手学习遇到瓶颈


我觉得新手做的更多是重复的工作,可能接触好的项目,前一两个月会觉得学到好的东西,但是随着公司的东西慢慢熟悉,也就变成日复一日的重复劳动,然后慢慢感觉也就学习遇到了瓶颈,而一些太难的东西又不太情愿去琢磨,比如读Android 源码,你使用Handler Loopeer 感觉很巧妙,可以仔细研究一下;还有就是很多第三方开源库你使用起来很方便,如果这个时候你仔细阅读源码,也一定能感受它的设计的巧妙。因此,我多方搜集,整理出来了以下几条,有一定经验接下来要做的事。

  • 解决问题的能力。可能老手的遇到的Bug 可能比你写的代码都多。
  • 阅读和理解源码。新手可能就是使用API,而老手会去阅读源码,理解开源项目或者Android 系统的源码,理解他们的架构。
  • 深入理解Java 和Android 。Android 应用层的东西基本上基于Java,想要写好Android,Java 已经要过关。
  • 了解编译原理等CS基本知识。我觉得这一条是每个程序员应该必备的。比如像计算机网络(HTTP,TCP/IP),算法与数据结构。
    下面我会分别按照这几点给大家详细讲解(其实是来看看大牛们的演讲)。

解决问题的能力


我觉得这个我没有能力回答,不过之前有幸听过一个演讲,@阿拉神农 邓凡平老师在北京GDG DevFest 的一个演讲,说过你进入一个项目组,不要惧怕问题和Bug,你把很多问题解决了,你的技术也会上升到一个层次。邓老师在文中也提到了怎么学,学到什么程度,以及学什么,还专门提到多线程,网络(HTTP,TCP/IP)编程,设计模式这些基础东西,就算Android 有一天不行了,这些东西也一样会被吸收借鉴的。
关于演讲的内容:《Android开发进阶之旅》
http://weibo.com/1826440077/D36AAiF2G。

注:邓老师从事软件开发有十余年,之前是做底层开发,现在在做应用层的开发,他也是《深入理解Android》系列书籍的主要作者之一。

阅读和理解源码


这个问题我也没有多大能力去回答,也读过一些开源库的源码,像Retrofit,Volley,还有像Handler Loopeer 的机制,其他的虽然阅读过,但是没有理解太深,这也是我以后努力的方向。还有人问问什么要读源码,我想说,如果你写写XML 布局文件,会用用API,一个实习生两三个月就和你差不多了,你还有什么资历说你很有经验,知其然知其所以然说的就是这样的意思,阅读和理解源码让你更好使用API,解决问题的能力也大有提高,也有了造轮子的能力。当然了跳槽面试的时候也可以吹牛逼了。

下面的两篇文章是Kaede 的博客上两篇文章,他也有自己的知乎专栏——《中二病也要开发Android》。Kaede 在文中阐述了,为什么要阅读Android 源码,以及该怎么读,还有要读哪些,对于源码接触不太多的同学有个参考,也推荐一些大牛的博客,站在巨人的肩上,有了前人的参考,也会事倍功半的。

深入理解Java


Java语言相对来说比C++ 简单很多,但是对于经常写业务代码的人,对于如何写出优雅的java代码以及如何辨别垃圾代码,还有Java的内存模型/GC,并发机制,虚拟机执行流程肯定不甚了解,因此,这个阶段,我打算大致搞清楚Java语言本身,顺便从这个角度切入编程语言本身;主要如下:

  1. 学习如何写更好的Java 代码,《Effective Java》值得一读。
  2. 什么样的Java 代码是有问题的?《Java解惑》;怎么改写代码?《重构》
  3. 学习一些没有接触过的Java 高级库,NIO/AIO, concurrent/forkjoin等,有机会使用到工作过程中。
  4. 了解Java 虚拟机 《深入理解Java 虚拟机》《实战Java 虚拟机》;从这里,可以知道很多JVM 的运行原理,内存模型,class 文件格式,Java 并发原理,虚拟机执行引擎等相当多的东西;虽然说Android 的虚拟机Dalvik 和ART(ART 也许称不上虚拟机)使用的不是标准的HotSpot 但是,我相信原理都差不多。

但是,Java平台的技术栈远非这么一点,学无止境;走到这一步,我觉得对于Java语言已经算得上掌握了,于是主要目标转向编程语言本身。

深入Android


这一块有很多人分享过经验,其实无非那么几点,我就简单重申一下吧。

  1. IPC机制,Binder和匿名共享内存等
  2. 四大组件启动,工作原理
  3. View系统,绘制原理,事件分发
  4. 动画框架,原理
  5. 多线程机制,消息机制 AsyncTask,Thread/Handler
  6. 系统启动过程,system_server启动过程
  7. Window系统,Window创建过程
  8. 资源管理系统,资源加载机制等

《Android 开发艺术探索》这本书确实不错,适合中级程序员。个人感觉《Android 内核剖析》挺不错的,虽然有点过时了也买不到书了。 《Android 源码设计模式》,在Android 的源码中都有什么使用哪些设计模式,也让你更深入去理解源码。
当你搞清楚了这些,基本上你写的什么代码在Android 上层是怎么运作的都了然于胸;FrameWork 层的任何问题也拦不住你的脚步了;不过这个阶段,仅仅是了解了Android 系统Framework 层的原理,对于怎么写代码,对于语言本身,对于Android 系统底层的原理依然很迷惑,没事,已经看到了光了,一步一步来。

除了Android 源码值得读的,还有第三方的开源库也是值得一读的,有的开源库甚至比官方的更加好用,比如像我们常用的Retrofit,OkHttp,Picasso,Volley,EventBus,Dagger,我们基本上都能熟悉使用,Trinea 和一些大牛在Github 做的一个项目,专门分析了开源项目,我们可以参考着来看。

我觉得新手阅读源码的姿势还是有点弱,当然站在巨人的肩膀就会事半功倍,所以看看大牛写的文章还是很~(≧▽≦)/~涨姿势的。

了解编译原理等CS基本知识


推荐一下R 大的书单吧:http://zhuanlan.zhihu.com/hllvm/20130808。
当然由于定位不一样,我肯定不会像他一样专门搞搞基语言虚拟机(主要是我没那个水平!),仅供参考;我自己目前看的几本书如下:《编程语言实现模式》《深入理解计算机系统》《SICP》《编译器设计》;然后由于在学Haskell,所以在追github上一个项目,sdiehl/write-you-a-haskell ;具体怎么做还是边走边瞧。
后面的我也不敢说太多,目前打算是希望深入了解Linux内核,以前看过《深度探索Linux 操作系统:系统构建和原理解析》;打算看《深入Linux内核》《Unix环境高级编程》;只要越过了浮躁期,其实目标还是很明确的;知道自己该学习什么,也知道大致该怎么做;感觉自己走在正确的路上,越来越接近那个目标,每天都充满希望。

参考


本文部分章节参考来自weishu 在知乎上面的回答,如果你觉得本文不错,也可以点击链接可以给打点个赞,在这里多谢了。

本篇文章能够完成,参考了weishu,邓凡平老师,kaedea,Trinea,当然也看了很多博客,在这里特别感谢他们,本人资历尚且有限,写过过程中难免会有疏漏,还请见谅。


安卓同学(AndroidMate)的公众号,更多分享...