ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年12月5日 星期三

source flow -- key, interceptKeyBeforeQueueing

NativeInputManager 是 JNI library
屬於 SystemServer 的一部分。

SystemServer 在 JNI_OnLoad 時, 就會call NativeInputManager 的 一堆 initital, start, register function .

nativeInit

NativeInputManager 物件生成時,會 new 一個 EventHub 物件,並且傳入 InputManager 的生成function 中。(同時也把自己 NativeInputManager 當作參數傳入)
eventHub = new EventHub(); mInputManager = new InputManager(eventHub, this, this);
nativeStart

就是開始執行 InputManager 的 Thread:
gNativeInputManager->getInputManger()->start();

所以實際的 Thread 是 InputManager( ) 的 Thread.

-- 跳 N 步 --

這個 Thread 執行的 code 就是: void InputReader::loopOnce(){ mEventHub->getEvent(& rawEvent); process(& rawEvent); } process 就會找到 event 來自 KeyboardInputMapper Device,請他 run process
就是 processKey( ),

然後就是getDispatcher, notifyKey
mPolicy, interceptKeyBeforeQueueing


mPolicy 是在 InputDispatcher( ) 生成時,傳入的 InputDispatcherPolicyInterface 參數物件。
也就是當初傳入 InputManager 生成函數 的 NativeInputManager 物件 (他有繼承 InputDispatcherPolicyInterface).


所以由 inputReader 的 Thread 由 EventHub 取得 linux kernel input 的資料,
一路交給 NativeInputManager 的 interceptKeyBeforeQueueing( ) 來處理。

這一整段,都沒有用到 java code


在 NativeInputManager 的 interceptKeyBeforeQueueing( ) 裡面,才有用 java call back function 去 call InputManager.java 的 function.



那個 power key 的處理,就是在 NativeInputManager 的 interceptKeyBeforeQueueing( ) 處理的。

他先把 key 交給 java 的 .. pwrkey_event_handler_Keyup D/InputReader( 2240): loopOnce D/InputReader( 2240): consumeEvent D/InputReader( 2240): process D/InputReader( 2240): processKey D/InputDispatcher( 2240): notifyKey D/InputManager-JNI( 2240): interceptKeyBeforeQueueing -- about to call callback function W/System.err( 2240): java.lang.Throwable: stack dump W/System.err( 2240): at java.lang.Thread.dumpStack(Thread.java:577) W/System.err( 2240): at com.android.internal.policy.impl.PhoneWindowManager.interceptKeyBeforeQueueing(PhoneWindowManager.java:1868) W/System.err( 2240): at com.android.server.WindowManagerService$InputMonitor.interceptKeyBeforeQueueing(WindowManagerService.java:5324) W/System.err( 2240): at com.android.server.InputManager$Callbacks.interceptKeyBeforeQueueing(InputManager.java:385) W/System.err( 2240): at dalvik.system.NativeStart.run(Native Method) D/InputManager-JNI( 2240): interceptKeyBeforeQueueing WM_ACTION_GO_TO_SLEEP D/PowerManagerService-JNI( 2240): android_server_PowerManagerService_goToSleep request_suspend_state: mem (0->3) at 81038317625 (1970-01-02 07:31:38.609208250 UTC) mxc_ipu mxc_ipu: Channel already disabled 10 mxc_ipu mxc_ipu: Channel already uninitialized 10 I/power ( 2240): *** set_screen_state 0 D/SurfaceFlinger( 2240): About to give-up screen, flinger = 0x1dfb38 PM: Syncing filesystems ... done. PhoneWindowManager.java 在return 一個包含 ACTION_GO_TO_SLEEP 的 flag.
然後 NativeInputManager.c 處理這個 flag, call android_server_PowerManagerService_goToSleep

沒有留言:

標籤

網誌存檔