錯誤歸因 以及Android AIDL
錯誤歸因是一種人常犯的錯誤。
比如A事件和B事件同時發生造成了C結果,但當事者誤認C結果為A事件所造成,其實是B。
--
唉,
工作上我常出現這樣的問題 :(
該好好檢討,
所謂的鬼打牆,就是因為錯誤歸因先起了個頭,
而自己一開始完全搞懂,就會走到錯誤的路上。
--
由於在某個已確定的檔案裡面找不到,就覺得應該是發錯 KeyEvent
然後在自己覺得問題所在的地方放Log檢查
結果什麼都沒得到,
於是覺得是不同層級的問題,
應該不是framework 而是再往下
於是找阿找 去追可能的路徑
推測如下:
EventHub.cpp
負責設定property
KeyCharacterMap.cpp
來load *kcm
KeyCharacterMap.java
這裡負責來抓keycode 以建立keymap
(會先確認device -> 找keycode ->)
KeyEvent.java
根據keymap 發keyevent
--
總之,心裡就想,那我應該要
1. 幫寫一個kcm
2. 找keycode 定義
3. 幫他加一個對應event
4. 接著在policy定義要做的行為
--
但是,走了這一段路之後,
發現要找的東西,不在那個檔案,而是在隔壁 ....
唉 所以一步錯步步錯 @@
--
因為用grep找關鍵字
我先找到了 xxxManager.java
就覺得是這裡了!
疑 怎麼沒有 然後就以為少了什麼 該自己去補起來
但同一個目錄明明就還有 xxx.java
我卻見木不見林
@@
唉
--
另一個觀察切入點
為甚麼要有 xxxManager.java 跟 xxx.java ?
但有的時候又是 xxxService.java 配 xxxManager.java ?
而
xxxManager.java 通常都是 AIDL (Android Interface Definition Language)
AIDL is an IDL language used to generate code that enables two processes on an Android-powered device.
這應該要想一想 @@
Service 自己是一個process ?@@
還是很多個Service都在一個process內 ? @@
不懂阿不懂
參考資料:
AIDL
在Android中,每個應用程序都可以有自己的進程.在寫UI應用的時候,經常要用到Service.在不同的進程中,怎樣傳遞對象呢?
顯然, Java中不允許跨進程內存共享.因此傳遞對象,只能把對象拆分成操作系統能理解的簡單形式,以達到跨界對象訪問的目的.
在J2EE中,採用RMI的方式,可以通過序列化傳遞對象.在Android中,則採用AIDL的方式.理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.
其他Android 開發文章請見: Android開發豆知識
比如A事件和B事件同時發生造成了C結果,但當事者誤認C結果為A事件所造成,其實是B。
--
唉,
工作上我常出現這樣的問題 :(
該好好檢討,
所謂的鬼打牆,就是因為錯誤歸因先起了個頭,
而自己一開始完全搞懂,就會走到錯誤的路上。
--
由於在某個已確定的檔案裡面找不到,就覺得應該是發錯 KeyEvent
然後在自己覺得問題所在的地方放Log檢查
結果什麼都沒得到,
於是覺得是不同層級的問題,
應該不是framework 而是再往下
於是找阿找 去追可能的路徑
推測如下:
EventHub.cpp
負責設定property
KeyCharacterMap.cpp
來load *kcm
KeyCharacterMap.java
這裡負責來抓keycode 以建立keymap
(會先確認device -> 找keycode ->)
KeyEvent.java
根據keymap 發keyevent
--
總之,心裡就想,那我應該要
1. 幫寫一個kcm
2. 找keycode 定義
3. 幫他加一個對應event
4. 接著在policy定義要做的行為
--
但是,走了這一段路之後,
發現要找的東西,不在那個檔案,而是在隔壁 ....
唉 所以一步錯步步錯 @@
--
因為用grep找關鍵字
我先找到了 xxxManager.java
就覺得是這裡了!
疑 怎麼沒有 然後就以為少了什麼 該自己去補起來
但同一個目錄明明就還有 xxx.java
我卻見木不見林
@@
唉
--
另一個觀察切入點
為甚麼要有 xxxManager.java 跟 xxx.java ?
但有的時候又是 xxxService.java 配 xxxManager.java ?
而
xxxManager.java 通常都是 AIDL (Android Interface Definition Language)
AIDL is an IDL language used to generate code that enables two processes on an Android-powered device.
這應該要想一想 @@
Service 自己是一個process ?@@
還是很多個Service都在一個process內 ? @@
不懂阿不懂
參考資料:
AIDL
在Android中,每個應用程序都可以有自己的進程.在寫UI應用的時候,經常要用到Service.在不同的進程中,怎樣傳遞對象呢?
顯然, Java中不允許跨進程內存共享.因此傳遞對象,只能把對象拆分成操作系統能理解的簡單形式,以達到跨界對象訪問的目的.
在J2EE中,採用RMI的方式,可以通過序列化傳遞對象.在Android中,則採用AIDL的方式.理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.
其他Android 開發文章請見: Android開發豆知識
@@ 工作上需要多累積專業的知識!
回覆刪除