到公司入职了快两个月了。前一个月全是在公共培训,其中有半个月还到某个子公司(手机生产工厂)去实习,体验了生产最前线人民的平常生活……html
8 月开始才正式分配到软件中心的工位上,而后又开始了新一轮的内部培训,培训的内容大概就是一些 Git 的使用,软件测试那边的一些知识,还有缺陷跟踪系统好比 JIRA 的使用规范等等。这里值得吐槽一下的就是这些操做性的东西竟然还要背下来考试……考试完了之后,咱们新来的又被放养了几天,而后才分到了具体的小组来。java
而我分到了影像部,就是专门作 Android Camera 这方面项目的部门,具体的组是其中的框架组。因而从未接触 Android 方面知识的我便开始了漫长的 Android 开发学习之旅……android
根据导师所介绍,小组的主要业务关注的是 Android Camera 架构中的 Frameworks
层。其实当时我是蒙比的,由于没看过 Android 系统的结构。因而导师让我先花点时间把 Android System 架构了解了解,而后再去熟悉 Camera 的整个流程。架构
花了大概一个多星期的时间,我才对 Camera 的整个控制流以及数据流有了一个比较清晰的了解。因为业务上的须要,我如今所了解的主要是 Camera API 1
的主要流程,而 API 2
最近也开始扩大使用的范围了,因此在整理好 API 1
的内容后,我还会继续跟进学习并整理 API 2
的内容。框架
在学习 Camera 框架以前,最基本的知识点应该就是 Android 的基本框架了。ide
这方面的内容我主要参考学习了这些文章:
Android 系统四层体系结构详解
Android 平台架构
以及参考了《Android 系统源代码情景分析(修订版)》的内容。
固然还有其它零零散散的一些文章,不过内容大同小异。函数
首先有一个很经典的架构图:
学习
在我看的每一篇关于 Android 系统架构介绍的文章中,都少不了这张图,或者这张图的变种。测试
从图中能够很清楚得看出,整个架构能够分为五大层次:ui
系统应用层
,这一层中都是咱们使用手机时都会直接接触到的各类应用。Java 接口框架层
,这一层是为了上层应用提供各类接口。原生 C/C++ 库
,安卓运行时环境
。这一层中,C/C++ 库集成了许多诸如 OpenGL ES
这样的开源库,提供了不少封装好的方法。而运行时环境则是与一些核心库、Dalvik Virtual Machine
相关的东西,这方面暂时还没多少了解。硬件抽象层
,它主要是在 Framework 层和 Linux Kernel 层之间起到一个连接做用。Linux 内核层
,整个 Android 系统其实是基于 Linux 的内核搭建起来的。Java
编写的核心程序包(Home,Phone,Browser...)
。JNI (Java 原生接口)
来完成本身的业务逻辑。JNI
开发原生应用程序,须要与 Android NDK
配合,NDK
使得 Java
能够与 C/C++
进行交互。API
框架。API
不是万能的,开发者经常须要本身一些 API
以实现本身的业务逻辑,这时候咱们就能够经过调用 C/C++ 本地库
的接口来进行个性化设计。C/C++ 库
(第三方库)是独立于 Android 系统架构
实现的,可是它与系统架构处于相同的地位:
Linux 内核层
提供服务,实现、封装模块,以供应用层调用。Dalvik
虚拟机:
DVM
代替了 JVM
,“.java”
文件编译为“.class”
文件后,再编译获得“.dex”
程序,最后又打包成为 Android 可执行文件“.apk”
。DVM
为它分配自有实例。Dalvik
的好处是,使得一台设备能够运行多个虚拟机程序,而且消耗比较少的资源。Linux 内核源码
遵循 GPL 协议
,基于它所修改的源码须要彻底公开,若是设备厂商经过修改内核源码来提供服务,就须要公开对应的代码,这就暴露了不少硬件相关的参数和实现的细节。商业利益
,在 Android 架构
中提供一个硬件抽象层给设备厂商对硬件作出具体实现,而 Linux 内核仅提供简单的硬件访问通道
。因为 Android 源码
遵循商业友好的Apache License 协议
,这样设备厂商的利益就获得了保障。Linux 内核
开发的(官方给出的例子是,Android Runtime (ART)
依靠 Linux 内核来执行底层功能,例如线程和底层内存管理
)。Linux 内核驱动
部分,在 Camera 流程
中,咱们的控制指令最终要经过内核驱动发送给 Camera 设备
,同时也要经过它对设备返回的数据向上传输。YAFFS2(Yet Another Flash File System, 2nd edition)
文件系统。(这个系统没有去深刻了解)IPC Binder
,经过 Binder
,可使不一样进程能够访问同一块共享内存。Binder 机制在整个 Camera 流程中起到了十分重要的做用,它主要使用在 CameraClient
与 CameraServer
的交互中(Camera 架构中,采用了一个 C/S 交互
的流程,在以后的学习中会有比较深刻的了解)。到这里,我对 Android 框架就有了一个基本的认识。
从下到上,其实是一个逐层封装的过程。在以往的开发中,我所接触到的每每都是上层的接口,实际上它们的内部有许多复杂的实现机制我并无去探究过,正所谓“知其然,而不知其因此然”,这也许是个人实际开发能力老是没法有突破性的进步的缘由之一。
经过一个多星期对源码的追溯学习,我开始尝试去探索学习从上层到底层的实现机制。固然这个过程仍是挺痛苦的,Android 的源码虽然有大量清楚的注释,可是忽然去阅读大量具备关联性的代码,时常仍是会迷失方向,特别是在 C/C++
的部分,各类函数指针
常常不知道指到哪里去了,找了半天找不到,还把以前的一部份内容跟丢了……
废话说得有点多了…下一篇就先整理一下 Camera 的大致框架好了。