Android 和 Linux之间的联系

 发布日期:2018-04-26 02:02:00  阅读次数:22  来源:

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++实现的方法去与内核交互。

如果您有好的新闻与建议,欢迎点击文章投稿

    发表评论

    电子邮件地址不会被公开。

  • 内容

  • 网名