深入理解Android内核设计思想——读书笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012984054/article/details/50792847

前言
这本书用我之前一个同事的话说就是无用之用,其实我也不知道有什么用,但是他能潜移默化的影响你,就比如说他曾经看过一本教你如何用灯泡制作一个内存体系的书,嗯……反正我觉得工作中不会怎么用到,但是他还是觉得那是一本无用之用的书,我没读过什么书,明白的道理也少,但是从一个粗人的角度来讲,他的职位和薪资都远超我一万个十字路口,所以听他的应该不会有太大坏处。

Android系统

巴拉巴拉一大堆,但全是在linux下做的命令行操作,这里只记录我觉得比较有用的地方。

Android的分层

早期的Android框架分为四层,然后因为版权原因,变成了五层,即:

Application
应用程序层,开发Android应用接触最多的一层了。

Application Framworck
就是用Java将C库封装了一下,提供一些接口供上层使用。

Library and Runtime
系统运行库,也有人叫“C库层”因为里面的东西都是C/C++写的,这里的重点在于,了解系统是如何与之构建关系并且稳定运行的。

Hardware Abstraction Layer
这一层跟我们应该没什么太大关系了,一方面是为了进一步降低系统层和硬件层的耦合度,更重要的是因为一些协议相关的原因。

Linux Kernel
内核层,这一层的源码不包含在Android工程中,可以单独下载,有了这样一层,在硬件适配上就方便多了

什么是基于OS的系统?

OS(Ecosystem)本是生态学中的一个概念,它体现了一定时间和空间内能量的可循环平衡流动。看完这句话心中一万只草泥马跑过……
然后根据他举出的例子来理解是,OS是生态学中用来描述类似生物链的某种名词,然后OS的系统呢,就是他的市场机制就像生物链一样,理想中的状态就像鱼池边种树,果子喂鱼,鱼便便滋润树这样的双赢模式。

Android系统映像

通过一些列的编译,Android系统就可以通过烧录写到硬件中了,书中总共列出了几个文件的介绍,看明白的只有一下几种……

ramdisk.img
存放的是root目录,在Android启动过程中发挥重要的作用。

userdata
各程序的数据存储,被挂载到 /data 目录下

recover
设备进入“恢复模式”所需要的硬件包,是音量键+开机键一起按吧,没记错吧……没怎么刷过机。

system.img
这个文件就比较亲民了,他是Android系统的运行包,被挂载到……如果理解的没有偏差的话,就是通常我们的 文件管理—>system文件夹了

Android系统反编译

嗯……这本书是在2014年出版的,算是比较老了,所以反编译这一节只当做了解Android系统
Android反编译按照目标来分的话分为:
1. APK反编译
2. Android系统包反编译
但是不论哪种方式,大致步骤都为:

目标 可执行文件 jar文件 阅读代码
APK dex.odex jar gui-gdi.TextEditor
system dex.odex gui-gdi.TextEditor

操作系统基础

起初我觉得这并没有什么卵用,但了解更多总没有坏处。比如另外一本Android书籍上同样针对Android系统讲解了IPC,而这本书会一步一步的告诉你,它从哪来,到哪去。
了解发动机工作原理的驾驶员,一定能在驾驶过程中受益匪浅

计算机体系结构

冯·诺依曼结构
他的观点就是采用二进制,具有存储和控制能力。其结构包含了运算器,控制器,输入输出等元素。

哈弗结构
总而言之就是在冯·诺依曼结构上进行了优化(我是这么认为的)

这两种结构所包含的元素是相同的。

什么是操作系统

罗列了一大堆,但比较重要的我感觉就是两点。
一、面向上层
二、面向下层
是不是感觉闻到什么气味了?但这不是屁话。因为这两点就可以概括操作系统的职责,让用户更方便的使用CPU、内存、Flash、各种I/O设备等。
操作系统是负责管理系统硬件,并为上层提供稳定编程接口和人机交互界面的软件集合

进程间通信的经典实现

操作系统中的的各个进程通常运行在独立的内存空间中,并有严格的机制来防止进程间的非法访问,而并不代表不能通信,进程间的通信是操作系统中的一个重要概念,比如我们经常在两个毫不相干的程序之间使用复制粘贴。

广义的讲,进程间通信(Inter……巴拉巴拉,简称IPC)是指运行在不同进程(无论是否在同一台设备上)中的若该线程间的数据交换,

从上的定义可以看出,除了在同一设备,还能垮设备~(RPC机制)屌到屙血尿浓啊……

通信方式
- 共享内存
这是一中非常常用的通信机制,书中介绍了他的具体步骤:
1. 申请一块内存空间,生成的内存区域将与一个特定的Key进行绑定。
2. 映射内存共享区,将共享区映射到A线程中。
3. 访问内存共享区,A线程创建了共享区,那么就到B线程去拿了,怎么拿咧?就用地步生成的Key去拿
4. 进程间通信,好了,到这里两个线程都持有了这块共享内存,就可以进行数据交换了,但是这本身是没有同步机制的,需要自己去协商。
5. 撤销内存映射区,两个线程哔哩哔哩完了之后,要撤销之前的映射操作。(不太理解)
6. 删除内存共享区,用完这块内存之后要释放,这个合情合理,没毛病~

  • 管道(Pipe)
    这个我就用我的理解来记录吧,这种方式使用与windows系统。工作流程就像他的名字一样,管道,而且是单向管道,这就意味着两个线程之间需要建立两个单向的管道,一根管道的两端分别为读和写,这像什么?I/O流?这里要说的是,管道有容量限制,当pipe满了的时候读或者写操作则会阻塞,管道的容量为65536。而且这个管道好像只能是父子线程间的通信,如果是两个毫无关系的线程,那就要用到Named Pipe了,同学,给你种子,不,链接,自行解决吧……
  • Unix Domain Socked(UDS)
    这个就屌了,因为里面提到了,Android中使用最多的一中IPC机制就是Binder其次就是UDS,在2.2版本以前,Android将Binder作为这个GUI架构中的进程间通信基础,而后来弃之使用了UDS,可见他的威武程度。
    他的通信流程如下:
    1. 服务端监听IPC请求
    2. 客户端发起IPC申请
    3. 双方成功建立IIPC连接
    4. 客户端向服务器端送数据,证明IPC通信是有效的
      这里了解个大概,作者说后面详细讲,不讲撕书……
  • RPC
    扔张图吧,我感觉这个太偏门了

同步机制的经典实现

支持线程间的通信,和多线程共享一块内存,同步的问题自然而然就出现了,闲言碎语不要讲,罗列出几种同步机制。

  • 信号量
    如图所示,这里的S代表信号,PV原语的浅在理解就是,进入共享区执行P操作,离开共享区执行V操作。
    P操作:
    S自减1,如果仍然<=0就直接进入,否则等待别人释放资源
    V操作:
    S自增1,如果S>0,说明后面没有排队的线程,就直接返回就行了,否则需要唤醒后面等待的线程。
    这里写图片描述
    他的优点就在于只需要几个简单的元素,就能解决同步的问题。
    在开发的时候经常遇到一些类似的操作,这里是不是可以借鉴PV机制?

  • 未完待续。。。。

阅读更多
换一批

没有更多推荐了,返回首页