【技术漫谈】Android高手进阶,这个必须要学 !

15,480 阅读28分钟

前言

我希望我做一件事,是把大家带到最底层,最下面的一个地方,就像我们游泳一样,我带你到海洋最深处的一个地方,那里面有很多的宝藏

正文

我最近也是跟一些同学的交流啊,拿我自己的一些事情来看,其实做了很多的一些。更加底层的一些东西了,包括一些。电子方面的一些编程,然后也会涉及到一些Linux里面的一些驱动方面的一些事情,最近是在做这方面的事情,其实无论是做Android层面还是做应用层,还是做我们的嵌入式,还是说去做一些。比较接近底层,你说用电平或者说是用一些信号量。或者说是一些脉冲来做一些东西,实际上本质的东西往往都是不变的。

我之前讲过,安卓,实际上走到今天呢,很多时候要抓住几个点,我在2016年的时候,我记得那个时候我看那个方向是做这个插件化,当时是卷起了一阵一阵狂潮,我记得。那么在这个时候呢,2020年了,尤其5G的话,基本上北京。上海,广州应该在卖了吧,那么包括向二三线城市也在做做,要么网速带宽越来越高,是不是可以用这个东西去做一些有意思,有意义的一些事情。

这是大家所要去思考这个问题,包括我们讲的物联网,那么还有一些车载系统,甚至是一些跟高校合作的一些平板类的一些东西。

那如果说只是一个单纯的APP,作为一个应用开发,作为一个接口,如果说你还在做okhttp,还得画界面。那我觉得的确会有一些。这样的一个,无论说是中年危机也好吧,还是说一个职业的一个危机也好吧,这个一定是存在的。那么你会去看啊,包括像抖音,你会发现。现在有很多的大佬啊,在招,在招人,在招这种需要一方面的工作就找不到人。

他们也有KPI考核,所以说是一将难求。但同时呢,就是说在一个公司里面,像真正的得到自我成长和自我的提高,其实特别难,不光是在传统的这种传统企业。房地产。还说是阿里,包括你在抖音也是这个样子,不管你是什么公司啊,他都会存在一个职业的瓶颈点,包括我。或者说一些高校,或者说一些科研所,或者说一些高尖端的一些,比如说一些东西,但是公司都一样,都会面临这个问题。

所以说我的想法是和建议是,一定要给自己去加压,哪怕你每天再累,你很辛苦啊,其实我之前跟同学说,包括大家可以看到我晚上一点钟,我会在群里问候大家睡了没有,我会坚持到这个点。那我在做些什么事情,其实我现在一方面工作上的一些压力,我也会在进入一个陌生的领域做一些新的东西,那么,同时,我还是在把一些基础的东西不断的回忆,不断的回炉,不断的去想,去构思,为什么这样去做,为什么别人想到了很多的,比如说一些C呀,C++呀,这些,最基础的一些原理性的东西,就是在你在大学阶段学习,可能学的是特别的艰难,包括我们讲的指针。包括我们讲的长指针。包括我们讲一个变量,具体的定义是什么,这个变量有什么样的生命周期,有什么样的存储的一个类别。

我在反思。所以说你会发现学习的过程一定是一个循环往上,而不是循环往复的过程,这也是突破自我的一个过程,那么第二个问题,就是说,工作的东西,实际上想学真的是特别难,因为工作里一定是你会的东西,你不会的东西,你就会有压力和紧迫感,那么怎么样让自己从不会到会,这是一个。无论说是学习技能也好,还是说是一个自我素质的提升,那么这个过程需要有很多的技巧,需要有很多经验的积累,那么第二个点呢,我想谈一谈就是说,我们学了很多啊,就是说,安卓,我知道群里有很多做了六七年的同学。那么你做了十年也罢,你说了这么多东西,你有没有反思一下自己真正到底学了些什么。

这个我觉得特别重要,明天是周末,明天晚上会有一个NDK的课程。那么我会用今年吧,大概一个月,四到六次课的时间把大家讲懂,你想学JIN,想学NDK,真的是特别简单,那么对于我,明天包括上一周,包括后面几周我讲的东西,它就是一个具体的,一个死的一个技能,或者说一个知识。我们对这样的知识,理解了,我觉得就够了,这样就是你需要去不断的去强化,去打磨

