Android虚拟机一年工作感受

前段时间一度产生了换工作的想法,原因是自己在手机厂商做了一年的Android底层,却没有获取什么成就感,平日里面工作缺乏激情,希望往上层方向继续发展。也投了几份简历,虽然没有拿到目标公司的offer,但也还算还有不错的结果,最终选择了拒掉,选择在现在的公司继续待着。

其实算起来,毕业工作才一年半。毕竟是野路子出身,自学的Android应用开发,没有比较优秀的上架应用,后来有机会被领导安排来做Android虚拟机的工作。

真正开始做虚拟机,是去年8月初的事,那时候我刚转正,一直在sensor底层方向做小方案。sensor不能说是我喜欢的方向,但是作为手机器件较为核心的一块,有不少可以挖掘的东西。从RTOS到Linux驱动,从framework到app,那时的我都把代码分析了一遍,觉得没有什么太大的难度,配合同事做开发解问题也没有遇到太多的坑。直到有一天,领导说,有一块新业务,Android虚拟机,没有人做过,给你两个选择,是继续留下做sensor,还是去虚拟机领域拓荒。其实我明白,这是没有选择的选择。

象征性地考虑了一两天,我跟领导说,我要做虚拟机。实际上,我对虚拟机也是有一定好奇心的。在学校的时候,本科自学过一段时间C#,为了更好地理解这门语言,以及能更熟练地使用这门高级语言去做外包软件,抱着《CLR via C#》啃。后来又学了Java,去做Android,啃了诸如《深入理解java虚拟机》这样的书籍,但大都是知其然而不知其所以然。所以对于虚拟机和Runtime这类东西,总觉得很神秘,就像练武功必须要修炼内功一样,否则只是花拳绣腿。

下定了决心,就开始撸起袖子加油干。刚开始做虚拟机,就只有我和另外一个入职两三年的同事。领导为了我们能尽快上手,也安排了公司专门研究hotspot等jvm的专家来协助我们。事情并没有我们想象地那么顺利,一开始就是一堆要解决的问题涌来,还没等我们开始研究虚拟机的代码。没办法,那就只能硬着头皮上。于是开启了问题驱动的方式学习虚拟机的篇章。

虚拟机最多的问题,就是tombstone了。对于java出身,native底层不太熟悉的我,总是有很多急需充电的知识。如何分析native crash,如何阅读arm汇编,如何gdb调试,可以说,不做虚拟机,我基本上也不会接触到这些东西,尽管这些不是什么有难度的知识。记得刚进入虚拟机领域,第一个遇到的问题,与oat文件加载相关。于是乎去研究了zygote和runtime启动过程,dex/oat文件格式,最终经过几天分析确认问题是人为导致的。像这样的问题,后来每天都能遇到好几个。在虚拟机领域,你能遇到各种你想不到的问题。从非法指令、文件损坏、ClassNotFound到非法地址、空指针到GC bug。这一年,踩了太多的坑,前前后后分析了不少于200个问题。每次和同事吐槽,都觉得自己不是在做虚拟机,而是在做稳定性。经过这一年时间的总结虚拟机相关的大多数的问题,都是应用自身产生的问题,这些问题,都是应用开发的同事过来求助,不是应用闪退了,就是卡顿了,但都花了很长时间定位。虚拟机原生的bug还是很少的,不能不承认,Google代码的健壮,几十万行虚拟机代码,有问题的都能数的清。虽然Google的gerrit每一天都有art相关的代码提交,但是这些问题基本上都是极小概率才出现的问题,解决起来也要花不少力气。解决这些原生的bug,才是做虚拟机最有成就感的事。

做虚拟机的时候,组里也附带拦上了编译器的活。编译器不仅包含art中的compiler,还包含gcc/clang,于是乎去年领导给我找了个好差事,实现一个部门内部用的代码规范检查工具。为了做这个工具,开始读龙书,开始阅读clang的源码,往clang static analyzer里面添加checker,最终搞定了,但是效果不怎么好。没有编译器的基础,做起来却是有些难度。但是这段时间,也增长了不少这个领域的知识,不管怎么样,总是有好处的。好处就在于,对语言的理解更深了。实际上,这段时间的碎片化学习,还没有使自己达到写一个简单编译器的水平。对于解决art-compiler相关的问题,很多也还是束手无策。

