android学习计划
最近被安排到android项目组中,从事起了android方面的开发。话说android上,也只是以前在它的应用之上去写一些小程序玩玩而已。还真没想到有一天,我也要从事这方面的开发。世事难料,但这也是一次成长的机会,从初期开始,这是一个很大的挑战。这个小团队对android全都不了解,我们开始的探索之旅。希望在接下来的时候里,我可以在这里记录下我的学习过程。
对于android的产品开发,有些不仅仅是对其上面的应用层做java上的开发,有很多东西android底层是无法实现给我们的需求。在这情况下,我们需要去适配,去添加实现等等的方式来解决自己碰到的问题。
已经开始这方面的探索三个星期左右了,是时候把自己的探索总结出来了。平时都写在公司内网上,也无法拷贝出来,现在努力在这里把自己的学习记录下来。
一、android框架概述
图1 android系统框架图
这是android的系统框架图,从这上面可以看动,android的系统结构分成了四层,由底向上分别为内核层、运行库层、应用框架层、应用层。
内核层:主要还是标准的linux,这里面android对其自身特有的一些硬件又做了相应的驱动开发,并把驱动抽象到了一个android HAL层(硬件抽象层)。致于为何这样做,有这样的一个说法是若是直接在linux内核上进行开发,需要遵守linux的开源策略,这对很多厂家来说,涉及到了商业秘密的问题。
系统运行库层:系统运行库层,主要是由C和C++语言开发,实现了系统接口调用和其他的运行模块。在这里面如libc实现的并不像平时的linux下的glibc,而是由android自己开发的一个llibc,称为bionic,只有200多k,运行速率明显比glibc实现的来得快多了。但这也就成了我工作一大困难点,因为在这里,libc是原有glibc下有所裁剪,有些功能不实现,如IPC上的接口,消息发送接口,及内存共享接口等没有接供,这让原本linux下源码中依赖这些ipc机制接口的代码移植碰到了一个问题,如何去解决这个问题,是对程序移植的一大挑战。
在运行库层中,还包含着如下:
Surface Manager:对应用层的显示子系统的管理,为应用层提供2D和3D的无疑的融合;
Media Framework:可以支持多种格式的音频和视频的录制和回放,包含对静态图像的读取;
Sqlite: 强大的轻量级的数据库引擎,这是第三方的支持,许多数据库都是以这个Sqlite来作为数据库引擎的,大小大概有500K左右;
OpenGL|ES:实现3D图像的硬件加速,及优化后的软加速;
FreeType:其于位图和矢量图形的字体支持;
WebKit: 功能强大的浏览器引擎,许多主流的浏览器也是基于该引擎的,如chrome,支持android浏览器,并支持内嵌的web视图。
SGL: 底层的2D图形引擎;
SSL:为网络通信提供安全及数据完整性的一种安全协议;
libc : 如一开始提到的,android开发的bionic,提供标准的系统C调用。
另外,在这里,还包含着core libraries和Davik虚拟机,corelibraries提供java的核心库,Davik虚拟机与Java的JVM不同在于,JVM是基于堆栈的,而Davik是基于寄存器,至于两者哪个好哪个坏,业界是一个争论的话题。
应用框架层:这里面,实现了对底层C/C++的调用封装,android为开发都提供了基本的应用接口,是java实现的,java调用底层的C/C++则是通过JNI机制来实现。在这里,好的应用框架开发,可以给上层的应用调用提供更好的帮助。
应用层:用户最直接感受到的一层,这里面实现了与用户交互的过程,不管从界面UI,或是功能上,都与用户相关系,这个好坏决定着用户对产品的认可底。否则,底层封装得再好,也没有用。
二、下一步的学习计划
在最近的三周下来,从一开始的下载android源码,到对它的编译过程、目录结构、添加C程序运行模块的学习,还有原有linux下的程序可移植性的分析。多多少少积累了一些,在接下来的日子里,我要把这些陆陆续续的总结到这上面。
下面列一下我做准备的主题:
1、android源码下载及开发环境的搭建
2、android编译过程的分析
3、如何在android源码上的运行库层,添加自己的静态库&动态库,包括可执行文件
4、如何解决在android的libc上不支持IPC的问题。(总结下之前做的一个linux环境下库的可移植性的分析过程)
5、分析Binder机制(android对IPC的实现方式是binder机制)
6、分析android中的JNI实现机制,并从源码中找一些相关的模块例子分析。
总结:
android源码的分析,碰到了许多的问题,但每次解决一个问题都是一次成长。在这个过程中,记录下问题就是一种成长。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。