那么会涉及到一个点,有的时候会有一个误区,比如说我去抖音,面试,比如说我去小米面试,为了面试而面试,这样是不对的,你刷很多的算法题,刷刷刷,然后呢,又去搞很多的新的东西,比如说。音视频,比如说逆向,比如说。这种加壳,比如说这种反编译,或者做一些黑科技的一些东西啊,或者做一些。hook的东西,我们这个微信做一些这方面的工作,我知道我同学在做。实际上你会发现,不管你做哪一种方向,一定是有一些,最基础的一些基石,其实我希望大家能花时间来做这样一个工作,把基础,基石给夯扎实了,这点特别的重要。

我举一个例子,比如说我们讲音视频吧,有可能同学每天在群里会问ffmpeg,对吧,或者说WebRTC,我怎么编,怎么解决.那你有没有真的了解过,什么是single,什么是信号,信号的定义是什么,这个信号,用计算机去处理的时候,其实它的本质就是DSP的开发,如果你懂得DSP的开发,不光是window的是平台,我乌班图或者是Android或者IOS,我觉得你都能吃透了,这就是以不变应万变,那么当音视频里面很多基础的概念,比如说我们对于波动,或者对他这个频率,振幅的一些处理,这些东西,包括我们的音频,音频有什么采样率,PCM,脉冲。这些东西一定要去吃透,吃透它。

那么再回过头来,我们来看啊。其实早年呢,你去写安卓,有很多性能方面,一些东西约束,加密,逆向反编译,其实你这包括我们这个两个进程之间的保护,这些东西你会发现很多同学会说,每年每年都有新的知识,我学的好累,觉得好累,我今天搞这个,明天搞了,明天搞这个,明天搞那一个。其实不是你累啊,是这个社会,或者说你的工作或者是商业化的本质,让你特别的疲惫,你要不断的去让你的技术让你的技术服务于你的产品,让你的产品服务于整个的这样的一个受众群体内,发现很累,所以很多同学去转开发呀,转后台呀,他离开了这样一个行业。

当然这个话题是职业规划的问题了,那我想说的是,怎么样让自己不累,这点很重要。

有两个点很重要,是你决定你是否成功的主要因素,

第一点,占40%,是你的这个情商。对吧,像你的这个,这个事情是我的把控,跟人之间的相处,这这点我们群有很多的同学,其实做的非常不错的。

第二点,还有60%,就是你的硬功,就是你的基础,就是你对新事物,新技术的领悟能力,有快速迁移的能力,实际上,学习的过程一定是有个很重要的一点,如何用已知的东西来推无知的东西来快速的迁移的能力,你去学Java语言对吧,然后你又想去做一些C,或者是其他语言怎么样快速的迁移,这点是学习的重点

这是我今天所感悟啊,这周我做了很多的工作,我觉得。很重要的一点,就是说,从一个大的概念上去理解他,比如Flutter框架。他是一个用Dart语言构建的一个引擎系统,他跟我们这个构建了一个。类似于JS语言里的DOM树,实际上他不是DOM树,他是Widget,对吧,那么一个大的概念你清楚,那么这个树怎么样去遍历,这是数据结构的一些东西。对吧,那底层引擎的话,渲染已经有很多Dart只是其中的一种,用C去做。你会发现这样抽丝剥茧的东西就是相通的,那如果说你做过一些。你视频的渲染,或者是做一些图像的3D游戏的渲染,那么再来看Dart,其实还是非常清晰的,这是某一类知识的一个转化。

所以说任何的学习一定要规整为某一类知识的一个转化,这点特别重要,那比如说音视频里面涉及到的基础类学科,比如说DSP的开发。比如说Single啊,跟这个系统之间的一些转变,其实你去做抖音,或者是做一些音频的一些,APP,最近有个趋势适应这个神经网络,去做卷积。让你的声音,比如说你的萝莉音,对吧,加速的音频,你要做这些东西,实际上跟安卓本身关联不大的,他是一个具体的学科的知识的一个沉底。你再比如说我们用这个单片机,或者说我们做车载系统,里面安卓7.0.8.0。对吧,你需要通过蓝牙通信,或者是通过其他一些东西,那这又是另外一个。把通讯领域的无线通信这个知识的沉淀。

