链接:http://blog.chinaunix.net/uid-22028680-id-3178227.html
Android核心库
-什么是Android核心库
-Android核心库包括哪几部分,有哪些功能?
-Android系统API如何实现?
-ApiCheck机制的原理
-如何使用Android系统自带资源包?
Android运行库分为两个部分,分别是Dalvik虚拟机和核心库(Corelibraries)。核心库主要用于提供基本的Java类库的功能,另外,Android官方提供Java语言供应用开发者开发应用。因此,Android向上提供了Android应用框架层,而该框架层则需要Android系统API来提供接口。
Android核心库简介
Android应用程序使用Java语言编写,其大部分Java语言基础功能都由Android核心库提供,比如基础数据结构、数学、I/O、工具、数据库、网络等库。其中大部分实现来源于ApacheHarmony项目,核心库的具体实现位于libcore目录中,Java部分最终会被打包为core.jar包,经过安装,最终将被放置在目标文件系统的system\framework\目录中,当桌面启动时首先加载,作为Java程序的一个基础包。
libcore中的C/C++代码被编译为libjavacore.a静态库,是Java核心库的本地代码。
另外,libcore目录中还包括部分测试用例,用来测试Java核心库的基本接口功能实现,在移植Android或者其虚拟机时,也可以使用它们来测试Java核心库的功能。
核心库主要实现了以下Java基础包:
-Java标准API(java包)
-Java扩展API(javax包)
-企业和组织提供的Java类库(org包)
注意:Android核心库虽然实现了Java标准部分的大部分内容,但也有部分API没有被支持,比如GUI系统的Swing等。
Android系统API
Android系统API是基于Android核心库实现的Android系统应用框架层的API,即Android系统构架图中从上开始的第二层,也就是应用开发人员所使用的android包。Android的每个包都以android开头。
Android包
android包主要负责向Android应用程序开发人员提供可用的API,其实现位于”framework\base\”目录中,其中”framework\base\core\java”包含了大部分API,还有另外一部分API属于Android系统库中的扩展库部分,分别位于:
-framework\base\graphics\java\
-framework\base\media\java\
-framework\base\opengl\java\
-framework\base\wifi\java\
-framework\base\location\java\
…
可以看出,其目录和代码的组织形式都比较类似,各个子目录和文件是根据java包的关系来组织的-文件夹的层次结构表示包和子包,文件名称和Java类的名称一致。比如:android\app\Activity.java对应android.app.activity类。android包的具体实现会通过JNI调用本地C++代码。
Android资源包
在android包中除了系统API之外,还包括了部分资源文件,比如图片、多国语言字符串、布局文件等,它们被统一放置在”framework\base\core\res\”目录中,最终会被编译为framework-res.apk包,放置在目标文件系统的”system\framework\”目录中。
ApiCheck机制
android提供了一个ApiCheck工具,用来验证经过编译生成的SDK的API是否符合标准,即ApiCheck机制。Android对于所有的类和API都分为开放式和不开放式两种,开放式是可供SDK使用的API,反之则为不开放式,也就是我们在源码中看到的加/**} */注解的API,它们都不能被使用。
为了最大限度地保持Android系统的兼容性,ApiCheck机制要求Android代码中所有的API都必须和API描述文件一致,这里所说的描述文件是位于“framework\base\api\”目录中的.xml文件。
打开其中主要的文件current.xml可以看到整个文件的内容都包括在
由于数量较多,表中只列举 一些常用的,下面我们 通过一段API实现代码来分析这些标签的使用,代码清单如下所示为android.app.activity类实现。
Android.app.activity片段
public class Activity extendsContextThemeWrapper implements LayoutInflater.Factory,Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener,ComponentCallbacks {
private static final String TAG =“Activity”;
private static final classManagedCursor {
ManagedCursor(Cursor cursor) {
mCursor = cursor;
mReleased = false;
mUpdated = false;
}
private final Cursor mCursor;
private boolean mReleased;
private boolean mUpdated;
}
public Activity() {
++sInstanceCount;
}
protected void finalize() throwsThrowable {
super.finalize();
--sInstanceCount;
}
protected void onCreate(BundlesavedInstanceState) {
mVisibleFromClient =!mWindow.getWindowStyle().getBoolean(com.android.internal.R.styleable.Window_windowNoDisplay,false);
mCalled = true;
}
protected void onPause() {
mCalled = true;
}
//省略部分...
}
Activity类对应在API描述文件中的内容代码清单如下:
activity类的API描述片段
extends =”android.view.ContextThemeWrapper” abstract = “false” static = “false” final = “false” deprecated = “not deprecated” visibility = “public” > type = “android.app.Activity” static = “false” final = “false” deprecated = “not deprecated” visibility = “public” > return = “void” abstract = “false” native = “false” synchronized = “false” static = “false” final = “false” deprecated = “not deprecated” visibility = “public” >
class标签表明类名是Activity,其中的extends值表示继承自“android.view.ContextThemeWrapper”类;几个implements标签表明需要实现的一些接口,如android.content.ComponentCallbacks等;constructor标签说明构造函数为Activity,类型为android.app.Activity;另外,method标签描述了方法finish及其相关属性。由于篇幅关系,这里不一一介绍每一个标签的功能,该描述文件将在执行makeupdate-api命令时自动生成,但是也需要我们指定被包含的API的路径。这种情况通常用于:当我们加入新的API到Android系统中,如果只使用makeupdate-api命令则无效,需要在build\core\pathmap.mk中将自定义的新API加入进去,再使用更新命令才能生成,如果在一个已有的包中加入新的API,则不需要指定路径,直接使用更新命令即可。
所有的Android系统API和Java标准接口都对应于AndroidSDK中的android.jar文件。
扩展学习
当然,如果不需要使用Android的ApiCheck机制,可以在build\core\tasks\apicheck.mk中将其关闭,只需要注释掉”$(hide)( $(APICHECK) $(4) $(2) $(3) || ($(5); exit38))”即可(如果没有修改过该文件,则位于35行)。注意:这样做可能会引起兼容性问题。
小结
主要介绍了Android的核心库和系统API实现,它们都离不开JNI机制。通过JNI机制可以把底层的C/C++接口暴露给上层的java应用程序框架层,从而使用Android上层可以使用java语言来开发应用程序。各个部分都会存在JNI接口,用来将自身的功能提供给上层的java程序。经过这样依次转换,虽然能够实现跨语言,但是效率难免会受到一定的影响,所以Android官方推出了NDK,使应用开发人员能够直接使用C++语言来编写应用程序。