从事Android虚拟机这一年,更多地还是问题驱动。几十万行的代码,每年都要跟着Google升级,升级完了重新开始,很多代码细节都还没有研究清楚,代码已经更新了。另外于Google工程师交流的机会太少,闭门造车严重,没有人带着走,自己摸着石头过河,着实锻炼人。现在为止,art的代码,结构都能一清二楚,闭着眼睛都知道哪个功能在哪个文件实现,看到普通的问题也能快速反应原因在哪里,但是一些诸如GC和Compiler的细节,还是没有掌握。似乎已经到了瓶颈期。Android虚拟机是个复杂的模块,里面涉及jit、gc、jni、classlinker等等,涉及c/c++/assambly/java等语言,想要弄得一清二楚,需要花不少功夫。目前为止,我还停留在能简单修改虚拟机源码的阶段,一些复杂的功能,涉及代码范围众多,稍微改动就可能引入一些稳定性问题。不过,虚拟机的乐趣就在于此,可以持续满足你的好奇心。你需要持续地分析源码,测试你的想法,也要时不时读一些经典书籍和论文,比如《The Garbage Collection Handbook》、《Advanced Design and Implementation of Virtual Machines》使自己不断保持竞争力。目前为止,整个公司对虚拟机有深入理解的人,还是屈指可数的。

总的来说,一年来,尽管没有可以拿得出手的项目,但是研究虚拟机使得自己重新认识了Android系统,基本上深入了Android的核心,对于java语言也有了更透彻的理解,同时也学习了很多Google工程师优秀的设计与编码思想,对于自己以后在Android上的路还说有一定作用的,至少目前为止,帮助了数百名同事解决了各种千奇百怪的问题,也在公司内网发布了90余篇相关问题定位和原理分析的博客。

至于前一段时间的消极心态,也还是遇到瓶颈期的一些反应,希望未来能找到更好的工作方式,在Android的道路上走得更远。

原文发布于微信公众号 - Android虚拟机(androidvm)

原文发表时间:2017-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python开发者

软件测试基本理论-IBM模式

软件测试基本理论(1) IBM生产模式 1   参考书目 《IBM-从菜鸟到测试架构师-一个测试工程师的成长日记》 出版社:电子工业出版社 印次:2013年6月...

26360
来自专栏纯洁的微笑

Java架构体系学习路线图,第6点尤为重要!

14040
来自专栏CDA数据分析师

人们对Python在企业级开发中的10大误解

在PayPal的编程文化中存在着大量的语言多元化。除了长期流行的C++和Java,越来越多的团队选择JavaScript和Scala,Braintree的收购也...

23160
来自专栏程序你好

微服务架构体系——它适合您的软件开发吗?

“Microservice architecture provides a range of technical benefits that contribut...

11930
来自专栏Java架构师学习

推荐一个Java开发的架构技术栈一:常见模式与工具二:工程化与工具三:分布式架构四:微服务架构五:性能优化六:底层知识

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。

12110
来自专栏JAVA高级架构

Java程序员体系化学习路线图,值得拥有!

10930
来自专栏PPV课数据科学社区

如何快速学习Tableau Desktop

这个要慌,问题有点大! 严格来说我只是Tableau众多粉丝中的一员,而且是一个不怎么会Excel的。三年前一次偶然的机会在领导推荐下接触了Tableau,开始...

69670
来自专栏java工会

十个提高编码技能的诀窍,你掌握了几个?

你想成为一名程序员,并且正在为之奋斗,那么你努力的方式,比如做事方法、思维习惯都将会影响你会成为怎样的一名程序员。 那么,你需要成为一个天才才能学好编程吗?...

9510
来自专栏微信公众号:Java团长

视频:体系化学习 Java 微服务架构

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。

15210
来自专栏IT派

Java体系化高级学习路线图,拿走不谢!

可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。

9730

扫码关注云+社区

领取腾讯云代金券