对于专业的知识,我们要用专业的一些东西,专业的一个底层,那些东西,包括我前期所讲的,龙书虎书,来夯实它; 我们对语言的选择,语言的把控啊,这个语言到底是什么,这么多年学了很多。其实我们再去看啊,最本质的语言,就是这个汇编了,对吧,或者说机器与有的汇编就对指令集的操作,你指定的操作指令,ARM指令和X86,那你做手机的指令Arm64的这个指令集你要去研究,那你不研究这个东西,很多东西,你不能看到他的一些本质和本源,那么在往上面,我们一定是用C和C++去做的,是一个最重要的语言,他讲了很多这些基础的概念,尤其是跟你的硬件绑定,所以他能操作的硬件

那么Android的层面为什么用C++来做,因为C++提供了一个很广阔的一个API,应该是对C的一个封装了,有很多的线程啊,信号的处理等等,它提供了很多的这些处理,那么这个东西用C你去写就特别的方便,简单。所以说NDK,我们经常一定使用C++去做,当然C++也可以。C的话,更多的是对于自己发一些数据的处理,只要你会,你会发现啊,我们要练,我们要去锻炼自己用什么样的能力,包括我接下来给大家做的这个C++,一个理论,那个增强课我们会去写,实现一个TCP流的一个处理,我们可能自己去编一个MP3那个文件编码的文件,去做一些转化,你会发现这个东西实际上跟安卓关联性不大,但这个东西你为什么要去做。

这就是我所说的一个本源的一个问题,就是你真的把知识点融会贯通了,你吃透了, 那么我们再去看一些源码的时候啊,有些东西看不懂,比如说我们这个位操作符,我们用这种联合体,它的特效在哪,帮我们讲这个内存,那个内存对齐,大端小端的问题,为什么会我们的先哲们,为什么会有这样的一些基础的知识的沉淀和积累。这个东西,你需要去思考,在你的工作当中,你要去思辨,你要去发现。不不合理的那些地方。

那我们再回过头来去考虑个问题啊,实际上从工作的角度来说啊,无论是Java也好,还是C,C++也好,它一定是不断的升级,我倒是建议大家就是不要一味的去追新,什么新就学这种,当然你可以去用。但是语言的本质是什么,我觉得还是要考虑清楚,你学Kotlin语言,一定是要去看CLASS的字节码,你要去看这个语言特性,那么语言的特性是什么,其实就是讲的这种汇编呢,对词法,对语言的一个处理和理解,就是你去一门语言的一个前提,这一点是非常重要的,这样你才能看透一些本质。

那所以说,为什么我不想去讲一些高级的一些语言,其实高级的语言都是API的一些堆积。包括现在我所看到的一些课程,大部分的东西都是这样。这个是不对的,这也是违反我们的一些学习的一个思路,或者是学习的一个大的一个这个趋势,或者说那个背景。

所以说,这是我今天晚上给大家分享的第二个点,希望大家能在学习的过程中。能有所收获,有所得拿不是说你每天学习,每天学,每天写代码。每天看书,也看了很多书,但是一年下来以后还是感觉自我提升不大,还是觉得没什么用的,这个这个状态不对

我在再回到C语言的问题上。我们接下来将在下个月初,给大家带来的C和C系列整体的一种实战和C++拔高的理论课。那么这个课我们会有很多的书籍。当然这是我的学习方式啊,那么你如果说确定跟我去学了,一定要去遵从我们这种学习方式,那么我去带着你去做,我们这里有很多经典书籍啊,有些书籍,基本上十本书我又看过,会给大家精选几本书,我们这说呢,作为我们的一个教材。

第一个本书,我们是讲的这个《C和指针》,这本书,希望大家能够买一本。

第二本书,是这个C语言的核心讲义,我稍后会把这个链接发给大家,我们会给大家选取两本书,加上去看。那么但是整个的一些课程的编排,我们采取了将近十本书的一个混编的整个过程,这次我接下来想做的一件事情,就是说。如何的让你去在。一定的时间内去高校的,去组织自己的学习能力,提升自己的学习,实战的这种。那么你任何的学习一定要是有一些知识的讲解和引领,包括经验上的传递,也需要有一个作业的安排,所以说我们会有采取对应书籍上面的作业给大家去讲解。

