Android接口和框架学习

缩写:

HAL:HardwareAbstraction Layer,硬件抽象层

CTS:CompatibilityTest Suite,兼容性测试套件

Android让你能够自由实现设备规格和驱动,HAL提供一套标准方法来在Android平台栈(platform stack)和硬件之间创建软件钩子(hook),Android系统是开源的,你可以贡献自己的接口和增加功能。

为保证设备保持高质量和提供一直的用户体验,每个设备必须通过CTS测试。CTS确保设备满足质量标准,保证APP的可靠运行和好的用户体验。

在移植Android到你的硬件平台上,花些时间从一定高度来理解Android系统框架。因为你的驱动和HAL要和android交互,了解Android工作机制可以帮助你有效控制Android源代码树的多层代码。

图1

1.     应用框架层(Applicationframework)

应用框架层主要是应用程序开发人员经常使用,作为硬件开发者,你应该知道尽可能多的API,且要知道这些API和底层HAL接口的映射关系,这样可以提供关于实现驱动的有用信息。

2.     IPC进程间通讯机制Binder(Binder IPC)

Binder机制允许应用框架层款过进程界限并访问Android系统服务代码,这可使高层的框架API和Android系统服务交互,在应用框架层,这种通讯对开发者隐藏并表现为事情就好像是顺其自然完成一样。

3.     系统服务(system services)

应用框架API提供的函数和系统服务通信以访问底层硬件,服务是模块化的,比如比较重要的Windows Manager窗口管理器、Serarch Service搜索服务或是Notification Manager通知管理器。Android包括两组服务:系统(比如Windows Manager和Notification Manager)和多媒体服务(如录制和播放媒体服务)

4.     HAL硬件抽象层(Hardware Abstraction Layer)

HAL定义一组标准接口来让设备厂商去实现,允许Android不必知道底层驱动的实现。HAL允许你在不影响或是修改上层系统的前提下实现功能,HAL的实现被打包成为模块(.so文件)文件,并且在适当的时候被Android系统加载。

图2

你必须为产品的硬件实现相应的HAL(和驱动), HAL的实现典型的被编译成共享库模块(.so文件),Android没有要求在HAL实现和设备驱动之间是标准的交互,所以你可以基于自己的情况做最适合的事情。但是,为了保证Android系统能够和硬件正确交互,你必须遵守每个具有硬件特性的HAL接口协议。

5.     标准HAL结构体(Standare HAL structure)

每个特定硬件HAL接口都有其特性,由hardware/libhardware/include/hardware/hardware.h的结构体hw_module_t定义,这样可保证HAL有个可预见的结构。HAL接口允许Android系统一致性的加载你的HAL模块的正确版本。HAL接口由两个通用的组件组成:一个模块(module)和一个设备(device)。

5.1   模块(module)

模块打包了HAL的实现,这些实现作为一个共享库.so文件体现。它包含模块的version、name、author,这些成员帮助Android找到和加载模块,模块对应的结构体为hw_module_t,在hardware/libhardware/include/hardware/hardware.h定义,此结构体描述一个模块和包含比如模块版本、作者和名字。

除此之外,hw_module_t结构体还包含指向hw_module_methods_t结构体的指针methods,hw_module_methods_t结构体包含一个打开模块的函数指针open。这个open函数作为一个抽象服务发起和硬件的通信,每个具体的硬件HAL通常要扩展通用的hw_module_t结构体,增加附加信息来更好的描述具体的硬件。比如摄像头HAL,

typedefstruct camera_module {hw_module_t common;int (*get_number_of_cameras)(void);//扩展部分int (*get_camera_info)(int camera_id,struct camera_info *info); //扩展部分
}camera_module_t;

当你实现一个HAL和创建模块结构体,你必须以HAL_MODULE_INFO_SYM来给name成员赋值,比如:

structaudio_module HAL_MODULE_INFO_SYM = {.common = {.tag = HARDWARE_MODULE_TAG,.module_api_version =AUDIO_MODULE_API_VERSION_0_1,.hal_api_version =HARDWARE_HAL_API_VERSION,.id = AUDIO_HARDWARE_MODULE_ID,.name ="NVIDIA Tegra Audio HAL",.author = "The Android Open SourceProject",.methods = &hal_module_methods,},
};

5.2   设备(device)

设备抽象了产品实际的硬件,比如一个音频模块包含一个基本的音频设备、一个USB音频设备或一个蓝牙A2DP音频设备。一个设备由hw_device_t结构体描述,像模块一样,每种类型的设备可在hw_device_t结构体的基础上定义更多细节信息,比如指向硬件特征的函数指针,audio_hw_device_t就包含指向音频设备操作的函数指针get_supported_devices。

struct audio_hw_device {struct hw_device_t common;/*** used by audio flinger to enumerate what devices are supported by* each audio_hw_device implementation.** Return value is a bitmask of 1 or more values of audio_devices_t*/uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);...
};
typedef struct audio_hw_deviceaudio_hw_device_t;

