不想看我的废话,直接点击[导航]王小二的技术栈站目录
前言
我是一个从2014年毕业到目前为止一直在Android领域工作的工程师,我想分享一下个人的成长之路,帮助大家可以少走一些弯路,或者有一些新的启发。
2014年2月-2015年1月:
当时我是大四下半学期,公司希望我去实习,因为我之前是做javaweb方向的,所以我在寒假里差不多7天时间,学完了《疯狂android讲义》,刚开始实习,主要是解决bug,这时候改一个UI的字符串的异常,就已经很开心了,正好有同事要离职,他把一个已经开发差不多的APP交给我开发,这个时候我渐渐掌握了自定义控件,动画,Handler,四大组件的基础用法。由于是在手机厂商工作,所以也有了APK编译流程的概念,了解源码下编译APK和Eclipse编译的相似之处。
2015年2月-2015年5月:
去印度出差,增长了很多见识,也是第一次知道什么叫native crash,发现高通工程师分析log的能力非常强,这个时候我对整个android系统有了一丢丢的概念。最关键是了解到高通在手机厂商中角色。
2015年5月-2017年5月:
从印度回来之后,我被分配到了FWK组,主要是负责手机的稳定性,这个时候就会有大量的crash,手机重启等问题,渐渐的对system_server进程,开机流程,开机动画,zygote进程,Input子系统有了一些概念,幸运的是我参加了一个有关于VR的项目,让我对SurfaceFlinger有了一定的概念,但是这个时候说实话,我对native开发能力,也就能看看代码,有时候还看不明白,而且找了好多资料,都无法掌握native的开发能力,而且我持续不断的在学Binder机制,但是总是感觉没有学明白,老罗的《Android系统源代码》无数次的打开,又失望的合上。
2017年6月-2018年6月:
我认真的研究JNI,等研究完JNI之后,我发现不管是Binder机制,还是原来一些看不大懂的FWK的native代码,也能看懂了,还有Looper源码也更加理解了,但是说让我去开发一个native的程序,还是有一点虚的
2018年6月-2019年6月
我开始慢慢接触Linux kernel,复习C语言,慢慢的了解了Linux的一些IO复用机制例如Epoll机制,跨进程通信例如socket通信,pipe,匿名共享内存,对Binder驱动也差不多理解了百分之70,一下子把我前几年所学的知识串联起来了。
Looper:Epoll + eventfd
Input子系统:Socket + Epoll + Binder机制
Surface GUI:Binder + 匿名共享内存
虚拟机的fork:Socket
2019年6月-至今
我开始正式学习Linux kernel,主要方法是IO方向,正好学习了VFS,也看了Linux驱动开发的书籍,一下子发现了差不多完全理解Binde机制,而且通过Binder机制反过来了解Linux的进程管理,内存管理,同步锁等,我又看了《程序员的自我修养》这本书,对一个C语言程序在Linux系统上运行的状态,有了一个充分的了解,一下子我发现自己把整个Kernel+Fwk+App都打通了。脑海中可以浮现出整个手机运行状态的每个进程,每一个线程在干嘛。
借用gityuan的一段话描述我目前的一个状态:
Android系统之博大精深,包括Linux内核、Native、虚拟机、Framework,通过系统调用连通内核与用户空间,通过JNI打通用户空间的Java层和Native层,通过Binder、Socket、Handler等打通跨进程、跨线程的信息交换。只有真正阅读并理解系统核心架构的设计,解决问题和设计方案才能做到心中无剑胜有剑,才能做到知其然知其所以然。当修炼到此,恭喜你对系统有了更高一个层次的理解,正如太极剑法,忘记了所有招式,也就练成了太极剑法。
再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互工作,而是背后成千上万个小蝌蚪的动态执行流。记得《侠客行》里面的龙木二岛主终其一生也无法参透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙壁的图案想象成无数游动的蝌蚪,最终成就绝世神功。一言以蔽之,程序代码是死的,系统运转是活的,要以动态视角去理解系统架构。
未来
目前我的主要工作是负责android手机的性能优化,kernel的IO优化,我发现工作那么多年,只能说目前的自己真正有能力去研究一些东西了,自己的知识体系已经建立起来了,可以添砖加瓦了。
这些年我看过的书
但是我还是推荐这五本书
总结
1.从APP层-FWK层-Kernel层打通的难度和周期远远大于Kernel层-FWK层-APP层,我就是属于前者,走了太多的弯路,后者的发展之路,我相信会比我快很多,gityuan就是属于后者。
2.Binder机制一定能要研究,否则你基本不可能可以打通整个android系统。跨进程通信,跨线程通信都是我们需要去仔细研究的。
3.你可以不精通C++,但是一定要达到Linux C语言的开发能力,其实我们缺的不是Android NDK的能力,而是缺的是Linux C的开发能力。
4.多看看书,我文章中用了好多次的一下子,整个一下子真的是一下子顿悟了,因为我之前已经有大量知识的积累了,所以捅破窗户纸,就可以豁然开让,当然我的同事也很牛逼,也帮我捅破的很多窗户纸。
5.多去回答同事和网友的问题,在一次次回答问题,被反问中,你自己对知识的理解会不断的加深。
6.当你发现自己不懂的知识越来越多的时候,证明你懂的知识越来越多。