你会发现有两种很不同的现象啊,具体的一些课程内容,大纲已经出炉了,应该会在,下周六啊,会给大家去出来,因为我这里今天晚上我简单去讲一讲,那么随着一些最核心的一些语法是什么,去,从本质去,你理解我们的一个常量变量,我们的标记,我们说这个标记符对不对,那么我们会去讲一些运算符,比如说我们这个。异或,移位,我们会去从内存去拿出他的经项目来看一看啊,不同的这样一个编辑器,GCC也好,或者是VisualStudio。

我们还有一些其他的编辑器,对这样一个内存的划分,这样的一个内存模型,怎样去动态的创内存。实际上语言的本质是什么,就是一些关键词,操作符,比如说external,Static,比如讲这个变量的一些生命周期,我们讲的他那个堆栈空间,一个函数,它应该是在哪里,那如果说这个函数里面有一些变量,我们给他某些关键字进行修饰以后,它又是怎么去变化,然后我们会去讲C的工程上的模块开发,我们这个模块化跟谁讲是一样的,你去看看怎样模块化的开发,那么第二点是结合Linux里面的内核。我们去看什么是规范化的开发。

我想说的是,你在学习的过程当中,因为你是跟我去学,你画的时间。那么我希望你能有所得啊,不是说你是我来浪费你的时间,所以我一定是把我的十多年的学习的思路跟经验带给你,这个思路和经验不一定适合你,但是可以证明的是,这个学习思路和经验在我身上已经发生了一个比较好的一个验证,包括我现在周边那些大牛,方便也是这样去学习的,我也跟很多人探讨过学习的一些东西,包括跟我的侄子。我今天高二,但是应该不出意外,他应该也是四大高校当中的一个预选队员的,我也是去看他如何去做一些...他的英语词汇量1万多了,现在。

这样的学习一定是有学习方式的。但是用科学的记忆也好啊,学习策略一定是有效的方式,这个东西,我觉得花时间和精力去研究,比你在家里看个视频,写一个Demo更有意义。

那么我们再去想啊,那么C,我们还有混合的一些结构体,在Java里面说的对是象,那我们说。这种structure对吧,因为。那么这些结构体跟普通的基本类型,我们要指定请结合的指针到底是什么,比如我们智能指针PTR,二级,三级的指针,对吧,多级指针。那么指针跟数组有关联以后怎么办,Char类型的指针,那么数组跟指针到底有什么关系,其实讲来讲去一定要去感悟他,当然一些。很本质的东西呢,我可以可以通过大概10课的时间,我告诉你,这是经验的传承,但是你必须要花时间去领悟。比如说今天晚上,比如说你现在在家里面,你是不是好好的去看了一些书籍,然后不断的回炉,不断的提炼。

当然你会发现,我们学了很多基础的一些语法,一些规则,如果说你把这些东西给拿下来,那我觉得写一个简单的一些代码,就没有问题了,那么怎么样在已有的代码上做一些优化,提到优化就不得不提数据结构和算法,实际上。还有各种专业性的算法,当然我们不一定会在很短的时间内研究的透,我们数据结构一定是不能放那些东西。那么我也会采取用C,C++的形式给大家去展示常用的数据结构,我们要去写。那么链表,那举个例子嘛,比如说我们这个区啊,里面会带有一个私家车,我们训练表的时候会有一个Load的,对吧,你能听懂我讲的意思。那么如果说你的Load没有load*,那么你就会发现你的程序是报错,那这时候怎么办,我们往往凭经验写一个它的 define,那么他的define跟# define这种预指令有什么区别,这东西就是我所讲的一个道与术的问题,这东西要去思考去背的,你要去理解他,需要去去深刻的记忆。其实这也是学习的技巧,你从有知到无知的一个推论,一定是这样子,有的时候是需要逼自己一把的。

你学到了这个阶段,我相信你对基本的语法应该OK了,那么接下来怎么办,就是一个练习,很多人会发现,很多时候找不到任何的练习,更不知道如何去成长,如果是这样的状况,那么我会告诉我会告诉你一个什么点,你要学会去看一些。开源那些项目,我看那些项目,如果说你是纯粹的去为了学习C语言来应付Android的工作,那么最好的项目就是你用纯C语言去实现一些协议上的东西。或者说你去编一个小型的一个游戏库都是可以的,当然游戏库的编译,你需要利用QT来一些前端的一些东西。

