雖然Java層Binder系統是Native層Binder系統的一個Mirror,但這個Mirror終歸還需借助Native層Binder系統來開展工作,即Mirror和Native層Binder有著千絲萬縷的關系,一定要在Java層Binder正式工作之前建立這種關系。下面分析Java層Binder框架是如何初始化的。
在Android系統中,在Java初創時期,系統會提前注冊一些JNI函數,其中有一個函數專門負責搭建Java Binder和Native Binder交互關系,該函數是register_android_os_Binder,代碼如下:
**android_util_Binder.cpp**
~~~
int register_android_os_Binder(JNIEnv* env)
{
//初始化Java Binder類和Native層的關系
if(int_register_android_os_Binder(env) < 0)
return -1;
//初始化Java BinderInternal類和Native層的關系
if(int_register_android_os_BinderInternal(env) < 0)
return -1;
//初始化Java BinderProxy類和Native層的關系
if(int_register_android_os_BinderProxy(env) < 0)
return -1;
//初始化Java Parcel類和Native層的關系
if(int_register_android_os_Parcel(env) < 0)
return -1;
return0;
}
~~~
據上面的代碼可知,register_android_os_Binder函數完成了Java Binder架構中最重要的4個類的初始化工作。我們重點關注前3個。
1. Binder類的初始化
int_register_android_os_Binder函數完成了Binder類的初始化工作,代碼如下:
**android_util_Binder.cpp**
~~~
static int int_register_android_os_Binder(JNIEnv*env)
{
jclassclazz;
//kBinderPathName為Java層中Binder類的全路徑名,“android/os/Binder“
clazz =env->FindClass(kBinderPathName);
/*
gBinderOffSets是一個靜態類對象,它專門保存Binder類的一些在JNI層中使用的信息,
如成員函數execTranscat的methodID,Binder類中成員mObject的fildID
*/
gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
gBinderOffsets.mExecTransact
= env->GetMethodID(clazz,"execTransact", "(IIII)Z");
gBinderOffsets.mObject
= env->GetFieldID(clazz,"mObject", "I");
//注冊Binder類中native函數的實現
returnAndroidRuntime::registerNativeMethods(
env, kBinderPathName,
gBinderMethods,NELEM(gBinderMethods));
}
~~~
從上面代碼可知,gBinderOffsets對象保存了和Binder類相關的某些在JNI層中使用的信息。
* * * * *
**建議** 如果讀者對JNI不是很清楚,可參閱卷I第2章“深入理解JNI”。
* * * * *
2. BinderInternal類的初始化
下一個初始化的類是BinderInternal,其代碼在int_register_android_os_BinderInternal函數中。
**android_util_Binder.cpp**
~~~
static intint_register_android_os_BinderInternal(JNIEnv* env)
{
jclass clazz;
//根據BinderInternal的全路徑名找到代表該類的jclass對象。全路徑名為
// “com/android/internal/os/BinderInternal”
clazz =env->FindClass(kBinderInternalPathName);
//gBinderInternalOffsets也是一個靜態對象,用來保存BinderInternal類的一些信息
gBinderInternalOffsets.mClass = (jclass)env->NewGlobalRef(clazz);
//獲取forceBinderGc的methodID
gBinderInternalOffsets.mForceGc
= env->GetStaticMethodID(clazz,"forceBinderGc", "()V");
//注冊BinderInternal類中native函數的實現
return AndroidRuntime::registerNativeMethods(
env,kBinderInternalPathName,
gBinderInternalMethods, NELEM(gBinderInternalMethods));
}
~~~
int_register_android_os_BinderInternal的工作內容和int_register_android_os_Binder的工作內容類似:
- 獲取一些有用的methodID和fieldID。這表明JNI層一定會向上調用Java層的函數。
- 注冊相關類中native函數的實現。
3. BinderProxy類的初始化
int_register_android_os_BinderProxy完成了BinderProxy類的初始化工作,代碼稍顯復雜,如下所示:
**android_util_Binder.cpp**
~~~
static intint_register_android_os_BinderProxy(JNIEnv* env)
{
jclassclazz;
clazz =env->FindClass("java/lang/ref/WeakReference");
//gWeakReferenceOffsets用來和WeakReference類打交道
gWeakReferenceOffsets.mClass = (jclass)env->NewGlobalRef(clazz);
//獲取WeakReference類get函數的MethodID
gWeakReferenceOffsets.mGet= env->GetMethodID(clazz, "get",
"()Ljava/lang/Object;");
clazz = env->FindClass("java/lang/Error");
//gErrorOffsets用來和Error類打交道
gErrorOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
clazz =env->FindClass(kBinderProxyPathName);
//gBinderProxyOffsets用來和BinderProxy類打交道
gBinderProxyOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
gBinderProxyOffsets.mConstructor= env->GetMethodID(clazz,"<init>", "()V");
...... //獲取BinderProxy的一些信息
clazz =env->FindClass("java/lang/Class");
//gClassOffsets用來和Class類打交道
gClassOffsets.mGetName=env->GetMethodID(clazz,
"getName","()Ljava/lang/String;");
//注冊BinderProxy native函數的實現
returnAndroidRuntime::registerNativeMethods(env,
kBinderProxyPathName,gBinderProxyMethods,
NELEM(gBinderProxyMethods));
}
~~~
據上面代碼可知,int_register_android_os_BinderProxy函數除了初始化BinderProxy類外,還獲取了WeakReference類和Error類的一些信息。看來BinderProxy對象的生命周期會委托WeakReference來管理,難怪JNI層會獲取該類get函數的MethodID。
至此,Java Binder幾個重要成員的初始化已完成,同時在代碼中定義了幾個全局靜態對象,分別是gBinderOffsets、gBinderInternalOffsets和gBinderProxyOffsets。
這幾個對象的命名中都有一個Offsets,我覺得這非常別扭,不知道讀者是否有同感。
框架的初始化其實就是提前獲取一些JNI層的使用信息,如類成員函數的MethodID,類成員變量的fieldID等。這項工作是必需的,因為它能節省每次使用時獲取這些信息的時間。當Binder調用頻繁時,這些時間累積起來還是不容小覷的。
下面我們通過一個例子來分析Java Binder的工作流程。
- 前言
- 第1章 搭建Android源碼工作環境
- 1.1 Android系統架構
- 1.2 搭建開發環境
- 1.2.1 下載源碼
- 1.2.2 編譯源碼
- 1.2.3 利用Eclipse調試system_process
- 1.3 本章小結
- 第2章 深入理解Java Binder和MessageQueue
- 2.1 概述
- 2.2 Java層中的Binder架構分析
- 2.2.1 Binder架構總覽
- 2.2.2 初始化Java層Binder框架
- 2.2.3 addService實例分析
- 2.2.4 Java層Binder架構總結
- 2.3 心系兩界的MessageQueue
- 2.3.1 MessageQueue的創建
- 2.3.2 提取消息
- 2.3.3 nativePollOnce函數分析
- 2.3.4 MessageQueue總結
- 2.4 本章小結
- 第3章 深入理解SystemServer
- 3.1 概述
- 3.2 SystemServer分析
- 3.2.1 main函數分析
- 3.2.2 Service群英會
- 3.3 EntropyService分析
- 3.4 DropBoxManagerService分析
- 3.4.1 DBMS構造函數分析
- 3.4.2 dropbox日志文件的添加
- 3.4.3 DBMS和settings數據庫
- 3.5 DiskStatsService和DeviceStorageMonitorService分析
- 3.5.1 DiskStatsService分析
- 3.5.2 DeviceStorageManagerService分析
- 3.6 SamplingProfilerService分析
- 3.6.1 SamplingProfilerService構造函數分析
- 3.6.2 SamplingProfilerIntegration分析
- 3.7 ClipboardService分析
- 3.7.1 復制數據到剪貼板
- 3.7.2 從剪切板粘貼數據
- 3.7.3 CBS中的權限管理
- 3.8 本章小結
- 第4章 深入理解PackageManagerService
- 4.1 概述
- 4.2 初識PackageManagerService
- 4.3 PKMS的main函數分析
- 4.3.1 構造函數分析之前期準備工作
- 4.3.2 構造函數分析之掃描Package
- 4.3.3 構造函數分析之掃尾工作
- 4.3.4 PKMS構造函數總結
- 4.4 APK Installation分析
- 4.4.1 adb install分析
- 4.4.2 pm分析
- 4.4.3 installPackageWithVerification函數分析
- 4.4.4 APK 安裝流程總結
- 4.4.5 Verification介紹
- 4.5 queryIntentActivities分析
- 4.5.1 Intent及IntentFilter介紹
- 4.5.2 Activity信息的管理
- 4.5.3 Intent 匹配查詢分析
- 4.5.4 queryIntentActivities總結
- 4.6 installd及UserManager介紹
- 4.6.1 installd介紹
- 4.6.2 UserManager介紹
- 4.7 本章學習指導
- 4.8 本章小結
- 第5章 深入理解PowerManagerService
- 5.1 概述
- 5.2 初識PowerManagerService
- 5.2.1 PMS構造函數分析
- 5.2.2 init分析
- 5.2.3 systemReady分析
- 5.2.4 BootComplete處理
- 5.2.5 初識PowerManagerService總結
- 5.3 PMS WakeLock分析
- 5.3.1 WakeLock客戶端分析
- 5.3.2 PMS acquireWakeLock分析
- 5.3.3 Power類及LightService類介紹
- 5.3.4 WakeLock總結
- 5.4 userActivity及Power按鍵處理分析
- 5.4.1 userActivity分析
- 5.4.2 Power按鍵處理分析
- 5.5 BatteryService及BatteryStatsService分析
- 5.5.1 BatteryService分析
- 5.5.2 BatteryStatsService分析
- 5.5.3 BatteryService及BatteryStatsService總結
- 5.6 本章學習指導
- 5.7 本章小結
- 第6章 深入理解ActivityManagerService
- 6.1 概述
- 6.2 初識ActivityManagerService
- 6.2.1 ActivityManagerService的main函數分析
- 6.2.2 AMS的 setSystemProcess分析
- 6.2.3 AMS的 installSystemProviders函數分析
- 6.2.4 AMS的 systemReady分析
- 6.2.5 初識ActivityManagerService總結
- 6.3 startActivity分析
- 6.3.1 從am說起
- 6.3.2 AMS的startActivityAndWait函數分析
- 6.3.3 startActivityLocked分析
- 6.4 Broadcast和BroadcastReceiver分析
- 6.4.1 registerReceiver流程分析
- 6.4.2 sendBroadcast流程分析
- 6.4.3 BROADCAST_INTENT_MSG消息處理函數
- 6.4.4 應用進程處理廣播分析
- 6.4.5 廣播處理總結
- 6.5 startService之按圖索驥
- 6.5.1 Service知識介紹
- 6.5.2 startService流程圖
- 6.6 AMS中的進程管理
- 6.6.1 Linux進程管理介紹
- 6.6.2 關于Android中的進程管理的介紹
- 6.6.3 AMS進程管理函數分析
- 6.6.4 AMS進程管理總結
- 6.7 App的 Crash處理
- 6.7.1 應用進程的Crash處理
- 6.7.2 AMS的handleApplicationCrash分析
- 6.7.3 AppDeathRecipient binderDied分析
- 6.7.4 App的Crash處理總結
- 6.8 本章學習指導
- 6.9 本章小結
- 第7章 深入理解ContentProvider
- 7.1 概述
- 7.2 MediaProvider的啟動及創建
- 7.2.1 Context的getContentResolver函數分析
- 7.2.2 MediaStore.Image.Media的query函數分析
- 7.2.3 MediaProvider的啟動及創建總結
- 7.3 SQLite創建數據庫分析
- 7.3.1 SQLite及SQLiteDatabase家族
- 7.3.2 MediaProvider創建數據庫分析
- 7.3.3 SQLiteDatabase創建數據庫的分析總結
- 7.4 Cursor 的query函數的實現分析
- 7.4.1 提取query關鍵點
- 7.4.2 MediaProvider 的query分析
- 7.4.3 query關鍵點分析
- 7.4.4 Cursor query實現分析總結
- 7.5 Cursor close函數實現分析
- 7.5.1 客戶端close的分析
- 7.5.2 服務端close的分析
- 7.5.3 finalize函數分析
- 7.5.4 Cursor close函數總結
- 7.6 ContentResolver openAssetFileDescriptor函數分析
- 7.6.1 openAssetFileDescriptor之客戶端調用分析
- 7.6.2 ContentProvider的 openTypedAssetFile函數分析
- 7.6.3 跨進程傳遞文件描述符的探討
- 7.6.4 openAssetFileDescriptor函數分析總結
- 7.7 本章學習指導
- 7.8 本章小結
- 第8章 深入理解ContentService和AccountManagerService
- 8.1 概述
- 8.2 數據更新通知機制分析
- 8.2.1 初識ContentService
- 8.2.2 ContentResovler 的registerContentObserver分析
- 8.2.3 ContentResolver的 notifyChange分析
- 8.2.4 數據更新通知機制總結和深入探討
- 8.3 AccountManagerService分析
- 8.3.1 初識AccountManagerService
- 8.3.2 AccountManager addAccount分析
- 8.3.3 AccountManagerService的分析總結
- 8.4 數據同步管理SyncManager分析
- 8.4.1 初識SyncManager
- 8.4.2 ContentResolver 的requestSync分析
- 8.4.3 數據同步管理SyncManager分析總結
- 8.5 本章學習指導
- 8.6 本章小結