我工作这几年(五)-- Android学习4.5月总结(一)
今年是对我个人成长和程序员生涯冲击很大的一年。
有了小孩之后,家里发生了太多太多的事情,现在已经慢慢步入正轨,还好撑过来了,当然还有老婆、岳父岳母、我爸妈、还有好多关心支持我的人的帮助。在各种挫折交替出现又慢慢过来后,这些人生的小插曲也让我开始成熟起来。绝大多半时候我是改变不了环境和他人的,能改变的只有我自己,以及我自己对问题的看法和态度。
程序员生涯,因为部门调整,我被迫放弃了我做了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,可以很好地解决这个问题。这部分已经详细记录在这几个文章:《Launcher中动态加载其它APK中Activity的问题解决思路》、《Android 4.0Launcher2源码分析——Laucher界面元素分解(主布局文件内容介绍)》、《Android通过sharedUserId机制实现APK间共享数据,App的换肤可以通过此机制实现》、《Android 4.2.2原生Launcher修改使之可以运行过程小结》、《Launcher主要类的功能说明》、《某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法》、《Launcher中动态加载APK出现java.lang.SecurityException异常的解决方法(二)》。部分是参考了其他前人的blog。期间将Launcher的框架大致过了一遍,并将Launcher启动过程相关的代码都重点研究了一下。通过研究了Launcher,基本了解了如何使用界面控件来实现布局复杂的界面,同时大概了解了Android的touch事件的具体分发过程,具体见《android触摸事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结》。研究Launcher大概陆陆续续花了我两周多的时间,期间还有一个功能没有实现完。通过Launcher动态加载v1版本的APK,在第一次更新版本v2后,Launcher可以加载到更新后的新的class;但是之后更新版本到v3、v4…等后,Launcher加载的版本一直在v1、v2之间来回切换。在分析这个问题中将Android的ActivityManagerService、PackageManagerService等相关类都重点研究过,仍没有找到根因,后来因为其它事情,这个问题就优先级放低了。至今因为项目原因,也没有抽出空再进一步分析下。如果有哪位高人也处理过类似的问题,希望能一起交流下。
分析Launcher过程中,我最大的收获还不是对Android动态加载机制的了解,而是顺带了解到Binder机制,并充分地研究了一下。通过把Binder机制了解透,对我后面认识透Android应用开发,非常有帮助,通过对原理的理解,我还成功协助其他组找到了一个现网问题的根因。对Binder机制介绍得比较透彻的,可以看看这几个文章:《Android深入浅出之Binder机制》、《Android Binder设计与实现 –设计篇》、《Android进程间通信(IPC)机制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被显示到屏幕上的整个过程的主要源码分析。
这篇Blog陆陆续续地写,本来今天想把它写完,发现只能写一半,余下的部分后面抽空再补上。
我工作这几年(五)-- Android学习4.5月总结(一)的更多相关文章
- 问题:android学习内容破碎,我个人关于如何学习android的一些个人经历
android学习两个月心得 我于大三下学期,开始准备学习android,在寒假期间,学了毕向东的java视频的前10天,觉得还不错,上网找评论,他们都说,只要学到多线程就可以学习android了, ...
- 工作不久的安卓开发者,他们是这样规划自己的Android学习路线
Android开发工作者工作不久的时候,会有一段迷茫期,觉得自己应该再学一点,却不知道从何学起,该怎样规划自己的学习路线呢?今天,我给大家梳理一下Android基础,就像建造房屋一样,要建造一座宏伟的 ...
- 六、Android学习第五天——Handler的使用(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...
- 五、Android学习第四天补充——Android的常用控件(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...
- 工作无聊,闲来无事,自己学习 android入门
工作无聊,闲来无事,自己学习. 最近几天看了看有关android的UI设计,布局以及android有关控件的知识,算是进一步了解了 android的相关内容. 明天就是周末了,明天及后天,我打算开始学 ...
- 二十六个月Android学习工作总结【转】
原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...
- 【Android】完善Android学习(五:API 3.2)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
随机推荐
- QSerialPort
(草稿) qt5提供QSerialPort类,封装了串口的api, 可以用这个类写串口通信程序.
- 网页制作之JavaScript部分 2 - DOM操作
1.DOM的基本概念 htmlDOM是一种面向对象的树的模型,它包含html中的所有元素:通过html可以找到所有包含在dom中的元素. DOM是文档对象模型,这种模型为树模型:文档是指标签文档:对 ...
- ant 关键字和关键语句
学习ant推荐的两个blog http://www.cnblogs.com/huozhicheng/archive/2010/04/08/2533199.htmlhttp://www.cnblogs. ...
- [转]-bash: wget: command not found的两种解决方法
wget 时提示 -bash:wget command not found,很明显没有安装wget软件包.一般linux最小化安装时,wget不会默认被安装,这里是CentOS 6.5 64位系统 解 ...
- JAVA中MESSAGEBOX,静态类直接引用
原文:JAVA中MESSAGEBOX,静态类直接引用 package cisdi.mes.wrm.mcode.serviceImpl; import javax.persistence.Entity; ...
- @(报错)could not find the main class, Program will exit(已解决)
原文 @(报错)could not find the main class, Program will exit(已解决) (很抱歉,如果你希望能更加清楚地看清图片或是图上的文字的话,你可以 ...
- hdu 1166 敌兵布阵(线段树,树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 直接线段树模板 AC代码: #include<iostream> #include<cs ...
- Linux - 输入输出流程序 代码(C)
输入输出流程序 代码(C) 本文地址:http://blog.csdn.net/caroline_wendy 使用输入输出流,控制文件流. STDIN_FILENO,STDOUT_FILENO代表标准 ...
- Activity 和 Intent
Activity 和 Intent 一.Intent指向Activity 二.利用 Intent 向第二个 Activity 传数据 三.利用 Intent 接受第二个 Activity 的返回值 四 ...
- C# 中 双问号??的用法
int? x = null;int y = x ?? -1; 这里的y不能为null,但是等于x,x为null时赋值给y会报错.?? 可以在x==null时对y赋值-1 更多相关资料:https:// ...