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核心和Linux核心的區別AndroidLinux
- Android 學習筆記核心篇Android筆記
- Android資料庫檢視庫---Android-Debug-DatabaseAndroid資料庫Database
- [譯] Android 核心控制流完整性Android
- Android工具類庫Android
- CVE-2015-3636 Android核心 UAF漏洞分析Android
- _04_java核心類庫2Java
- android版本與linux核心版本對應關係AndroidLinux
- 如何獲取 Android CPU 核心數 (Java/C++)AndroidJavaC++
- Android開發編譯curl庫給Android使用Android編譯
- 深入koa原始碼(二):核心庫原理原始碼
- Android Lottie動畫庫研究Android動畫
- Android 連線資料庫Android資料庫
- android 許可權庫EasyPermissionsAndroid
- 資料庫:系統設計的核心資料庫
- Android除錯資料庫的福音:Android-Debug-DatabaseAndroid除錯資料庫Database
- android下java的靜態庫和動態庫AndroidJava
- [Android]BMPrinter 指紋識別庫Android
- 搬運收藏-Android各種庫Android
- Android動畫曲線庫AndroidEasingFunctionsAndroid動畫IdeaFunction
- Android 中使用 SQLite 資料庫AndroidSQLite資料庫
- Android開源庫的製作Android
- Android K線圖圖表庫Android
- 實用的Android開源庫Android
- Android連線資料庫sqlserverAndroid資料庫SQLServer
- 03-Java核心類庫_多執行緒Java執行緒
- iOS 開源庫系列 Aspects核心原始碼分析iOS原始碼
- Android技術棧(五)核心資料結構原始碼解析Android資料結構原始碼
- Android整合三方瀏覽器之X5核心Android瀏覽器
- android原始碼學習-Handler機制及其六個核心點Android原始碼
- Android Jetpack元件之Lifecycles庫詳解AndroidJetpack元件
- Android 監聽生命週期工具庫Android
- FFmpeg編譯Android使用的so庫編譯Android
- Android•Lottie動畫庫填坑記Android動畫
- Android功能庫初始化管理利器Android
- Android常用開源庫整理彙總Android
- 使用jitPack釋出android開源庫Android
- SnappyDB—Android上的NoSQL資料庫APPAndroidSQL資料庫