评论

收藏

[Unix] 我做了五年Android应用层开发,凭什么比一个两年Framewor开发的“年轻人

服务系统 服务系统 发布于:2021-12-25 10:50 | 阅读数:331 | 评论:0


  • 内存管理机制,虚拟内存
  • 静态库与动态库的区别
  • 进程之间的内存屏障,如何通信(IPC)
  • binder的通信优势
这里先想到这些,注意不是要完成懂所有机制,要的是整体理解即可。如下问题,请思考下,看是否能够答上来。
如果我写了一个应用,名字叫做,com.codegg.home 在主activity里面,加载一个布局,layout_main. xml,布局里面写入了一个TextView,那么我想调试这个TextView,要在com.codegg.home这个进程下断点,还是在system_server进程下断点呢?如果是想调试ActivityThread. java的话?应该在哪个进程下断点呢?
以上答案,都是com.codegg.home下断点,原因是这两个当前的运行进程,都是在com.codegg.home里,所以要调试的话,要在com.codegg.home进程下断点。
那么我们再来思考下,我现在要去追应用的启动过程,start Activity的流程,要在哪个地方下断点呢?
我们知道这个流程,最终核心的都在Activity manager server里面,而它是在system server进程里面,以一个线程的状态存在,于是我们要调试,就要在system server上面下断点了。
搞清楚了system server后,以我们熟悉的AMS WMS PMS 举例。这些服务线程,完成应用的请求任务,将结果返回给应用。比如查看当前运行的所有Activity,就是应用发起请求,从操作系统那里,先找到server manager,这个手里拿到一堆服务的句柄,也可以说令牌,你只能通过这个找到它。
当server manager一看你有权限,就帮你把对应的AMS的句柄给你,这个句柄操作系统也认识,对应到system server的AMS引用上,也就是你通过这个句柄,调用它的方法,操作系统就会将你的请求,传递到system server中去,同时操作系统知道这个句柄是AMS的第20号(这个20号代表查询当前运行的所有Activity的方法),然后就唤醒system server,同时从binder线程池,这个线程跟AMS一样,是个线程,从线程池拿出一个,调用AMS的20号方法。
调用完成后,从操作系统层面,把数据交给调用的应用,实现数据传输。这里面定义的传递数据格式是包裹,也就是序列化数据。
[]( )了解进程通信
好了,这块就说这么多,主要是说下进程通信,以及binder这种通信的简单逻辑。这里说下,为什么要通信。
因为操作系统设计,管理的软件单元是进程,进程间本身不联系,彼此看不见。一个进程想跟另一个说话,他两都认识的人是操作系统。因为他们是由操作系统管理的。操作系统通过从硬盘将程序装载进入内存,同时给每一个分配了进程号,于是他们就都在系统里面有了标记,同时每个都起了名字,一个叫我就喜欢吃,一个叫我就喜欢喝。喜欢喝的一个人孤单,他不认识喜欢吃的,他就问操作系统,有没有人喜欢吃的,操作系统一查,说有啊,然后把喜欢吃的的进程号给他,他就可以找到喜欢吃的了。
然后操作系统给他了一辆车,让他把想给喜欢吃的的东西,装在车上寄过去。这个车子是操作系统提供的,这个车子就是通信方式。比如汽车,飞机,步行。
于是进程间的通信方式就是,从操作系统找到目标,然后拿到通信方式,用操作系统给的通信工具,进行通信。
[]( )数据结构和算法
这块完成了,我们再来讲一个内容:
文件=文件头+文件内容
我们发现,这里MP3格式,OGG格式,都属于一个文件的格式声明,这个我们可以用HEX工具打开MP3文件,可以看到刚开始的位置,这块属于描述后面的内容该如何解析,比如文件名字,文件大小,文件格式,系统根据这个描述,尝试用对应的解码器解码,解码完成后进行播放。
这里解码器如何解码,就是算法。而文件头,就是描述这个文件的数据结构。
于是,我们就知道
程序=数据结构+算法
比如我要写个贪吃蛇,如何描述蛇的状态,长度,当前轨迹,这些都是需要表征出来,然后围绕着这个描述内容,进行操作,这块就属于算法。
完成的程序,运行起来,就是进程。所以进程是一个存在于内存的东西,操作系统用一个表格记录进程数据,比如进程号,父类进程,进程打开的文件句柄,进程当前状态,进程的上下文(上下文是保存当前CPU的寄存器,保存现场用的,因为寄存器是只有一份,当一个进程被打断时候,另个进程运行,那么之前的就要把它当前的寄存器存下来,防止被别人盖掉,等到下次自己运行的时候,再恢复回来,保证自己运行正常),程序是存在硬盘或者其他存储设备,掉电不会丢失,而进程是内存的,所以掉电就不再了。
程序如何加载,系统如何识别的呢?这就又回到开头的地方,数据结构加算法,也叫文件头和文件内容。源码经过编译链接,变成一个文件,我们亲切的叫它可执行文件。那么我们来说说它。
我们常见的两种可执行文件,windows上面称为PE格式,linux称为ELF,两者都是从COFF格式演化来的,这块参考《链接器与加载器》,喜欢感兴趣,可以下载阅读此书。
[]( )程序是如何在CPU执行的?
那么有了格式描述,操作系统就知道如何解析它了,然后把对应的代码段,数据段,堆栈区域配置好,将代码装载进入内存中,然后将下一条执行位置,也就是PC寄存器,指向这个可执行文件配置的text 入口,这个就是程序的入口点,这个我们去写的main方法,可以简单理解成入口,实际情况是在这个前面,系统加入了一些代码,为运行此程序做准备,准备OK才会真正调用到main方法,这段代码叫创建此进程的环境,比如参数,堆栈初始化。
聊到这里,我们从别的纬度,再来看看。
数字电路的与或非逻辑电路,开启了新世界的大门。我们用断点,通电,表示两个状态。我们不能说,好像有电,好像没电,所以,计算机的世界,定义了二进制,因为是非可以界定,孰是孰非不好界定。
于是,在我们的电路板上,规定了0-0.6V,代表了没电,4.4-5V,代表了有电,中间的数值,代表了器件的错误,不稳定性。
于是没电用0表示,有电用1表示,实际世界就是两个区间电压。
CPU在石英晶振的推动下,执行一条条指令。指令是什么呢?就是一串串数字,每一串代表一个具体含义。
所以,CPU能够执行多少条指令,是考量它是否强大的一个重要参数,另一个是它执行一天指令的时间,也叫指令周期,越短越好。也就是两个CPU同时做一个加法,谁用时短谁就强。
CPU拿到一条指令,就会在石英晶振的推动下,将这条指令执行完,然后将PC寄存器加1,读取下一条指令。
我们经常遇到的非法指令,就是因为CPU拿到了一个不认识的数据串,导致异常。比如它的指令集里面,有加法,有减法,你给他说你给我翻个跟头(非法指令),他骂了一句去你的吧,老子不会(异常报错)。一般这种情况是指令不识别,比如你用了新的arm指令,又在旧的arm板子运行这个程序,就会挂掉,提示非法指令。
刚开始的操作系统,嵌入式的操作系统,是没有做内存保护,就是程序段可以跳到数据段执行,当然现在加入了内存管理单元,会将数据段内存描述成可读可写不可执行,如果PC(程序寄存器)指向了这个地方,去读取执行的时候,就会报非法访问。
如果没有保护,你去读取数据段的数据,作为指令执行,出现指令异常就太正常了。
好了,由于篇幅原因,今天就给大家介绍这么多,综上希望能让朋友们意识到作为一个Android开发者对于学习framework的重要性,如果想更系统的学习framework,请接着往下看。
[]( )最后
想要更系统的学习framework的朋友,博主我最近在GitHub上找到一份腾讯T4大佬整理的,已标星8k的Android Framework开发笔记,今天拿出来分享给大家,需要的伙伴麻烦点赞+任意评论后,[点击这里]( )获取!
本笔记主要讲解了Framework的主要模块:
DSC0000.jpg

