Android核心库
Android核心库-什么是Android核心库-Android核心库包括哪几部分,有哪些功能?-Android系统API如何实现?-ApiCheck机制的原理-如何使用Android系统自带资源包?Android运行库分为两个部分,分别是Dalvik虚拟机和核心库(Corelibraries)。核心库主要用于提供基本的Java类库的功能,另外,Android官方提供Java语言供应用...
- 什么是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>...</api>
标签之间,作为Android的系统API。其中还包含一些其他的标签,如下表所示
由于数量较多,表中只列举 一些常用的,下面我们 通过一段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描述片段
<class name="Activity" extends="android.view.ContextThemeWrapper" abstract="false" static="false" final="false" deprecated="not deprecated" visibility="public">
<implements name="android.content.ComponentCallbacks"/>
<implements name="android.view.KeyEvent.Callback"/>
<implements name="android.view.LayoutInflater.Factory"/>
<implements name="android.view.View.OnCreateContextMenuListener"/>
<implements name="android.view.Window.Callback"/>
<constructor name="Activity" type="android.app.Activity" static="false" final="false" deprecated="not deprecated" visibility="public"></constructor>
<method name="finish" return="void" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public"></method>
<! 省略部分...>
</class>
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++
语言来编写应用程序。
更多推荐
所有评论(0)