所以说在我接下来的这个项目里面,我给大家设计了四套项目,这个后台的,这种用C实现一个线程池,理解种线程的调度的问题,然后我们也会去做一个用C语言实现的多点模拟触控的东西;后面两个项目还在调研阶段,还没有公布,这个还需要时间去做。对你自己的学习呢,你可以去看很多的一些东西了,比如说我讲的有hook的一些框架可以看。那么腾讯出的这个HardCoder,包括我之前讲的Matrix也可以去看

在这里,我也会给大家一个承诺,我会把整个的NDK,JNI, 我会用这种免费的形式 。毅力加坚持加梦想这种形式给大家去讲。那有了这个作为前提呢,你可以很熟悉的去知道,Java跟着C之间的一个调用的关系。我之前做了很多的一些大量的一些工作,去梳理。所以你会发现啊,有很多同学会发现你如果即使会跟着我,这中间还有一个不可逾越的一个问题就是说,我可以去看10本书,我可以去写很多的一些代码,但是你会发现你不行,这是个问题,你这个问题到底应该怎么破,我讲的龙书虎书的问题,我讲的四大名校。我说了学完以后一定是四大名校的,虽然是没有学历,但一定是达到这样的一个level

我这两天一直在思考,得出了一个结论:你遇到这样的问题,其实究其本源,还是学习的一个方式和一个技巧性

我会把所有的技巧,告诉你,会教你怎么去学,但是我需要你高度的配合我们去做,并且呢,在做的过程当中,把你的,问题反馈过来,所以说我需要一个同学,是一个高度自律的一个人,之前我有讲过,其实我想一直免费讲下去,但是前期有很多不开心的一些事情,包括一些,质疑我的一些声音啊,或者是其他的一些琐事吧,我觉得这件事儿就翻篇了,当然也有,群里很多热心的一些朋友会,但我觉得这些都OK,没有问题,因为。因为我要决定跟一个人长期的走下去,那么这个人一定是我认可。所以说我也希望给同学们提几点要求,就是说,你如果说决定去做,那么正好我也有这个想法去做这件事,那么我们两个之间如何去配合。

首先一点,你要有高度的自律,哪怕你很累。我知道很多的机构啊,基本上。你跟着他就学会了,你自己去学,基本上一个班第一次课有100多人,第二次课80人,第三次课30人,觉得最后基本上没有人了,其实这是一个很艰难的过程。我希望大家,哪怕你很累,哪怕你这样吧,你先决定了去做这件事情,要出货突破自己,要去走这种底层,包括嵌入式,包括智能化,或者说做一些机顶盒等等,用得着,包括你的源码的一个把握。没有这个基础,你是很难下去的。

我希望我做一件事,是把大家带到最底层,最下面的一个地方,就像我们游泳一样,我带你到海洋最深处的一个地方,那里面有很多的宝藏

那么这个你自己能吸收多少,要看你自己的造化。当然这个是不可避免的。每个人的基础不一样,当然我会讲,就是按照一般的理解和接受能力,谁说我希望大家去思考,我们下一周基本上就到11月份了,所以我希望大家利用接下来的一周的时间好好的反思一下自己,你去思考一下你该怎么去拓展,这是一件事情

对于其他的,我们,后续我讲的是三年的时间来做这个东西,来提升你的一个技能,有的额一个同学做了七八年啊,如果说你只用三年的时间来提升,我觉得是非常值得去做值得去拼一把的事情,当然也有同学找过我,他已经30多了,那么如果说你只想。听某个人的课,我去找BAT的工作,他说的很直白,很露骨,那么我觉得我在这里要对这些同学,比如说你30多个同学做个回忆。那么我觉得就是说其实年纪并不成问题,但是你这种思想实际上是属于投机的思想。这在我这里可能比较行不通的,那么我认为还是希望从底层的东西学起来构建你的知识库,有些东西你可以懂,你不一定要学,比如说我后面会讲四座山。

我们会讲Linux内核里面之间的一些设备的管理,内存的管理,进程之间的通讯。你会进程通讯和Binder,一直搞不清楚。为什么?只是因为你在本科阶段,或者你在硕士阶段没有好好研究过,没有去思考过。

