有很多朋友问过怎么学习 Framework,之前写了三篇文章,主要说的是之前开发应用的如何过渡到开发 Framework 。喜欢的可以通过下面的链接阅读。
Android 如何从应用深入到Framework (一)
Android 如何从应用深入到Framework (二)
Android 如何从应用深入到Framework (三)
写完这个,发现还是有很多人迷惑,不知道 Android 该怎么学习,于是今天抽空,聊聊关于学习方法,以及 Android 具体该怎么去学。
在开始今天的文章之前,先插入一段这些年我所折腾的内容:
2010-2013 功能机时代,以 Mstar、MTK、 展讯平台为主,负责通话相关模块,比如 InCallUI 、Dialer 、PhoneBook为主。同时完成三方应用对接工作,比如移植 QQ,移植游戏中心。在这个期间主要收获是,阅读代码的能力,以及形成了框架思维。
2013-2016 智能机时代,以 MTK、 展讯、 高通平台为主,负责系统需求开发,应用开发,比如权限管理分析,系统框架调试,快速定位界面信息,商业化 APP,CM 移植红米2,三方 rec twrp 源码分析,实现工模测试程序。在这个期间主要是深入代码,开始进入系统框架,启动过程,开始深度定制系统,完成了自己商业化思维雏形。
2016-2019 自媒体时代, 在公号开始输出技术文章,以分析三方开源库,多窗口分屏源码剖析,HOOK 机制以及 Android NDK 开发讲解。同时输出自己的商业思考,赚钱逻辑,建立个人IP。
以上是对于我这些年做的事情,做的一个简单梳理,有很多分支,就不过多涉及了。
这些年来,有很多人夸我能力强,而我实际晓得这里面的原因,并不是天赋造成的。
前段时间,花了一个月时间,阅读了程序员中一些牛人的成长故事,梳理出来很多关键字,我把这些筛检后,总结了四个出来:
-
自学能力
-
时间管理
-
升维能力
-
自我激励
自学能力是排在第一的,这个是从我自身出发,得出的结论。大学期间要说什么对我有着深远的影响:
一个是自学能力,一个是写作
在自学计算机方面,触发我去做这个的原因是,数字电路学得很好,C 语言比较感兴趣。
而我找到了一个切入的路线,就是学习 80C51 单片机。这个是脱离了操作系统,简单直接操作硬件 Pin 脚,使用仿真器可以来直接模拟个 C51 开发板。
这个是开端,痛苦不言而喻。无法理解地址,偏移,中断向量,以及堆栈平衡,这个时候就遇见了操作系统。进入操作系统,算是进入了漩涡,陷在里面不断挣扎,又不断的挑战,期间报了个培训班,是做 ARM嵌入式开发,进而接触到了 μC/OS-II 小型操作系统,在老师的带领下,最终算是将基础打通,剩下的便是自己琢磨,反复练习,阅读代码。
每个人自学的路线不一样,我是在宿舍自学的。我不习惯自习室安静的氛围,同时我的学习状态,不是一个事情专注一天,而是一个事情就坚持半小时,随即切换到娱乐,或者是休息,跑别的宿舍转圈溜达。这个是我自学中的调节,现在也晓得这个跟番茄时间是基本吻合的。
**我们很多时候总结的东西,都是自己踩坑之后才深刻理解。**在你没有总结出自己的高效学习方法之前,你就只剩下大量的刻意练习,从而找到自己的路线,这里没有捷径。
我们很多人会随口说出那句:
我要花时间,也能跟他一样牛!
可实际结果是你只是嘴上说说而已,并没有实际去做。比如我说这个就是坚持,用时间累积出来的成绩。大家通常会觉得坚持只要自己想做,就是轻而易举的。
实际是,
坚持看起来很简单,但却很难。
那些最终成功的人,有很强的时间观念。他们晓得他们的成绩是时间复利出来的,我们很早就学过,不积跬步无以至千里。可是有多少人真的去积跬步呢?
我们习惯去议论别人的成绩,羡慕他们的成就,然后轻易的否定自己,把别人的都归于好运而已。我在观察这些成功大牛之后,发现他们除了自学能力超强之外,还有的就是时间管理。
你与他们约定饭局,他们能够提前预定好路线,基本能做到准时,而且他们尊重你的时间,会比较聚焦的聊一些话题,不会漫天聊天,没有重点。同时他们也会对这次饭局做简单的复盘,大概聊多久,自己今天还有什么事情要办。
我之前也是没有时间概念的,导致的结果就是丢三落四,做事没有轻重缓急,弄得自己又忙又累,却看不到结果。随后我便开始列任务清单,就在手机上记。
当我慢慢习惯这么来做的时候,发现我做事情高效了,我能分清什么是今天需要完成的,什么是没有做完,当下要完成的是哪些任务。
任务清单比起那个时间四象限来说,很容易执行。就是把自己随后要做的事情排序,把当下要完成的排到前面,哪个可以取消就往后放,或者干脆去掉。这个在时间管理的书里叫做吃掉青蛙,而吃掉青蛙的步骤就是拆成一些蝌蚪,一个个来完成,遵循 SMART 规则。
SMART原则(S=Specific、M=Measurable、A=Attainable、R=Relevant、T=Time-bound)是为了利于员工更加明确高效地工作,更是为了管理者将来对员工实施绩效考核提供了考核目标和考核标准,使考核更加科学化、规范化,更能保证考核的公正、公开与公平。
完成任务就会不断地累积成就感,我在做这个之外,会做一个叫做每日复盘的动作。也就是我每天会有具体的计划,哪些要今天完成,哪些是这周完成的,时间要定到具体的某一天。
每日复盘 的意义是巨大的。通过这个可以很清楚的知道自己哪些方面做得不好,用奖励的方法填充到你的任务当中,把每天的任务在早上计划出来,然后随着工作中加入任务,在这个任务清单中插入进去。
如果明天有计划,那么准备工作我是放到今天晚上,而不是明天早上。因为今天晚上时间充足,能够保证不落掉任何东西。同时也能在明天起来的时候,不显得太赶忙。
在做一件的时候,可以使用 PDCA 进行迭代。PDCA 具体为:
PDCA循环是美国质量管理专家休哈特博士首先提出的,由戴明采纳、宣传,获得普及,所以又称戴明环。全面质量管理的思想基础和方法依据就是PDCA循环。PDCA循环的含义是将质量管理分为四个阶段,即计划(Plan)、执行(Do)、检查(Check)、处理(Act)。在质量管理活动中,要求把各项工作按照作出计划、计划实施、检查实施效果,然后将成功的纳入标准,不成功的留待下一循环去解决。这一工作方法是质量管理的基本方法,也是企业管理各项工作的一般规律。[1]
除此之外,我也没有其他高级的技巧,
我们要先从外驱动力进行训练,然后逐步获取金钱,或者荣誉,这些刺激你,将外驱动力转化为内驱动力,从而形成习惯。
当你掌握了时间和任务的搭配方式之后,剩下的就是持续行动,不放弃。在行动中不断践行 MVP ,也就是我们讲的瀑布开发模型。像个漩涡一样,一圈一圈,一直到最强最大。
当你这样子持续坚持着,你便能够很敏锐的捕捉到一些信息,也就是所谓的外行看热闹,内行看门道。当大家都在人云亦云,吐槽焦虑的时候,你发现你也会遇到这个问题,所以你开始尝试,
投资自己,丰富知识体系。
升维能力是怎么出来的呢?我在大学期间,贴在课桌墙上的一句话是,每天进步一点点。我在大学一直用这句话在激励自己。职场中可以再修正一下,变成比别人多想一步,你就离成功更进一步。
这里的升维能力主要体现在,大家都在讨论具体技术的时候,你在想这个技术解决了什么问题,复杂度,以及客户时效性。你能够脱离技术,从市场,商业模型去考虑问题。
当大家都厌倦加班的时候,你能够知道自己的诉求,知道自己加班在做什么,自身在怎样的成长,是否是自己预期的结果。我在看牛人的故事的时候,所谓时间管理,以及勤奋,努力,不也是自己给自己加班吗?
多处在老板的位置思考,同时多考虑自己的未来。
如果你没有这么拼命,那么你的技术卓越靠的是天赋?我们再想一下你多年之后能够从容应对,技术出类拔萃,不是在公司加班,就是在家加班了。升维能力能够让你看的更长远,也让你能够看清,这一切都是在为自己投资。
我们想下,你工作最终想做什么?想当领导,想做老板,想创业找投资,想做自媒体。这个就是你在提前布局,那么你必须升维,先匹配接触这些信息,你才能够看得透彻,知道自己现在的付出,未来都会开花结果。
你总想着占便宜,那么谁要吃亏?只有利他了,最终才会利己。
这句话又是一个看起来很简单,却很难做到的。
最后我再说说这个自我激励,因为我们的惰性,以及短视,导致我们坚持一件事总是半途而废,总想着很快见效果。
可世界很多时候就是反常识的,求而不得,越急越错。只有你稳扎稳打的成功,你遇见的问题,你经历的事情,才能让你这个系统稳固,不会轻易被人攻陷,所谓有了防御力,抵御风险的能力。
俗话说的好,
肚子有货,心里不虚。
要有目标,分阶段目标和长远目标。长远目标是个奔头,阶段目标是不断靠近。也就是年计划,月计划这种。只有你把年计划拆成月计划,月计划分摊到每一天,你才能够真正的行动起来。
自我激励很重要,你为什么拼命?你要实现什么目标,这个很重要。你要赚多少钱,你要用钱做什么,升维能力又体现出来了。
当你突然心动地时候,就是你要开花结果时候,这个时候要谨记,要行动了,否则只会望梅止渴,望洋兴叹了。
讲完了这个,我们再来看看 Android 当前市场需求都有哪些方向:
原生开发,主要以大平台为主。因为它的成本比较高,需要安卓,IOS 和 Web 各个方向都要投入人力。做系统维护的,接触的系统级别的 APP,基本都是原生开发的,不会是跨平台。这里就是牵扯一些开源框架,像 MVP 、MVVM 框架,以及开源 okhttp 、Retrofit 等等。
跨平台开发出现在小公司,以及需要快速迭代的场景下,它能够快速推送到各个平台,能够实现后台热更,可以方便的修复问题。主要技术有 react-native 和 Flutter 。
系统移植和裁剪,主要是以 Linux 驱动为核心,同时移除一些系统服务,开发一些守护进程。这个以 C 、C++为主,门槛比较高,有驱动经验,对操作系统有概念。
这个主要的市场就是那些性能要求较高的场景,需要启动快,比如路由器。
电视盒子这里需要掌握的是 TV 开发场景,它跟我们普通的开发有区别,因为不是触摸响应,而是按键,需要焦点切换,以及实现一些软键盘之类的东西。
智能门锁,需要的和嵌入式开发差不多,安卓系统也可以来实现,这里除了硬件驱动,还有就是上层的指纹识别,以及屏幕显示,监控系统。
音视频开发随着这个 5G 到来,流量问题解决,会是个强需求。相关的抖音,快手这些,对于音视频的需求很大。这里开源的项目主要是 FFmpeg sdl2 ,如果要说更多的话,那么加上 opengl es,以及 glsl 或者其他的 gpu编程。
系统级别的开发,以虚拟机优化,分身,系统广告拦截,通知管理,权限,静默安装,分屏,像 APP 的插件化编程,注解编程这些,APM 性能监控,sysTrace 分析,蓝牙 Wifi 功能定制等等。
其余的就是在细分领域,虚拟机优化,xHOOK,xp插件 开发,辅助功能开发,自动化测试脚本,浏览器开发,GPS硬件 芯片调优,音频,相机调优等等。
接下来说说具体该怎么学习,这里写个我学习的路线,更多细致学习,需要自己百度检索,找到学习资料。
这里具体为:
除此之外,还有这些:
View 这里主要以 TextView 、Button 这种为主,主要是去熟悉如何开发一个应用,如何调试,如何布局。这里比较关键的是,如何自定义View,懂得核心的三个方法,测量,布局,绘制,同时知道绘制的一些方法,比如 Path,以及 xor图像 混合,画一个仪表盘,以及动画。
这个学习完了后,开始进入 SurfaceView 学习,这个学习 openGL es 的开发流程,绘制过程,以及语法,生命周期。为什么学习这个呢,因为很多开源库,就是用的这个,比如 cocos2dx 、 libgdx ,游戏引擎大多数都是这种,因为耗时,而这个 SurfaceView 是另开辟的线程,所以没有这问题,并且直接对应一个 Layer,可以快速绘制。
四大组件是个宝藏,
Android 开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
这里主要学习,每个组件完成 Demo,知道使用方法,场景。startActivity() 、startService()、sendBroadcast() 、ContentProvider.query() 这些方法是一个引子,它是撬动你进入系统代码的一个个线索。
于是我们跟着这些方法,参考网上文档,使用调试技巧,开始分析,画流程图,当你把这些跟踪完了之后,你对系统就不会再陌生,也不会畏惧。
在这个过程里面,同步穿插着来学习 系统启动过程,System_server 进程启动过程,AMS 、WMS 、PhoneWindowManager 初始化过程。
这两个会同步进行,最终在系统框架汇合,你便将这个线路打通。而在这个应用和系统之间,是可以通过分析 SystemUI 和 Launcher 的启动过程,来掌握这些知识。
这些都掌握了,也就是主线已经打通,剩下的就是继续蔓延,将自己感兴趣的学习起来。比如 SF 学习绘制相关,Binder,SELinux 安全模型。
关于调试,主要是 调试 JAVA ,调试系统,调试 NDK ,调试 Smali,这个大家点击上面的文字,可以直接跳转过去阅读。
总结下学习过程,主要就是寻找线索(兴趣),持续行动(画流程),调试跟踪,总结收获。在工作中就是,处理一个问题的时候,需要使用三步法,分析,定位,解决。而你要成长起来,实际这个后面需要一个沉淀,这个很大程度我们会忘掉,所以才学得不牢靠。
最后,想再说说关于如何构建自己的知识体系,主要的方法为:
关于点线面,之前写过一篇文章,大家可以点击阅读。这里简单说下,
点线面的理论,就是寻找一个突破口,先进入市场,然后不断地积累,将点串成线,然后再深入下去,形成面。每一面起来之后,就是一个体系,你的能力矩阵就在这个框里面。
总分总针对的是学习新的知识,需要做的策略,先整体阅读概念,使用场景,以及它的优缺点,随后就是细分,开始实践,分为学习实例,掌握实例,应用实例,做出产品,最终再回到总结,加深对这个新的知识的理解,以便后续做别的产品,晓得是否这个新的知识可以直接应用。
这个总分总,就像人生三个境界:"看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水。"有句诗是这么说的,愿你走出半生,归来仍是少年。
关于成长思维,我们都听过一个段子,叫如何让一个技术群吵起来,就是扔一句话, PHP 是世界上最好的语言。然后就会出现各种不服,开始狂喷,相互 Diss 。这个属于调侃,也无可厚非。但我们时刻要保持着成长思维,也就是是否对自己成长有用。
比如争论这个,没用。看到一个人写的博客,写错了一点,就开始觉得自己比他牛,这个也是没用,因为这样思考你不成长的。成长思维,就像是个好奇宝宝,时刻谦卑地吸收,学习自己的不足,用来强大自己。
能看到别人的优点,这个也是看起来很容易,实际却很难。
不抬杠,认可别人的能力,诚恳的请教,这样子的你,才能以最优的方式成长。
–完--推荐你读:
说一说赚钱
副业刚需
赚钱还是挣钱