上一篇講到稍微寫一個小小的傳感器應用程式,
主要就是透過下列的幾個方法可以實作:
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
Sensor mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
mSensorManager.registerListener(xxx);
這段會稍微講解到一點 Android 服務註冊的盤古開天史,
簡單講就是一般我們系統啟動時,
總是有第一隻起來的程序,
就像之前說的,每一個層級和大架構我們都搞清楚後,
在每一層樓的最後一個人結束後,
就會通知下一層樓的第一個人要開始作第一件事,
你可以想成 Boot Loader 啟動 Kernel 後,
Kernel 又啟動了 Android 層的 init.rc
和 zygote
,
這個 init.rc
就是我們所指 Android 樓層的第一個人。
Android 啟動流程我就不多作解釋了,
其實 Sensor 註冊過程和 NFC 相當類似,
也是透過 SystemSensorManager
繼承了 SensorManager
來實現註冊的過程:
frameworks/base/core/java/android/app/SystemServiceRegistry.java
171 final class SystemServiceRegistry {
172 private static final String TAG = "SystemServiceRegistry";
... ...
182 // Not instantiable.
183 private SystemServiceRegistry() { }
184
185 static {
... ...
452 registerService(Context.SENSOR_SERVICE, **SensorManager.class**,
453 new CachedServiceFetcher<SensorManager>() {
454 @Override
455 public **SensorManager** createService(ContextImpl ctx) {
456 return new **SystemSensorManager**(ctx.getOuterContext(),
457 ctx.mMainThread.getHandler().getLooper());
458 }});
... ...
而上面我們又看到 SystemSensorManager
是在 SystemServiceRegistery
靜態初始化區塊中,
因此在系統初始階段加載 SystemServiceRegistry
時,SystemSensorManager
就會被創建,來看一下它的構造函數:
frameworks/base/core/java/android/hardware/SystemSensorManager.java
103 public SystemSensorManager(Context context, Looper mainLooper) {
104 synchronized (sLock) {
105 if (!sNativeClassInited) {
106 sNativeClassInited = true;
**//獲取FieldID和MethodID,存gSensorOffsets中.為後續JNI的get/set做準備**
107 nativeClassInit();
108 }
109 }
110
111 mMainLooper = mainLooper;
112 mTargetSdkLevel = context.getApplicationInfo().targetSdkVersion;
113 mContext = context;
**//創建Native層的SensorManager**
114 mNativeInstance = **nativeCreate**(context.getOpPackageName());
115
116 // initialize the sensor list
**//通過Native層的SensorManager的getSensorList方法,初始化傳感器列表,
//並填充到mFullSensorsList當中.建立sensor和handle之間的映射,存放在mHandleToSensor中**
117 for (int index = 0;; ++index) {
118 Sensor sensor = new Sensor();
**//將Native層的sensor,通過JNI返回到Java層**
119 if (!nativeGetSensorAtIndex(mNativeInstance, sensor, index)) break;
120 mFullSensorsList.add(sensor);
121 mHandleToSensor.put(sensor.getHandle(), sensor);
122 }
123 }
調用 nativeCreate
創建 Native 層的 SensorManager
,
在創建過程中會循環等待 SensorService
被創建,
和它建立 binder 關係。
接著調用 SensorSerivce
的 getSensorList
,
來獲取硬件傳感器列表信息:
frameworks/base/core/jni/android_hardware_SensorManager.cpp
145 static jlong
146 **nativeCreate**
147 (JNIEnv *env, jclass clazz, jstring opPackageName)
148 {
149 ScopedUtfChars opPackageNameUtf(env, opPackageName);
150 return (jlong) &**SensorManager**::**getInstanceForPackage**(String16(opPackageNameUtf.c_str()));
151 }
frameworks/native/libs/sensor/SensorManager.cpp
45 SensorManager& SensorManager::getInstanceForPackage(const String16& packageName) {
46 waitForSensorService(nullptr);
47
48 Mutex::Autolock _l(sLock);
49 SensorManager* sensorManager;
50 auto iterator = sPackageInstances.find(packageName);
51
52 if (iterator != sPackageInstances.end()) {
53 sensorManager = iterator->second;
54 } else {
55 String16 opPackageName = packageName;
56
... ...
**//創建Native層sensorManager,接著看SensorManager的構造函數**
79 sensorManager = new SensorManager(opPackageName);
80
... ...
88 // Stash the per package sensor manager.
89 sPackageInstances.insert(std::make_pair(opPackageName, sensorManager));
90 }
91
92 return *sensorManager;
93 }
frameworks/native/libs/sensor/SensorManager.cpp
95 SensorManager::SensorManager(const String16& opPackageName)
96 : mSensorList(0), mOpPackageName(opPackageName), mDirectConnectionHandle(1) {
97 // okay we're not locked here, but it's not needed during construction
98 **assertStateLocked**();
99 }
frameworks/native/libs/sensor/SensorManager.cpp
135 status_t SensorManager::assertStateLocked() {
136 bool initSensorManager = false;
137 if (mSensorServer == NULL) {
138 initSensorManager = true;
139 } else {
140 // Ping binder to check if sensorservice is alive.
141 status_t err = IInterface::asBinder(mSensorServer)->pingBinder();
142 if (err != NO_ERROR) {
143 initSensorManager = true;
144 }
145 }
146 if (initSensorManager) {
147 **waitForSensorService**(&mSensorServer);
148 LOG_ALWAYS_FATAL_IF(mSensorServer == nullptr, "getService(SensorService) NULL");
149
... ...
frameworks/native/libs/sensor/SensorManager.cpp
105 status_t SensorManager::waitForSensorService(sp<ISensorServer> *server) {
106 // try for 300 seconds (60*5(getService() tries for 5 seconds)) before giving up ...
107 sp<ISensorServer> s;
**//等待获取Native层的SensorService被注册,超时时间300s**
108 const String16 name("sensorservice");
109 for (int i = 0; i < 60; i++) {
110 status_t err = getService(name, &s);
111 switch (err) {
112 case NAME_NOT_FOUND:
113 sleep(1);
114 continue;
115 case NO_ERROR:
116 if (server != nullptr) {
117 *server = s;
118 }
119 return NO_ERROR;
120 default:
121 return err;
122 }
123 }
124 return TIMED_OUT;
125 }
再跳回原來的位置:
frameworks/native/libs/sensor/SensorManager.cpp
135 status_t SensorManager::assertStateLocked() {
... ...
**//看看SensorManager有沒有bind成功或是服務死了的後續處理**
150 class DeathObserver : public IBinder::DeathRecipient {
151 SensorManager& mSensorManager;
152 virtual void binderDied(const wp<IBinder>& who) {
153 ALOGW("sensorservice died [%p]", who.unsafe_get());
154 mSensorManager.sensorManagerDied();
155 }
156 public:
157 explicit DeathObserver(SensorManager& mgr) : mSensorManager(mgr) { }
158 };
159
160 mDeathObserver = new DeathObserver(*const_cast<SensorManager *>(this));
161 IInterface::asBinder(mSensorServer)->linkToDeath(mDeathObserver);
162
**//通過SensorServer獲取傳感器列表**
163 mSensors = mSensorServer->getSensorList(mOpPackageName);
164 size_t count = mSensors.size();
165 mSensorList =
166 static_cast<Sensor const**>(malloc(count * sizeof(Sensor*)));
167 LOG_ALWAYS_FATAL_IF(mSensorList == NULL, "mSensorList NULL");
168
**//將傳感器列表存入SensorManager的mSensorList中**
169 for (size_t i=0 ; i<count ; i++) {
170 mSensorList[i] = mSensors.array() + i;
171 }
172 }
173
174 return NO_ERROR;
175 }
上面 SensorManager
會等待 SensorService
註冊,
將它保存在成員變量 mSensorServer
中。
小結一下這一段流程的 UML 圖:
SensorManager
功能都來自於 SensorService
,
它在 Android 的 Sensor 框架中佔據核心位置。
接下來分析一下 SensorService
的相關代碼:
當內核啟動後執行 init 程序,
該程序解析 init.rc
文件 (zygote 包含在 init.${ro.zygote}.rc
中),
rc 文件中指定的應用程序在 app_main.cpp
中,
調用 AndroidRuntime 的 start
方法,
接著通過 JNI 調用 Zyoteinit.java
中的 main
函數,
下一篇從這裡開始追踪。
https://blog.csdn.net/dabenxiong666/article/details/80726022