一个大神的Android成长之路
这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜,甜中有苦,我看了小二哥的总结,自己也觉得很羞愧,我看书的毅力没有二哥这样强。
每个人的学习方法可能存在一些差异,但是目的都是一样的,你觉得你看书很容易进入状态,那就去看书,如果你看视频很容易进入状态,那就去看视频,如果你动手操作很容易进入状态,那就买开发板回来研究。但是,一定要有自己的积累。
下面文章中的我,指的是作者王小二C。
前言
我是一个已经接近6年工作经验的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 + Pipe
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.当你发现自己不懂的知识越来越多的时候,证明你懂的知识越来越多。
扫码或长按关注
回复「 篮球的大肚子」进入技术群聊
一个大神的Android成长之路相关推荐
- 王小二C:一个大神的Android成长之路
这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...
- 一个女测试工程师的成长之路
一个女测试工程师的成长之路 的主人公从刚毕业时的多次失败,通过自己的努力一步步走向成熟,其毅力令人敬佩. 文中多次鼓励读者要自信.自强,"人得自已成全自已". 文章有点长,请慢慢品 ...
- 【网络文摘】一个大神程序员的使命感究竟应该是什么
来源:一个大神程序员的使命感究竟应该是什么 工作了五年的工程师,算不算高级开发者?归类开发者不是简单地看工作年限,因为经验这种东西千金难换但又一文不值. 我们现在工作的行业很奇怪.明明每年都有新的从业 ...
- 一个大神的twitter
今天看见一个大神的twitter,居然能够拿到微软win10各种版本的update ISO,还能拿到微软各种最新软件的release和preview版本,是黑客还是内鬼. twitter的地址: ht ...
- android无线充电技术,国外大神发现Android 11隐藏功能:反向无线充电
中关村在线消息:近日据悉,谷歌正式发布了Android 11开发者预览版,不过国外XDA大神在研究Pxiel 4的Android 11系统时,发现了隐藏的新功能--Battery share. 国外大 ...
- android 无线充电节点,国外大神发现 Android 11 隐藏功能:反向无线充电
中关村在线消息:近日据悉,谷歌正式发布了 Android 11 开发者预览版,不过国外 XDA 大神在研究 Pxiel 4 的 Android 11 系统时,发现了隐藏的新功能-- Battery s ...
- android 无线充电架构,大神发现Android 11隐藏新功能:反向无线充电放心了
原标题:大神发现Android 11隐藏新功能:反向无线充电放心了 今天,谷歌正式发布了Android 11开发者预览版,不过XDA大神在研究Pxiel 4的Android11系统时,发现了隐藏的新功 ...
- 阿里 10 年:一个普通技术人的成长之路
作者 | 宋意 阿里巴巴高级技术专家 来源|阿里巴巴云原生公众号 导读:不管是什么角色,成长是我们每个人都必须经历的过程.作为一个技术人,成长不仅是技术上的不断精进,也包括日常工作中的方方面面.本文 ...
- 阿里10年:一个普通技术人的成长之路
简介:不管是什么角色,成长是我们每个人都必须经历的过程.作为一个技术人,成长不仅是技术上的不断精进,也包括日常工作中的方方面面.本文分享阿里巴巴高级技术专家在阿里10年的成长之路,分享他从一个普通技术 ...
最新文章
- shell shocked什么意思_Shell 启动类型探究 ── login interactive
- JS---设计简易日历
- debian 7上安装svn
- js 加入debug后可以进入controller_新手入门Nest.js(四) 控制器路由
- 怎样提高团队管理能力5
- 关于AutoResetEvent 和ManualResetEvent
- 左侧固定 右侧自适应三种方法
- 2022翼支付产业合作解决方案发布 权益累计发展用户超1.36亿
- mysql 添加删除权限_MySQL实例讲解:添加账户、授予权限、删除用户
- VS里面关于.cpp文件与.cu文件混合编译问题---不要在.cpp文件声明核函数(__device__()和global__())
- MySql性能优化学习路线图
- 十大免费java开源商城系统
- java的帮助文档(API)
- 语义分割系列5-Pspnet(pytorch实现)
- Springboot系列-自定义starter
- 零基础怎么学习平面设计
- 仿xp画板、画图重绘、五子棋总结
- 面试官:软件测试没搞懂这些,哪里来的自信投简历? 刁钻问得高频的面试题(含答案)
- 关于烛光斧影——赵光义是否谋杀赵匡胤,是否合法继位
- 区块链项目ICO评估模型
热门文章
- ***PHP 去除换行符
- python读取postgresql数据库并发送相关提醒邮件
- 摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质
- TurboMail手机客户端—强大的附件文档阅读能力
- Diango博客--7.自动生成文章摘要
- python面试题总结(5)--数据类型(字典)
- 【python】逻辑运算符总结
- linux :vim 实现命令行下输出进度条
- 什么可以作为gcroot_面包果既能当水果又可以作为粮食,国内却无法普及,这是为什么?...
- frp对http协议应用