首页 \ 问答 \ Redis和Memcache的区别分析

Redis和Memcache的区别分析

更新时间:2023-07-28 08:07

最满意答案

其实蛮正常的,移动设备驱动、系统、硬件需要紧密结合,扛不住太多的中间层。各厂商往往暴改原始驱动才能应用上。既然大家都改,又都有源代码,android就变成不是很在乎这个了。

手机如果没升级,大家push的是手机厂商,不是google。所以google也不是特别在乎这方面的改进。而且即便google升级了版本号,手机厂商仍然不见得会跟着。

、

其他回答

在各个厂商开发基于Android系统的产品的时候,虽然有的时候也需要修改Android的框架,但是移植是其中的主要工作。
 Android系统本身是一个庞大的系统,移植并不需要精通Android的每一个部分,需要考虑的是Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序。如图1-3所示。
 

图1-3 Android移植的概念

 基于Android系统的手机,包括G1、G2、Hero和Nexus One,其他的手机厂商也推出了几款Android手机。这些手机所使用的处理器和各种外围硬件各不相同,但是其使用的大部分Android系统的软件都是相同的(包括本地框架、虚拟机、Java框架和Java应用等部分)。

 移植的目的就是为了改动较小的内容,支撑较为庞大上层的系统。同时由于硬件抽象层具有标准的接口,在各个不同的平台的实现中可以互相参考,虽然具体实现的内容不同,但是思路类似,可以相互参考。
 Android系统的移植工作的目的是为了在特定的硬件上运行Android系统。在移植的过程中,把握关键要点,减少工作量是一个重要的方面。从工作的角度,通常的方法为,首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。
 移植方面主要的工作有两个部分:
 Linux驱动
 Android系统硬件抽象层
 Linux中的驱动工作在内核空间,Android系统硬件抽象层工作在用户空间,有了这两个部分的结合,就可以让庞大的Android系统运行在特定的硬件平台上。
 Android移植的主要工作如图1-4所示。
 

图1-4 Android移植的主要工作

 在具有了特定的硬件系统之后,通常在Linux中需要实现其驱动程序,这些驱动程序通常是Linux的标准驱动程序,在Android平台和其他Linux平台基本上是相同的。主要的实现方面是Android系统中的硬件抽象层(Hardware Abstract Layer),硬件抽象层对下调用Linux中的驱动程序,对上提供接口,以供Android系统的其他部分(通常为Android本地框架层)调用。

 提示:Android硬件抽象层的接口是本地移植层的接口,不属于标准API,不具有向前或者向后兼容性。
 在Android系统需要移植的内容,主要包含了以下的各个部分:
 显示部分(Display)
 包括framebuffer驱动+Gralloc模块(可选择是否实现)
 用户输入部分(Input)
 包括Event驱动+EventHub(Android标准内容)
 多媒体编解码(Codec)
 包括硬件Codec驱动+Codec插件(如OpenMax)
 3D加速器部分(3D Accelerator)
 包括硬件OpenGL驱动+OpenGL插件
 音频部分(Audio)
 包括Audio驱动+Audio硬件抽象层
 视频输出部分(Video Out)
 包括视频显示驱动+Overlay硬件抽象层
 摄像头部分(Camera)
 包括Camera驱动(通常是v4l2)+Camera硬件抽象层
 电话部分(Phone)
 Modem驱动程序+RIL库
 全球定位系统部分(GPS)
 包括GPS驱动(通常为串口)+GPS硬件抽象层
 无线局域网部分(WIFI)
 包括Wlan驱动和协议+WIFI的适配层(Android标准内容)
 蓝牙部分(Blue Tooth)
 包括BT驱动和协议+BT的适配层(Android标准内容)
 传感器部分(Sensor)
 包括Sensor驱动+Sensor硬件抽象层
 震动器部分(Vibrator)
 包括Vibrator驱动+Vibrator硬件抽象层(Android标准内容)
 背光部分(Light)
 包括Light驱动+ Light硬件抽象层
 警告器部分(Alarm)
 包括Alarm驱动和RTC系统+用户空间调用(Android标准内容)
 电池部分(Battery)
 包括电池部分驱动+电池的硬件抽象层(Android标准内容)
 Android中具有很多组件,但并不是每一个部件都需要移植,对于一些纯软的组件,就没有移植的必要。对于一些部件,例如浏览器引擎,虽然需要下层网络的支持,但是并非直接为其移植网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口。
 Android的移植主要可以分成几个类型:基本图形用户界面(GUI)部分,包括显示部分和用户输入部分;和硬件相关的加速部分,包括媒体编解码和OpenGL;音视频输入输出环节,包括音频,视频输出和摄像头部分;连接部分,包括无线局域网,蓝牙,GPS;电话部分;附属部件:包括传感器、背光、振动器等。
 除了以上的移植方面,电源管理也是非常重要的一个方面,它和Android的各个子系统都有关系。
 Android系统主要需要移植部件如图1-5所示。
 

