https://www.cnblogs.com/soultel/p/5449594.html
android从应用到驱动之—camera(1)---程序调用流程
Android内核和驱动篇-Android内核介绍 (转)
https://blog.csdn.net/jmq_0000/article/details/7372783
Android 的维基百科介绍
旧版本Android的存储空间分成“程序”和“数据”,如果下载大型游戏,便很容易用尽。
新版本Android(此图为9.0)的存储空间分成10个类别,让用户可以更明确知道存储空间使用状态。图例为
HTC U11
应用程序[编辑]
Android拥有越来越多第三方应用程序的选择,用户可以透过下载和安装应用程序的
APK(Android应用程序包),或利用应用程序商店来下载,允许用户在那里进行
安装、更新和移除。
Google Play是安装在Android设备上的主要应用程序商店,那些程序都符合Google的兼容性要求,并获得Google移动服务软件许可
[5][118]。Google Play商店允许用户浏览、下载及更新Google和第三方开发者发布的应用程序;截至2013年7月,Google Play商店中有超过1,000,000个适用于Android的应用程序
[119]。截至2013年7月,已有500亿个应用程序获得安装
[120][121]。一些电信商为Google Play应用程序提供直接结算,把应用程序的成本添加到用户的月结单中
[122]。截至2017年5月,每月使用Gmail、Android、Chrome、Google Play和Google地图的活跃用户超过10亿。
内存管理[编辑]
由于Android设备通常采用电池供电,因此Android旨在管理流程以将耗电降至最低。当应用程序未使用时,系统会暂停其操作,虽然可以在关闭期间立即使用,但它并不会使用电池电源或CPU资源
[126][127]。当内存不足时,系统将会自动隐藏地开始关闭长时间内处于非活跃状态下的进程
[128][129]。Lifehacker在2011年的报告指出,第三方任务杀手应用程序是弊大于利
[130]。
硬件支持[编辑]
运作Android 7.1的设备对
RAM最低要求的范围从最佳硬件的2GB降到最常见屏幕的1GB;最低规格的32位智能手机最小需要512MB。Android 4.4的建议是至少需要512MB的RAM,而对于“低RAM”设备,340MB是必需的最低容量,不包括专用内存的各种硬件组件,例如基带处理器
[139]。Android 4.4 需要
32位的ARMv7,
MIPS或
x86的架构处理器(后两者是非官方连接端口)
[135][140],以及与
OpenGL ES 2.0兼容的
图形处理器(GPU)一同使用
[141]。Android支持OpenGL ES 1.1、2.0、3.0、3.1及截至现时为止最新的主要版本3.2及自Android 7.0的
Vulkan (API)(和版本1.1适用于某些设备
[142])。某些应用程序可能会明确要求使用某个版本的OpenGL ES,并且运行此类应用程序需要合适的GPU硬件
[141]。
Android设备包括了许多可选的硬件部件,包括静止或视频录像机、
GPS、
方向传感器、专用游戏控制器、
加速规、
陀螺仪、气压计、
磁强计、
接近传感器、
压力传感器、
温度计和
触摸屏。某些硬件组件不是必需的,但在某些类别的设备(如智能手机)中成为了标准组件,若存在其他要求,则适用。最初需要一些其他硬件,但那些要求都经已放宽或完全取消。例如,由于Android最初是作为手机操作系统而开发的,因此必须麦克风等那些硬件,而随着时间的推移,这些手机功能变成可选的项目
[121]。Android曾经需要一台
自动对焦的相机,这款相机已经放宽到成为
固定焦距相机
[121],若是现存的话,当Android开始在
数字视频转换盒(俗称机顶盒)上使用时,相机就能完全被丢弃了。
Android除了在智能手机和平板电脑上运作外,还可以在一些附有键盘和鼠标的普通PC硬件上运作
[143][144][145][146]。除了可在商用硬件上使用外,Android也有类似于PC硬件友好的版本,可以从Android-x86的项目中免费提供,包括个人订制的Android 4.4版本
[147]。使用作为
Android SDK一部分的
仿真器,或第三方的仿真器,Android也可以在x86架构上非本机地运行
[148][149]。中国的一些公司基于Android,正在构建PC与移动设备的操作系统,是“Google Android与Microsoft Windows之间的直接竞争
[150]。”中国工程学院指出,随着中国禁止在政府电脑上使用Windows 8,数十家公司正在定制Android系统
[151][152][153]。
软件开发[编辑]
更新时间表[编辑]
Android与其主要的竞争对手
苹果公司的
iOS相比,Android的更新通常会明显的延迟以让各种设备安装。除了Google的Nexus和Pixel品牌的设备外,更新通常会在新版本发布的几个月后到达,或者根本没有
[180]。这部分是由于Android设备中
硬件各不相同
[181],每次升级必须专门定制,那是个耗费时间和资源的过程
[182]。制造商经常会优先考虑他们最新的设备并遗下旧设备
[183]。在收到制造商的更新后,无线运营商可以让设备额外延迟推出,以便于升级发送给用户之前,商户能透过进一步根据自己品牌的需求而定制及在他们的网络上进行广泛的测试
[183][184]。由于一个制造合作伙伴没有为
驱动程序提供必要的更新,故此会有一些情况下无法进行升级
[185]。
随着新版本的操作系统,Android设备中硬件的广泛变化会导致软件升级有严重的延误,而
补丁通常需时几个月才能到达消费者手中,有时甚至根本没有。制造商和运营商缺乏售后支持服务受到消费者群及科技媒体的广泛批评
[186][187][188]。一些评论员指出了一点,指这个行业有一个金融刺激而不会为他们的设备升级,由于缺乏为现有设备更新,故推动购买新产品
[189],这种态度被形容为“侮辱”
[188]。《
卫报》抱怨指更新的分发方法很复杂只是因为制造商和运营商都是这样设计
[188]。2011年,Google与众多业内人士合作宣布推出“Android更新联盟”,承诺在每台设备发布后18个月内提供及时更新,然而,自宣布以来,关于那个联盟并没有另外一个官方的说法
[183][190]。
2016年5月,
彭博报导称Google正在努力让Android保持最新状态,包括加快安全更新率、推出技术的解决方案、减少对手机测试的要求,并对电话制造商进行排名,试图利用“羞辱”他们来让行为变得更好。正如《彭博》所说:“随着智能手机变得越来越强大,复杂和可攻击,让最新的软件能与硬件密切合作变得越来越重要。”Android的领导人
浩史·洛克海默承认指“这不是一个理想的情况”,他进一步评论指缺乏更新是“Android上安全性最薄弱的环节”。无线运营商在报告中被描述指那是“最具挑战性的讨论”,因为运营商的网络测试审批时间较慢,尽管有一些运营商包括
威讯无线及
Sprint,已经缩短了他们各自的审批时间。
HTC的时任运行官贾森·麦肯齐(Jason Mackenzie)于2015年称每月的安全性更新是“不切实际”,而Google试图说服运营商从完整的测试程序中排除安全补丁。为了进一步说服,Google分享了与其Android合作伙伴更新设备的顶级手机制造商的一份清单,并正在考虑将名单向公众发布。手机制造商Nextbit的联合创始人及前Android开发人员Mike Chan说,“解决这个问题的最佳方法是对操作系统进行大规模的重组架构”或Google可以投资培训制造商和运营商“成为优秀的Android人民
[193][194][195]”。
2017年5月,随着
Android Oreo发布,Google推出了Project Treble,旨在使制造商能够更轻松,更快捷,及更低成本地将设备更新到Android的最新版本。Project Treble通过新的“供应商界面”将供应商实施与Android OS框架分开(由硬件制造商所写供设备专用的较低级别软件)。在Android 7.0及更早版本中,并不存在正式的供应商界面,因此设备制造商必须更新大部分Android代码,以将较新版本的操作系统移至设备中。借助Project Treble,新的稳定供应商界面可以进入Android特定部分的硬件,使设备制造商能够简单地通过更新Android操作系统框架来为设备提供新的Android版本,而“毋须硅制造商的任何额外工作
[196]。”
2017年9月,Google的Project Treble团队透露,作为改善Android设备安全生命周期努力的一部分,Google已经设法让Linux基金会同意延长Linux长期支持(LTS)的内核分支的生命周期至少两年,对于未来版本的LTS内核,历史上已经持续了6年,并从Linux内核4.4开始
[197]。
Linux内核[编辑]
Linux内核的Android的变种具进一步改进了由Google实施在典型的Linux内核开发周期之外实现的架构变化,比如包含类似组件的设备树(device trees)、ashmem、ION,以及不同的
内存不足(OOM)的处理
[201][202]。除此之外,Google为了能让Linux在移动设备上良好的运行,对其进行了修改和扩展。Android去除了Linux中的本地
X Window System,也不支持标准的
GNU库,这使得Linux平台上的应用程序移植到Android平台上变得困难
[203]。Google也有某些功能贡献回到Linux内核,特别是一种称为“唤醒锁(wakelocks)”的电源管理功能
[204],它最初被主线内核开发人员拒绝,部分原因是因为他们认为Google并没有表现出维护他们自己代码的任何意图
[205][206]。2008年,Patrick Brady于
Google I/O上演说题为“Anatomy & Physiology of an Android”,并提出Android HAL的架构图。
HAL以*.so扩展名的形式存在,可以把Android框架跟Linux内核隔开,这种中介层的方式使得Android能在移动设备上获得更高的运行效率。这种独特的系统结构受到Linux内核开发者
葛雷格·克罗哈曼及其他核心维护者称赏。Google还在Android的核心中正式加入了自己开发制作的一个名为唤醒锁(wakelocks)的功能,该功能用于管理移动设备的电池性能,但是该功能并没有被加入到Linux内核的主线开放和维护中,因为Linux内核维护者认为Google没有向他们展示这个功能的意图和代码。Google于2010年4月宣布他们将会聘请两名员工跟Linux内核社团合作
[207],但目前Linux内核对于稳定分支维护者的
葛雷格·克罗哈曼,他于2010年12月说他担心Google不再试图让他们的代码更改包含在主流Linux中
[206]。Google的工程师帕特里克·布雷迪(Patrick Brady)曾在该公司的
开发者大会中表示过“Android不是Linux
[208]”,而他在周刊《
电脑世界》补充指“让我替你简化一下,要是没有Linux,这里就没有Android
[209]”。《
Ars Technica》写道:“尽管Android是创建在Linux内核之上的,但该平台与传统的Linux堆栈桌面几乎没有共同之处
[208]。”
2010年2月3日,由于Google在Android核心开发方面和Linux社区方面开发的不同步,Linux内核开发者葛雷格·克罗哈曼把Android的驱动程序从Linux内核“
状态树”(staging tree)上除去。
[210]2010年4月,Google宣布将派遣2名开发人员加入Linux内核社区,以便重返Linux内核。2010年9月,Linux内核开发者Rafael J. Wysocki添加了一个修复程序,使得Android的“wakelocks”可以轻松地与主线Linux内核合并。2011年,
Linus Torvalds说:“Android的核心和Linux的核心将最终回归到一起,但可能不会是4-5年。”在Linux 3.3中大部分代码的集成完成。
[211]
2011年8月,Linux内核最早作者的
林纳斯·托瓦兹说:“Android和Linux最终都会重新回到一个共同的内核,但它可能不会持续4-5年
[212]”。2011年12月,葛雷格·克罗哈曼(Greg Kroah-Hartman)宣布引导Android的主流项目,其目的是要将一些Android
驱动程序、补丁及功能重新放进Linux内核中,从Linux 3.3开始
[213]。经过从前多次的尝试合并后,Linux在3.5内核中,包括自动休眠和唤醒锁功能功能。其界面是相同的,但是上游的Linux实现了容许两种不同的中止模式:存储器(Android使用的传统中止模式)及磁盘(已知桌面上的冬眠)
[214]。Google维护着一个公共代码存储库,包含着他们对Android的
Rebasing到最新稳定的Linux版本的实验工作
[215][216]。
软件堆栈[编辑]
在Linux内核之上,有一些由
C所写的
中间件、
函数库和
应用程序接口,以及运行包含Java兼容库的应用框架上应用程序。Linux内核的开发则继续独立于Android的其他源代码项目。
Android的
C标准库及
Bionic都是由Google专门为Android而开发的软件,作为
BSD标准C程序库代码的推导。Bionic本身已跟特定于Linux内核的几个主要特点而设计。使用Bionic而不是
GNU C函数库(glibc)或
uClibc的主要好处是:它运行时间的足迹较小,以及对低频CPU进行优化。与此同时,Bionic根据BSD许可条款而获得许可,当中Google找到更适合Android的整体许可模式
[229]。
针对不同的许可模式,Google于2012年底将Android中的蓝牙堆栈从GPL许可的
BlueZ转移到Apache许可的BlueDroid
[233]。
自Android Marshmallow发布以来,一系列指令实用程序的“
玩具盒”取代了之前Android版本中类似“
Busybox”系列(当Android于默认情况下不提供
命令行界面时,它主要供应予应用程序使用)
[236]。
Android也有另一个操作系统,名为“Trusty操作系统”,作为“Trusty”当中的一部分,软件组件在移动设备中支持著一个可信运行环境(TEE)。“Trusty和Trusty API是 可调整的......”Trusty OS的应用程序可以由C或C++所编写(C++的支持是有限的),他们可以进入一个小型的C程序库......所有Trusty应用程序都是单线程的;多线程的用户空间目前并不支持......第三方应用程序的开发并非支持当前版本,而操作系统和处理器上使用软件,为“受保护的内容运行
DRM框架”。TEE还有许多其他用途,例如移动支付、银行业的保安、全磁盘加密、多重身份验证,设备重置保护、重播保护的持久性存储、无线显示受保护的内容(强制转换)、安全的PIN和指纹处理,甚至是恶意软件检测
[237]。
开源社区[编辑]
从历史上看,设备制造商及移动运营商通常都不支持第三方固件的开发。制造商对使用非官方软件的设备功能不正常,以及由此产生的支持费用表示担忧
[243]。此外,如CyanogenMod般经修改的固件有时也会提供例如
Tethering等...的功能,否则运营商将收取额外费用。因此,许多设备中常见的技术障碍,包括锁定
引导程序及限制访问root的权限都是常见于许多设备中。然而,随着社区开发的软件越来越受欢迎,
美国国会图书馆馆长在发表声明之后,允许移动设备进行
越狱[244],制造商和运营商经已对第三方开发软件的立场软化,包括
HTC[243]、
摩托罗拉[245]、
三星[246][247]及
索尼[248],他们提供支持和鼓励发展。因此,随着时间的推移,由于越来越多的设备随附着已解锁或可解锁的引导程序,绕过
硬件限制的规避而安装非官方固件的需要降低了,这类似于
Nexus系列手机,虽然他们通常要求用户放弃为设备进行保修
[243]。然而,尽管制造商已经接受,但美国的一些运营商仍然要求手机被锁定,此让开发人员和客户感到沮丧
[249]。
中介软件[编辑]
操作系统与应用程序的沟通桥梁,并用分为两层:函数层和虚拟机。
Bionic是Android改良libc的版本。Android包含了Chrome流览器引擎。Surface flinger是就2D或3D的内容显示到屏幕上。Android使用工具链为Google自制的Bionic Libc。
Android采用OpenCORE作为基础多媒体框架。OpenCORE可分7大块:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。
Android使用Skia为核心图形引擎,搭配OpenGL/ES。Skia与Linux Cairo功能相当,但相较于Linux Cairo,Skia功能还只是阳春型的。2005年Skia公司被Google收购,2007年初,Skia GL源码被公开,目前Skia也是Google Chrome的图形引擎。
Android的多媒体数据库采用SQLite数据库系统。数据库又分为共享数据库及私用数据库。用户可透过ContentProvider类别获取共享数据库。
Android的中间层多以Java实现,4.4版之前使用特殊的Dalvik虚拟机。Dalvik虚拟机是一种“寄存器类型”的Java虚拟机,变量皆存放于寄存器中,虚拟机的指令相对减少。5.0版起改用Android Runtime(ART)。
Dalvik虚拟机可以有多个实例,每个Android应用程序都用一个自属的Dalvik虚拟机来运行,让系统在运行程序时可达到最优化。Dalvik虚拟机并非运行Java字节码,而是运行一种称为.dex格式的文件。
硬件抽像层(HAL)[编辑]
Android的硬件抽像层是能以封闭源码形式提供硬件驱动模块。HAL的目的是为了把Android framework与Linux kernel隔开,让Android不至过度依赖Linux kernel,以达成“内核独立”(kernel independent)的概念,也让Android framework的开发能在不考量驱动程序实现的前提下进行发展,以达到垄断GPU市场的目的。
HAL stub是一种代理人的概念,stub是以*.so档的形式存在。Stub向HAL“提供”操作函数,并由Android runtime向HAL获取stub的操作,再回调这些操作函数。HAL里包含了许多的stub(代理人)。Runtime只要说明“类型”,即module ID,就可以获取操作函数。
编程语言[编辑]
Android是运行于Linux kernel之上,但并不是GNU/Linux。因为在一般GNU/Linux里支持的功能,Android大都没有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic取代Glibc、以Skia取代Cairo、再以OpenCORE取代FFmpeg等等。Android为了达到商业应用,必须移除被GNU GPL授权证所约束的部分,Android并没有用户层驱动(user space driver)这种东西。所有的驱动还是在内核空间中,并以HAL隔开著作权问题。bionic/libc/kernel/ 并非标准的内核头文件(kernel header files)。Android的内核头文件是利用工具由Linux内核的头文件所产生的,这样做是为了保留常量、数据结构与宏。
Android的核心基于Linux,除了核心之外,则是中介层、数据库元和用C/C++编写的API以及应用程序框架。Android的应用程序通常以Java数据库元为基础编写,运行程序时,应用程序的代码会被即时转变为Dalvik dex-code(Dalvik Executable),然后Android操作系统通过使用即时编译的Dalvik虚拟机来将其运行。[331]
目前Android的Linux kernel控制包括安全、存储器管理、进程管理、网络堆栈、驱动程序模型等。下载Android源码之前,先要安装其构建工具Repo来初始化源码。Repo是Android用来辅助Git工作的一个工具。
https://www.cnblogs.com/soultel/p/5449594.html
android从应用到驱动之—camera(1)---程序调用流程
Android内核和驱动篇-Android内核介绍 (转)
https://blog.csdn.net/jmq_0000/article/details/7372783