第一章: 深入解析Binder
Binder机制作为进程间通信的一种手段,基本上贯穿了andorid框架层的全部。所以首先必须要搞懂的Android Binder的基本通信机制。
本章知识点

  • Binder 系列—开篇
  • Binder Driver 初探
  • Binder Driver 再探
  • Binder 启动 ServiceManager
  • 获取 ServiceManager
  • 注册服务(addService)
  • 获取服务(getService)
  • Framework 层分析
  • 如何使用 Binder
  • 如何使用 AIDL
  • Binder 总结
  • Binder 面试题全解析
DSC0001.jpg

DSC0002.jpg

第二章: 深入解析Handler
相信大家都有这样的感受:网上分析 Handler 机制原理的文章那么多, 为啥还要画蛇添足整理这份笔记呢?不是说前人们写的文章不好,我就是觉得他们写的不细, 有些点不讲清楚,逻辑很难通顺的,每次我学个什么东西时遇到这种情况都贼难受。
本章先宏观理论分析与 Message 源码分析,再到MessageQueue 的源码分析,Looper 的源码分析,handler 的源码分析,Handler 机制实现原理总结。最后还整理Handler 所有面试题大全解析。
Handler这章内容很长,但思路是循序渐进的,如果你能坚持读完我相信肯定不会让你失望。
DSC0003.jpg

如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:
人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。



关注下面的标签,发现更多相似文章