那么对于信号量,实际上我们会发现做这种NDK很多就崩溃,空信号,这些东西信号一些捕获,实际上对于这样的一些东西,我觉得就是一个很基础的一个操作系统的一个理论吧。所以如果说你们有这个概念,你去学,你去做一下Hook也好,或者做PLC呀,或者做点其他东西,你会发现特别特别的难,猴哥之前问过,想听听这个关于Hook的一些东西,对吧,那么这个知识点呢,实际上它是属于逆向加壳的技能,你这个东西实际上就是C的一个经典的反编译,你要去看他的指令集操作,你要懂什么呢,你要懂C,C++编辑器对C源代码的这种过程。

我基本上讲的很多的,都是一些理论上的东西,这也是我一贯的作风,我觉得细节根本不重要,如果说你的思想转变不过来,你学技能得不到提升,你永远永远只是做一些最基础的一些工作,你换一个层面,你会发现举步维艰,可能都想跳楼的这样的感觉。所以说让你突破了,就是一览众山小的这种感觉,但这种感觉不是一蹴而就的,它是长期的,不断的积累的过程。

所以说这一点我也希望大家能坚定信心,如果说你真的已经30多了,这个社会本身就是这样,竞争压力非常的大,那我期望你可以去学一些其它的一些课程来短期内拔高一下,但是我还是希望你能脚踏实地的,把一些基础的内功给夯实扎实。

我们为什么要讲C,有些人可能想听Android应用,面试,或者是一些自定义View,自定义空间,或者是Gradle这些东西。为什么不讲这些东西,这些东西都是“术”。他根本不是一个本质的一些东西,这样的“术”的东西呢,我觉得你去学跟我去学没什么区别嘛,跟一个刚毕业的同学没有任何的区别,我希望你能从一些应试者脱颖而出,脱颖而出的一定是你的这种技术的视野以及对技术深度的理解,跟C,包括C++呢,是最经典的语言,它的用处很多,我们讲这个东西呢,就是要帮助你了解清楚,包括指针那些操作,对内存的灵活自如的释放

如果你能用字节的思维去处理,用面向过程的思维,去把每个点都学好,那你的基础已经很扎实了,你再转换到面向对象,你会发现非常简单。 C++也是面向对象的。我花了很多的时间,包括这半个月我都在去做,所以每天都很晚,如果你不讲C, 只是纯C++面向对象的思维,里没有面向过程这样的一个编程的一些技巧,或者一个策略。你很难进行的思维的一个转化,这点非常重要,所以你会发现,这我也是讲一个学习的一个方式,就是个类比学习法,你要去类比,要类比有些共性的东西,比如说我们这种混合编程问题,我们的Flutter啊。那么有的是JS的操作,有的是DOM树的操作,那么到底有什么区别

这也是学习的过程,所以我希望大家。接下来的这两年到三年的时间内,我们把所有东西都讲清楚。

你会发现,技能点一直在变,但不变的是什么,不变的是这些最本质的一些东西,所以说我也希望大家就是说去正视这些东西。

关于算法的部分,其实我也之前聊过很多次了,无论是公开课还是网络的形式。不要一味的去刷这种Leetcode的,或者是一些其他的一些网上的那些题目。你需要思考编程思维是什么,执行效率是什么,对吧,你去写这种写什么,你就写这种,比如说这样的一个排序问题,你要去理清它的一些思维,这样的话你才能学的比较好,哪怕你一晚上你一个月了,你就做一种算法,我觉得也够了,那其实我也问过很多的,这边的一些牛人,比如说算法导论,其实他们也刷了十几遍,但很多有更多的是让你去找,让你有这样的思维。

推荐书目

  • 《C和指针》
  • 《C专家编程》
  • 《C语言接口和实现》
  • 《C++STL标准程序库开发指南》

写在最后

所以说我希望大家还是能多跟我交流,你有什么样的困惑,你在这个群里要发挥作用。如果你不能利用这个社群,那么这个群的存在就没有意义。

所以我希望大家能够。在这个群里都讨论一些关于一些技术点,不一定是技术,可以是一些思维上的东西,学习上的东西,学习的突破,包括这些东西都可以去聊一聊,我觉得这点比单纯的一个技能点更重要,今天就分享这么多了

谢谢大家

郑重声明

本文由"释然小师弟"整理,版权版权©️归Jesson老师和Android研习社所有,侵权必究