除了这些标准的属性,每个具体硬件HALC接口可以定义多个硬件特有属性和需求

6.     HAL模块

HAL的实现被编译成为模块(.so)文件和在Android合适的时候会动态链接它。你可以为你每个HAL实现创建Android.mk文件来编译你的模块并指向你的源代码文件。通常,你的共享库必须以某种格式命名,这样它们才可能被找到和加载。从模块到模块的命名方案略有不同,但是一般遵循下面的形式:<module_type>.<device_name>

非常重要,比如module_type可以是GPS,但如果采用不同的GPS外设,可以通过device_name来区分。

7.     Linux内核

开发你的设备驱动类似于开发典型的linux设备驱动,Android使用一个版本的Linux内核,在此内核基础上增加了一些Android特有的内容,比如唤醒锁(wave lock,一个内存管理器系统更积极主动去保护内存)、Binder IPC驱动和其他针对移动嵌入式平台的重要特征,这些特征是系统主要功能和不影响驱动开发。

你可以使用任何支持所需要特诊的版本内核(比如binder驱动),但是,我们推荐采用最新的Android内核版本。

参考链接:

http://source.android.com/devices/index.html

Android接口和框架学习相关推荐

  1. Java接口自动化测试框架学习

    Java接口自动化测试框架学习 高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,渗透测试,测试用例设计,黑盒测试,白盒测试,UFT高级测试,Android测试 ...

  2. python+requests+pytest+allure+yaml+DDT+logs 接口自动化框架使用手册

    一.单条测试用例 无ddt数据驱动的场景 1 config.yaml 中书写基础路径 2 在redloads模块中,新建一个demo_fun.py文件, 其中demo要用的方法写在其中 如:读取con ...

  3. android多媒体框架学习 详解

    原址 一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了! ...

  4. android多媒体框架学习 详解 最新版本

    一:多媒体框架概述 jellybean 的多媒体跟以前的版本,通过对比没啥变化,最大的变化是google终于舍得给multimedia建个独立的git了(framework/av),等你好久了!也体现 ...

  5. Retrofit + Rxjava框架学习使用(举例:酷狗搜索和详情接口)

    在我上一篇博客Retrofit框架简单学习使用基础上修改. 依赖: dependencies {implementation 'com.squareup.retrofit2:retrofit:2.5. ...

  6. Android 框架学习4:一次读懂热门图片框架 Picasso 源码及流程

    Android 框架学习1:EventBus 3.0 的特点与如何使用 Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线 Android 框架学习3:我从 EventB ...

  7. 转:Jenkins+Jmeter+ant接口自动化框架for Linux学习

    Jenkins+Jmeter+ant接口自动化框架for Linux学习 2018年06月08日 17:55:31 杀生丸的玲 阅读数:1031 版权声明: https://blog.csdn.net ...

  8. android图片转场,Transitions框架学习(二) —— 应用转场效果

    在Transitions框架中,动画将创建一系列帧来描述视图结构从开始场景到结束场景的变化.视图框架通过Transition对象来代表这些动画,其中包括了动画的相关信息.要执行一个动画效果,需要向tr ...

  9. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

最新文章

  1. python08-类与对象
  2. Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库
  3. 在vue3+vite+ ts 项目中使用svg
  4. UCI机器学习数据集
  5. Pandas DataFrame 取消科学计数法打印
  6. 触发器的创建和使用(sql2005)
  7. .通过JAVA-Webservices向其它平台提供Hbase服务
  8. 软件测试:测试用例八大要素模板
  9. 安装VS之后,excel每次启动都会配置Visual Studio的解决办法
  10. c语言输出整型量格式符,C语言输出格式(详细)
  11. 安卓手机模拟路由器 测试WIFI信道遍历
  12. 5gh掌上云计算认证不通过_华为云计算认证考试好考吗?我考华为云计算HCIE的经验分享...
  13. 关于Msocache文件夹
  14. 部署asp.net mvc_在ASP.NET 2.0上部署ASP.NET MVC
  15. 【百战GAN】如何使用GAN给黑白老照片上色?
  16. html:用script实现搜索框
  17. 关于仿写00片刻企业站
  18. aec Gain 公式
  19. 单词caement水泥英语
  20. SAML 协议-简单的SAML

热门文章

  1. linux vim模板,FreeBSD8下的vim配置模板
  2. springboot幂等性_如何使用 SpringBoot + Redis 优雅的解决接口幂等性问题
  3. 014_Vue过滤器
  4. 012_JDBC模板
  5. 078_html5Canvas
  6. Windows下Unity5x创建和打开游戏工程
  7. 485有时候从机接收指令没反应_原来微信发语音不好听,是你没掌握这2个技巧!快去试试吧...
  8. 伯努利分布方差_统计知识(4)——分布
  9. Java 程序死锁问题原理及解决方案
  10. 修改 class_带你探索JVM的Class文件结构