Android 和 Linux之间的联系

20人阅读 评论(0) 收藏 举报
分类:

Android 和 Linux之间的联系

写在前面

之前学习Linux驱动方面的知识,但由于工作的需要,接触Android 底层的调试。在接触Android底层之后,曾一度陷在其中,理不清Android底层与Linux驱动之间的联系。

一、Android底层与Linux驱动有什么不同呢?

之前一直在学的都是Linux驱动方面的知识,当接触Android底层时,让我一时转不过来,怎么Android底层就变得辣么复杂呢?什么HAL?还有JNI?多了这两个货,一时转不过了,懵懵懂懂的学习了一段时间,感觉不对,总是连不成串。于是退出来,结合Linux系统捋一捋,终于有了发现,下面对比着来看。

1、通常所说的Android系统包括了Android源码和Linux内核两部分
2、而Linux系统也包含两部分 FileSystem 和 Linux内核两部分

这样对比着看起来一切就变得一目了然了,这样就可以把Android的源码部分想象成是Linux系统中的FileSystem部分。但是Android上层应用是使用java语言写的,不能直接调用C语言实现的系统接口,而Linux系统中可以用C语言调用系统接口来与内核进行通信,于是Android系统中就有了一个叫做JNI的概念,用实现java与C/C++程序之间的信息交互。
由于Android系统和Linux内核(GPL)采用的开源协议不同,Android系统为了保护硬件厂商的知识产权,将驱动发杂的实现部分抽取发到Android源码中去实现,因此就有了HAL的概念了(暂时是这么理解的)。

二、Android底层开发与Linux驱动开发的联系

Android 驱动可以看成是:Linux驱动+封装;Android APP不能直接访问Android驱动程序,因此需通过JNI这种方式来访问。例如一个Android应用程序要访问Android驱动程序有两种方式:
1:APP—>JNI—>Android驱动程序
2:APP—>硬件访问服务—>Android驱动程序

Android底层开发可以分为两部分:
1.JNI:无论是以哪种方式访问底层驱动程序,都要上层应用(APP:java程序)都要通过调用JNI来访问C/C++生成的库文件.so来达到访问底层驱动的目的(在Android 8 以后,Framework和HAL之间的通信方式发生了改变,通过HIDL的方式来实现)。
2.Linux内核驱动:Android系统是基于Linux内核的,因此需要在Linux内核中实现驱动开发。
3.Android驱动与Linux开发过程的联系:Android系统是基于Linux内核,因此Android系统源码是类似于Linux系统中的文件系统(注:Linux系统包含:内核、shell、文件系统、应用程序);在Linux系统中由系统提供一套系统调用接口(C语言实现),所以在Linux系统的驱动程序开发中应用程序可以直接的去与驱动程序通信(C语言应用程序);而在Android系统中,应用程序(APP)一般是采用java语言实现的,且java语言不能直接调用系统接口,因此需要通过一种中间技术来访问,而在Android中就采用JNI这种技术来实现。因此在Android驱动开发过程中结合Linux驱动程序的开发可以这样理解:

编写Linux内核驱动程序——>编写C语言应用程序(即jni程序)用于与内核驱动进行通信(可以理解为接收服务器端发来的消息,将处理过个消息发送给驱动层,并将驱动层返回的消息反馈给服务器,服务器将消息转发给APP)——>编写java应用程序(可以理解为APP通过socket方式建立了与C应用程序的通信)通过调用下层的C程序去与驱动程序建立通信。

小结

经过Linux系统与Android系统对比,理顺了Linux驱动和Android底层驱动的联系:
驱动实现方面:两者都是在Linux内核中实现的,不同的是Android系统将复杂的实现抽取出来放到用户空间去实现。
用户空间和内核空间交互方面:Linux系统可以直接用C语言调用系统接口,跟内核进行交互;而Android系统上层应用是java实现,因此就产生了一个叫JNI的中间桥梁,通过它去调用本地的C/C++实现的方法去与内核交互。

查看评论

Android中Uri和ContentProvider以及ContentResolver之间的联系

Android中Uri和ContentProvider以及ContentResolver之间的联系1.Uri 1.1概念: 通用资源标志符(Universal Resource I...
  • u014225510
  • u014225510
  • 2015-04-26 15:11:14
  • 1065

Linux的发行版之间的联系和区别

联系 Linux的内核源代码和Linux的应用程序都可以自由获得,因此很多公司组织开发了属于自己的Linux发行版。主要有三个分支:Debian、Slackware、RedHat。每一个分支都拥有一...
  • suixin788
  • suixin788
  • 2016-09-16 14:48:32
  • 850

按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。

按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。     1、Debian:三大主流发行版之一,以社区方式运作,没有商业公司支持        knopix是基于Debian的二次...
  • he1064267001
  • he1064267001
  • 2016-09-17 14:09:43
  • 279

Linux的发行版以及不同发行版之间的联系和不同

Linux发行版以及不同发行版本之间的联系和不同 Linux来源 Unix—minix—Linux tovalds-(1991)—Linux—GNU (GPL) 今天的Linux=Linux内核+...
  • Linuxgy
  • Linuxgy
  • 2016-09-16 17:40:02
  • 278

android 和iOS的区别和联系《个人记录》

0: iOS的window 就相当于是android 中的Framelayout是一层一层的叠加上去的 1:iOS 中的视图可以直接添加子视图, 这个和android 有很大的区别,android只...
  • Rodulf
  • Rodulf
  • 2016-10-08 22:54:47
  • 457

Android ContentProvider、ContentResolver和ContentObserver的使用

1、首先来了解一下ContentProvider、ContentResolver和ContentObserver ContentProvider是Android的四大组件之一,可见它在Android中...
  • heqiangflytosky
  • heqiangflytosky
  • 2014-06-17 16:39:05
  • 2940

Activity和Fragment之间的联系和区别

Android开发中,Acitivity是四大组件中用得非常多的一个组件,也是UI和业务逻辑的一个重要的纽带,那么它和与它很类似的Fragment有哪些联系和区别呢?现在主要从生命周期来谈谈自己的看法...
  • llearner
  • llearner
  • 2017-04-13 22:23:30
  • 601

Android和Linux的关系

① Android采用Linux作为内核 ② Android对Linux内核做了修改,目的是适应在移动设备上使用 ③ Android开始作为Linux的一个分支,后来由于无法并入Linux的主开发树,...
  • u010073981
  • u010073981
  • 2015-12-22 23:12:13
  • 2349

进程与线程之间的区别及联系

一、定义:     1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代...
  • gogoky
  • gogoky
  • 2016-05-08 16:27:33
  • 1541

ArrayList.LinkedList.Vector三者之间的区别与联系

以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木有...
  • xiaodifa995455120
  • xiaodifa995455120
  • 2012-02-19 21:56:44
  • 1544
    个人资料
    等级:
    访问量: 62
    积分: 30
    排名: 200万+
    文章分类
    文章存档