图1-5 Android系统主要需要移植部件

 对于大部分子系统,硬件抽象层和驱动程序都需要根据实际系统的情况实现,例如:传感器部分、音频部分、视频部分、摄像头部分、电话部分。也有一些子系统,硬件抽象层是标准的,只需要实现Linux内核中的驱动程序即可,例如:输入部分、振动器部分、无线局域网部分、蓝牙部分等。对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。

 时至今日,随着Android系统的发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类电子和智能家电,例如:上网本、电子书、数字电视、机顶盒、固定电话等。在这些平台上,通常需要实现比移动设备更少的部件。一般来说,基本用户界面部分(包括显示和用户输入)是需要移植的,其他部分是可选的。例如:电话系统、振动器、背光、传感器等一般不需要在非移动设备系统来实现;对于一些固定位置设备通常也不需要实现GPS系统。

图片无法显示,见谅

相关问答

更多
  • 硬件
  • NDK开发可以linux下的android源码中编译单个模块生成.so文件,然后放在上层android 项目中调用,你在源码中吧,你要编译的模块驱动的C代码放进去,按照JIN规则取号名字,然后编\编译,就行了,把生成的 so文件导入到上层项目,然后你知道C的函数名,在java层写本地方法和,C的函数名一样,记得类名也别搞错了,就行了。不要烧录整个系统,只要编译你需要的驱动模块生成so文件就行
  • 其实蛮正常的,移动设备驱动、系统、硬件需要紧密结合,扛不住太多的中间层。各厂商往往暴改原始驱动才能应用上。既然大家都改,又都有源代码,android就变成不是很在乎这个了。 手机如果没升级,大家push的是手机厂商,不是google。所以google也不是特别在乎这方面的改进。而且即便google升级了版本号,手机厂商仍然不见得会跟着。 、
  • 如果你装的是最新的ubuntu,估计绝大部分硬件驱动都不需要自己装就能认出来linux驱动和windows驱动不兼容,连不同版本的windows驱动都不能完全兼容就别指望两个完全不一样的操作系统的驱动能一样,你更别指望去双击windows驱动里的setup.exe如果有硬件没认出来,一般来说有两种情况,你可以去找这个硬件的驱动并安装,可能厂商会提供,也可能没有,比如某个摄像头的话,国内那些山寨厂商估计连windows的驱动都是芯片厂商给的,自己根本不会写驱动更不会给你linux驱动,如果在linux下认不到 ...
  • 常规linux 是模块化管理,驱动是内核层的补充!安卓是嵌入式linux ,应该都遵循这个规则!
  • 我没做过usb的。 我做过蓝牙串口的。 可能我的更简单一点,也是连android的。而且蓝牙串口不需要任何协议,就是简单的字符接受和发送。通过最基本的RXD和TXD接口就搞定。。。
  • 其实很多人在选择技术框架往往都会采用自己最熟悉的那个, 但细细比较,ibatis与hibernate的差异还是比较大的。 ibatis 最大的优点是将sql与程序代码做了分离,于是数据库的落地操作与程序逻辑可以解耦; 分工上可更加明确,而对于sql的调试及优化也更加直接高效。 然而缺点也很明显,不支持orm,于是大量的数据库sql语句都需要手动编写。 hibernate对orm的支持已经相当完善且稳定,普通的增删改查操作已经不需要通过sql进行实现, 而hql及nativeSQL的支持也让hibernate ...
  • 看格式,如果是自己开发的驱动,就是****.ko格式 使用如下指令挂载: insmod ****.ko 如果是官方提供的,常见有两种,一种是可执行的(在linux终端下绿色,用ll看,该文件有x属性),直接到那个目录下执行 ./****.bin 如果是gz,很可能需要编译和安装,那个就是 ./configure make make install
  • 域层是业务逻辑。 理想情况下,它不与任何东西耦合,因此您可以使用相同的代码并将其作为服务运行,或者将其作为Java Swing客户端应用程序或任何您想要的东西。 这是Java和JVM语言的主要优点之一 - 它不会耦合到平台(除非您使用平台特定的东西)。 如果您在域逻辑中使用Android的Java SDK,那么您将有价值的业务逻辑与Android平台相结合。 就像您确定的那样,Android的核心类( Activity , Context , Service等)不应该在这一层使用。 这些是表示层结构。 您可 ...
  • View.LAYER_TYPE_HARDWARE意味着视图将由硬件层支持,例如纹理,FBO ......因此,无需重新绘制视图即可轻松/几乎自由地应用颜色效果,半透明度和其他GPU效果。 最好在视图具有此类效果时或在动画之前启用硬件层。 硬件层需要大量的RAM,所以要小心。 这里的文档: LAYER_TYPE_HARDWARE及其引用: 表示视图具有硬件层。 硬件层由硬件特定纹理(通常是OpenGL硬件上的帧缓冲对象或FBO)支持,并使视图使用Android的硬件渲染管道进行渲染,但前提是为视图层次结构打开 ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)