简略地说,Android体系可以分为四层架构,五块区域。
接下来,讲解下这四块区域的分工。附带,我们以一款Flappy Bird的游戏例子,来简单说明下各层工作。
1. Linux内核层
Android系统是基于Linux内核的,不同版本的Android基于的Linux版本也不同。因而,会发现Bash指令有些在低版本的Android系统控制台找不到,这是因为Linux内核版本不够高。
Linux内核层主要负责为Android设备的硬件提供底层驱动,让硬件设备能够成功挂载识别。常用的如显示驱动、音频驱动、蓝牙驱动、照相机驱动等等。
Flappy Bird用到显示、音乐、Wifi都对应了相应的底层PCB硬件(颗粒电子屏,喇叭,网卡),这些需要被Linux内核层识别出device Id才能够正常访问使用。而相应驱动程序就完成了这些硬件设备的挂载使用。
2. 系统运行库层
这一层主要分为静态库和运行库两块区域。
静态库通过C/C++库为Android系统提供主要的特性支持。例如,SQLite库提供数据库支持,OpenGL/ES库提供3D绘图支持,WebKit库提供浏览器内核支持。
Android运行时库,包含了Dalvik虚拟机(不是传统Java用的Hotspot虚拟机),提供了一些核心库。相较于传统Java虚拟机,Dalvik虚拟机是专为移动设备定制的Java虚拟机,针对手机内存、CPU性能有限的情况做了优化处理。
无可避免的是,光写驱动并不能关联Flappy Bird游戏和硬件设备。比如音频,我们要用到AudioTrack,我们要有相应读写操作,完成这个关联。
... ...
private native final void native_finalize();
public native final void native_release();
private native final void native_start();
private native final void native_stop();
private native final void native_pause();
private native final void native_flush();
private native final int native_write_byte(byte[] audioData, int offsetInBytes, int sizeInBytes, int format, boolean isBlocking);
private native final int native_write_short(short[] audioData, int offsetInShorts, int sizeInShorts, int format, boolean isBlocking);
private native final int native_write_float(float[] audioData, int offsetInFloats, int sizeInFloats, int format, boolean isBlocking);
毫无疑问,一方面这些函数都要靠C/C++实现,构成了Android运行库。在写这些函数时难免会有:
#include <iostream>
using namespace std;
inline int call( ){
static int ctr =1;
return ctr++;
}
int main(){
for(int i=0; i<500; i++)
cout<<call()<<" "<<endl;
}
iostream就是该层用到的静态库。
3. 应用框架层
这一层,我们也叫Framework层,提供了构建移动应用用到的API。Android应用开发就是负责使用这些API来构建自己的应用程序。
Flappy Bird用到的AudioTrack肯定不关心C/C++实现,Framework层隐去了运行库实现。看到的都是正常的Java API,但Java API 内部调用的还是C/C++写的native方法。比如startImpl( )这个Java方法,本质上还是调用C/C++写就的native_start( )。
... ...
public void play( ){
final int delay = getStartDelayMS( ); //AudioTrack继承父类计算播放时延方法
if(delay == 0){
startImpl();
}
else{
new Thread( ){
public void run( ){
Thread.sleep(delay); //播放器player启动,audioMedia还未输入,推迟启动
baseSetStartDelayMS(0);
startImpl();
}
}
}
}
private void startImpl( ){
synchronized(mPlayStateLock){
baseStart( );
native_start();
mPlayState = PLAYSTATE_PLAYING;
}
}
... ...
4. 应用层
所有安装在手机上的apk都属于这一层。需要注意的是,电话、联系人、相册都是系统自带的apk,也是应用。
调用完应用框架层的API,这一层自身也包含作者自己的写的业务逻辑。Flappy Bird应用就完成了。