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>...</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++
語言來編寫應用程式。
相關文章
- Android核心分析Android
- Android 核心剖析Android
- Android Framework核心之旅AndroidFramework
- Android核心和Linux核心的區別AndroidLinux
- Android 學習筆記核心篇Android筆記
- Android核心的編譯與裁剪Android編譯
- _04_java核心類庫2Java
- [譯] Android 核心控制流完整性Android
- Android 核心分析 之八------Android 啟動過程詳解Android
- 深入koa原始碼(二):核心庫原理原始碼
- .NET 開源核心類庫:.NET Core
- 資料中介者 --- 核心思想(java/android)JavaAndroid
- Android資料庫檢視庫---Android-Debug-DatabaseAndroid資料庫Database
- Android工具類庫Android
- 資料庫:系統設計的核心資料庫
- 雲時代資料庫的核心特點資料庫
- 如何獲取 Android CPU 核心數 (Java/C++)AndroidJavaC++
- Android Lottie動畫庫研究Android動畫
- Android資料庫TransactionAndroid資料庫
- Android小知識庫Android
- iOS 開源庫系列 Aspects核心原始碼分析iOS原始碼
- 03-Java核心類庫_多執行緒Java執行緒
- ZStack原始碼剖析之核心庫鑑賞——Defer原始碼
- android版本與linux核心版本對應關係AndroidLinux
- 如何預編譯 Android 模擬器專用核心編譯Android
- Android開發編譯curl庫給Android使用Android編譯
- android 許可權庫EasyPermissionsAndroid
- Android K線圖圖表庫Android
- Android framework中使用stl庫AndroidFramework
- Android 支援庫 v26Android
- Android 資料庫優化Android資料庫優化
- Android中靜態jar庫AndroidJAR
- Android 連線資料庫Android資料庫
- CVE-2015-3636 Android核心 UAF漏洞分析Android
- Ubuntu下Android原始碼以及核心下載與編譯UbuntuAndroid原始碼編譯
- 【轉】編譯Android系統原始碼和核心原始碼編譯Android原始碼
- 核心引數導致的備庫當機分析
- android下java的靜態庫和動態庫AndroidJava