一、Android架构
要想从一名app开发转到framework开发首先必须的先了解android的架构,如下图:
网上关于安卓的架构图很多,但是我觉得这张比较适合应用层的开发人员理解,我们从下往上说。
Linux:
大家应该都使用过adb命令,所以对Linux并不陌生。我们的android系统就是跑在linux下的系统。Linux层里面包含系统和硬件驱动等一些本地代码的环境。(^_^博主对linux了解的也不是特别深)
HAL:
再上一层是HAL层,全称Hardware Abstraction Layer也就是硬件抽象层,不仅名字很抽象理解起来也很抽象。大家可以看一下这个链接
https://blog.csdn.net/yyh448522331/article/details/77925907
我用APP开发的思路整理下他说的这个HAL层。
如果从android app层直接跟硬件通讯互相传递的都是文本数据,需要对这些文本数据做一些处理才可以应用到咱们开发的业务上。比如我想获取一个硬件的名称、出厂日期、设备编号这些基础信息的时候。我们需要对硬件传输一段文本信号,然后硬件给我们返回一段文本信息,然后对文本进行处理才能获取到对应的硬件信息。哈哈,听起来是不是很乱不太好懂?如果这时候如果我们能通过get这样的java的方法就更获取到硬件信息是不是就简单多了,HAL就起到了这样的作用。
HAL和咱们java中的interface很像。HAL只负责定义发送和接收消息的方法名。他和aidl通信(aidl通讯以后会说)特别的相似。里面只负责定义接口逻辑由硬件层实现 。
比如一个灯的开关。我只需要在HAL里定义一个openLight(boolen open);的方法。客户端将open参数通过openLight函数传给硬件,硬件那面收到这个boolean值自己写逻辑跟硬件通讯。按照HAL定义的接口各写各的互不干涉太多。这样的好处是安卓层调用方便了很多,硬件端技术私密性也得到了保护。
Native C/C++ Libraries:
native也是本地层,里面都是c和c++的代码和库比如我们用到的播放器、浏览器、数据库、OpenGL这些功能时实际都是由c和c++来负责实现java只是负责调用。具体java怎么调用到native c/c++这块这里就要说到虚拟机了。
Android Runtime:
Android Runtime简称ART虚拟机。安卓还有一种虚拟机叫Dalvik VM,这个虚拟机是老版本的虚拟机现在基本已经没有安卓设备用了。具体两个虚拟机之间有什么差别大家可以网上搜搜。那么肯定有小伙伴有疑问不知道虚拟机是个什么东西他都干了啥?从字面意思上来理解他就是一个虚拟的计算机。可能的小伙伴之前对JVM虚拟机有了解,他们都差不多是一个意思。只是做的事稍微有些不同。
上面我们说到android的最底层是Linux系统。Linux系统下有一堆用c和c++写的功能比如播放器、数据库、浏览器等等实际上就是上面说到的native层。但是我们的android系统使用java写的,c和c++遇到java后表示你谁啊你要干啥不认识你,native说我想跑一个android系统但是我不会。这时候android的虚拟机出现了。android这面所有的事都交给虚拟机来处理。虚拟机还需要负责跟native做通讯,这样JNI(Java Native Interface)就出现了。说到jni很多开发app的同学并不陌生,比如之前接过播放器sdk、高德或者百度sdk、AR的sdk时候在引入他们sdk的同时还要在项目里新建一个jni的文件夹把对应的.so后缀的文件放在对应的处理器内核文件夹下。 说到这是不是有很多做app的同学就理解我们之前为啥在使用三方播放器、地图等sdk时要引入这些so文件了。它主要是负责的就是java和native层代码通讯。涉及到so文件问什么要放在不同cpu文件目录下我以后会单独讲。
framework:
说道我们的主角了,他的下面是native层,上面是APP层。APP层我们都了解这里就不多说了。我们分析framework所在的层级不难发现,他的作用就是一个承下启上的作用。比如系统的状态栏,它里面包含了很多信息,如wifi、电池、蓝牙、运营商等信息。 这些信息都是通过framework层开发来传递的。framework负责和native层通讯将这些信息传递给上层应用以便于应用层开发页面和开发业务。拿WiFi为例可能会被多个应用用到所以framework就做了一个WiFiManager给上层应用。这样我们在做app开发的时候谁都可以通过WifiManager获取到wifi信息了。还有一部分是android本身堆栈和线程的信息,这些也是通过各种Manager给APP层提供的。如ActivityManager、ServiceManager、WindowManage的等等...还有就是对android的原生组件这些都是framework层的东西。
这样一整套android架构就介绍完了。我是从android应用层开发方便理解的角度说的,可能有些地方原理和用词不太严谨和准确。主要是对app开发的同学理解安卓架构提供另一种理解方式。理解之后再回去看网上其他博主的帖子可能就会看懂些了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)