今年是对我个人成长和程序员生涯冲击很大的一年。有了小孩之后,家里发生了太多太多的事情,现在已经慢慢步入正轨,还好撑过来了,当然还有老婆、岳父岳母、我爸妈、还有好多关心支持我的人的帮助。在各种挫折交替出现又慢慢过来后,这些人生的小插曲也让我开始成熟起来。绝大多半时候我是改变不了环境和他人的,能改变的只有我自己,以及我自己对问题的看法和态度。
程序员生涯,因为部门调整,我被迫放弃了我做了3年多的多媒体会议业务,放弃了一起打拼了近两年并逐渐成熟的团队,加入了一个新部门,去做全新的业务。这个过程让我非常痛苦,也许这就是人生,多半时候我们只会在特定事件发生后得到一个通知,仅此而已,你只能接受,没有更多的选择。
我的运气不坏,新部门的领导是我刚进公司时的领导,他还当了我的PM带了一年多的项目,彼此还十分熟悉。另一个领导也是一起做过近2年的项目的。刚加入新部门,我做了一个多月的服务器的开发,这个也是我非常熟悉的领域,进公司到那个时间点,基本上一直在做服务器开发。这个一个多月做的东西,后面有空再写个blog详细地记录下来。
这一个多月在开发服务器代码期间,我一直在思考我的未来该向哪个方向走,纯开发?带项目?带人?又或者……想不清楚,也咨询过之前一些领导的意见,都没有很好地解决我的困惑,在看不清楚前面的情况下,我对部门的人员分布和业务分布进行了综合地分析。服务器的框架+源码研究了大概一周,基本都搞明白,核心部分的代码也都研究得差不多了,没有太多的东西可学,提升的机会不大。客户端,主要分iOS、Android,Android是基于Java的,我有3.5年的Java经验,上手会快一些;iOS的语法比较生涩,放弃。在换部门之前,也简单地看过一点Android的入门视频,就去做Android吧,目前这个部门做Android的人也比较少,经验最久的也是1年多而已。
最开始做时,没有明确的任务,有较多时间学习,重点看过两个大牛的Blog:maxleng、老罗。Maxleng的blog,大概看了70%,部分有重点看,部分大致浏览过;老罗的,大概看了30%,其中Binder、Activity、View、ActivityManagerService等相关的,看过3遍以上。Maxleng的文章,非常大气,一开始从宏观上就对Android进行了剖析,从系统架构的视角分析来得到逻辑结构和系统构成。老罗将整个Android划分成为N大块,然后一块一块地分析,对想了解更多细节的我来说,其实更对胃口。
期间我重点看过这本书:《ANDROID框架揭秘》,重点部分看过2遍,非重点浏览过一遍。这本书让我对Android系统初始化的过程,Dalvik的启动过程,Android App的启动过程,Binder机制等有了初步认识,在在看此书的同时,我下载了一份完整的Android 4.2.2的完整代码,将关键部分的代码全部导致到同一个Source Insight工程中,对照书中提及的关键代码,有完整跟过一遍,说实话,看完书和代码,过段时间细节基本上忘光了,只记得大致框架。
接到的第一个正式的Android相关的任务,是AndroidLauncher相关的。基于Launcher实现一个动态加载应用的框架,Launcher中的某一屏的显示分成3个部分:上侧、左侧、右侧;左侧、上侧这两部分都需要通过动态加载来实现。这样实现的好处是:由于我们要实现一个复杂的Launcher,如果所有的小应用、动画效果都在Launcher中实现,那Launcher会做得很庞大,也不利于后面的升级,通过Launcher的根据需要动态加载某些APK中的Activity,可以很好地解决这个问题。部分是参考了其他前人的blog。期间将Launcher的框架大致过了一遍,并将Launcher启动过程相关的代码都重点研究了一下。通过研究了Launcher,基本了解了如何使用界面控件来实现布局复杂的界面,同时大概了解了Android的touch事件的具体分发过程。研究Launcher大概陆陆续续花了我两周多的时间,期间还有一个功能没有实现完。通过Launcher动态加载v1版本的APK,在第一次更新版本v2后,Launcher可以加载到更新后的新的class;但是之后更新版本到v3、v4…等后,Launcher加载的版本一直在v1、v2之间来回切换。在分析这个问题中将Android的ActivityManagerService、PackageManagerService等相关类都重点研究过,仍没有找到根因,后来因为其它事情,这个问题就优先级放低了。至今因为项目原因,也没有抽出空再进一步分析下。如果有哪位高人也处理过类似的问题,希望能一起交流下。
分析Launcher过程中,我最大的收获还不是对Android动态加载机制的了解,而是顺带了解到Binder机制,并充分地研究了一下。通过把Binder机制了解透,对我后面认识透Android应用开发,非常有帮助,通过对原理的理解,我还成功协助其他组找到了一个现网问题的根因。对Binder机制介绍得比较透彻的。前面两个从原理层面有分析得比较透彻,第三个从代码层面对Binder机制进行了分析。Android应用开发相对简单,但实际上Android下层干了N多的事情,一个简单的Activity最终显示到屏幕上,下层有N多的服务为这个Activity服务。Activity与这些服务交互,都是基于Binder机制的,如果不了解Binder,你是没法进一步去向下学习的。Binder是什么,说白了就是进程间通信的高性能的实现。我学习Binder机制的过程,《ANDROID框架揭秘》这本书基本上了读了一遍,末尾篇章大致过了一下,“第7章 Android Binder IPC”这部分读了3次,《Android深入浅出之Binder机制》、《Android Binder设计与实现 –设计篇》在刚接触Binder时和基本了解了Binder后分别读了一遍,老罗的Binder那几篇文章也差不多读了两篇,在读相关文章的同时,也顺带走读了部分Binder相关的代码两次,Binder驱动相关的代码也顺带走读了一小部分。
不了解Binder,也不影响Android应用开发,但如果想在Android方面要走得更远,建议还是好好了解下Binder。掌握了Binder机制,我还进一步学习了AndroidFramework相关的内容,像ActivityManagerService、WindowManagerService等,以及点击应用图标到Activity被显示到屏幕上的整个过程的主要源码分析。作者:zhao3546。