• 什么是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++语言来编写应用程序。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