1. 程式人生 > >Android wakelock 學習總結第二篇

Android wakelock 學習總結第二篇

轉載自:http://slightsnow.blog.chinaunix.net/uid-29269256-id-4091805.html

如果看完第一篇的同學,是不是對大概上層睡眠流程有點小感了呢?如果你看過我說的幾個程式碼,細心的你會發現上篇文章最後Native層只是對/sys/power/wakelock 和 /sys/power/unwakelock進行了操作,並沒有對/sys/power/state進行操作,這個是在哪裡進行的呢?呼叫的介面函式又寫哪裡呢?彆著急,我們跟隨updatePowerStateLocked()這個函式沒見過?回頭看我的第一篇,當時沒有看得太明白,所以沒有詳細講啊,哇哈哈!現在我們看下

1114     private void updatePowerStateLocked() {
1115         if (!mSystemReady || mDirty == 0) {
1116             return;
1117         }
1118
1119         // Phase 0: Basic state updates.
1120         updateIsPoweredLocked(mDirty);
1121         updateStayOnLocked(mDirty);
1122
1123         // Phase 1: Update wakefulness.
1124         // Loop because the wake lock and user activity computations are influenced
1125         // by changes in wakefulness.
1126         final long now = SystemClock.uptimeMillis();
1127         int dirtyPhase2 = 0;
1128         for (;;) {
1129             int dirtyPhase1 = mDirty;
1130             dirtyPhase2 |= dirtyPhase1;
1131             mDirty = 0;
1132
1133             updateWakeLockSummaryLocked(dirtyPhase1);
1134             updateUserActivitySummaryLocked(now, dirtyPhase1);
1135             if (!updateWakefulnessLocked(dirtyPhase1)) {
1136                 break;
1137             }
1138         }
1139
1140         // Phase 2: Update dreams and display power state.
1141         updateDreamLocked(dirtyPhase2);
1142         updateDisplayPowerStateLocked(dirtyPhase2);
1143
1144         // Phase 3: Send notifications, if needed.
1145         if (mDisplayReady) {
1146             sendPendingNotificationsLocked();
1147         }
1148
1149         // Phase 4: Update suspend blocker.
1150         // Because we might release the last suspend blocker here, we need to make sure
1151         // we finished everything else first!
1152         updateSuspendBlockerLocked();
1153     }

當程式跑到這裡的時候,就是已經要執行睡眠了,我們主要看Phase 2這段的 updateDisplayPowerStateLocked(dirtyPhase2) 這個函式主要關注下:
1696             mDisplayReady = mDisplayPowerController.requestPowerState(mDisplayPowerRequest,
1697                     mRequestWaitForNegativeProximity);

這個requestPowerState函式進入到PowerController這個類中,這個幹什麼用的?看得還不太明白,以後慢慢看吧,不過最重要的一個還是要說明下:
1350     private final class DisplayControllerHandler extends Handler {
1351         public DisplayControllerHandler(Looper looper) {
1352             super(looper, null, true /*async*/);
1353         }
1354                                                                                                                                           
1355         @Override
1356         public void handleMessage(Message msg) {
1357             switch (msg.what) {
1358                 case MSG_UPDATE_POWER_STATE:
1359                     updatePowerState();
1360                     break;
1361
1362                 case MSG_PROXIMITY_SENSOR_DEBOUNCED:
1363                     debounceProximitySensor();
1364                     break;
1365
1366                 case MSG_LIGHT_SENSOR_DEBOUNCED:
1367                     debounceLightSensor();
1368                     break;
1369             }

這個Handler 是DisplayController自己重寫的一個hangMessage的方法,具體幹什麼用呢?又有睡呼叫呢?接著上面往下看,剛才呼叫到了requestPowerState,這個函式裝置狀態進行了一大堆判斷,主要是這兩句話:
 529             if (changed && !mPendingRequestChangedLocked) {
 530                 mPendingRequestChangedLocked = true;
 531                 sendUpdatePowerStateLocked();
 532             }

條件為什麼?自己看吧,我還沒有弄明白呢,但是sendUpdatePowerStateLocked(); 這句話確實是進入到了
 544     private void sendUpdatePowerStateLocked() {
 545         if (!mPendingUpdatePowerStateLocked) {
 546             mPendingUpdatePowerStateLocked = true;
 547             Message msg = mHandler.obtainMessage(MSG_UPDATE_POWER_STATE);
 548             msg.setAsynchronous(true);
 549             mHandler.sendMessage(msg);
 550         }                                                                                                                                 
 551     }

這裡呢,看到沒有看到mHandler.sendMessage(msg); 這個函式就是剛才咱們看到的那個定義哦,哇哈哈是不是特別親切啊?繼續走啊~~~

當我們 進入updatePowerState(); 看到這個函式還真是他媽的長啊,不過仔細看看,無非就是對屏光亮有影響的一個裝置的判斷,比如L-sensor等,這個函式會呼叫setScreenOn(false);

 829     private void setScreenOn(boolean on) {
 830         if (!mPowerState.isScreenOn() == on) {
 831             mPowerState.setScreenOn(on);                                                                                                  
 832             if (on) {
 833                 mNotifier.onScreenOn();
 834             } else {
 835                 mNotifier.onScreenOff();
 836             }
 837         }
 838     }

這個函式封裝了DisplayPowerState類中實現的setScreenOn(boolean on)
124     /**
125      * Sets whether the screen is on or off.
126      */
127     public void setScreenOn(boolean on) {
128         if (mScreenOn != on) {
129             if (DEBUG) {
130                 Slog.d(TAG, "setScreenOn: on=" + on);                                                                                      
131             }
132
133             mScreenOn = on;
134             mScreenReady = false;
135             scheduleScreenUpdate();
136         }
137     }

再次感嘆JAVA封裝的還真是牛逼哄哄啊,緊接著呼叫scheduleScreenUpdate(),接著呼叫postScreenUpdateThreadSafe(),
272     private void scheduleScreenUpdate() {
273         if (!mScreenUpdatePending) {
274             mScreenUpdatePending = true;
275             postScreenUpdateThreadSafe();                                                                                                  
276         }
277     }
278
279     private void postScreenUpdateThreadSafe() {
280         mHandler.removeCallbacks(mScreenUpdateRunnable);
281         mHandler.post(mScreenUpdateRunnable);
282     }

如果你要是問我然後走到哪裡了?呵呵,你肯定沒有見過Handler.post這樣的callback呼叫方法,沒錯,緊接著呼叫的就是mScreenUpdateRunnable這個類重寫的run函式

300     private final Runnable mScreenUpdateRunnable = new Runnable() {
301         @Override
302         public void run() {
303             mScreenUpdatePending = false;
304
305             int brightness = mScreenOn && mElectronBeamLevel > 0f ? mScreenBrightness : 0;
306             if (mPhotonicModulator.setState(mScreenOn, brightness)) {
307                 mScreenReady = true;
308                 invokeCleanListenerIfNeeded();                                                                                             
309             }
310         }
311     };
312

不要著急,我們已經慢慢快接近真相了啊,下面主要看得是mPhotonicModulator.setState(mScreenOn, brightness)這個函式

342         public boolean setState(boolean on, int backlight) {
343             synchronized (mLock) {
344                 if (on != mPendingOn || backlight != mPendingBacklight) {
345                     if (DEBUG) {
346                         Slog.d(TAG, "Requesting new screen state: on=" + on
347                                 + ", backlight=" + backlight);
348                     }
349
350                     mPendingOn = on;
351                     mPendingBacklight = backlight;
352
353                     if (!mChangeInProgress) {
354                         mChangeInProgress = true;
355                         AsyncTask.THREAD_POOL_EXECUTOR.execute(mTask);                                                                     
356                     }
357                 }
358                 return mChangeInProgress;
359             }
360         }

到這裡,呼叫一個mTask,這個在哪裡定義呢?就在下面的函式中:

372         private final Runnable mTask = new Runnable() {
373             @Override
374             public void run() {
375                 // Apply pending changes until done.
376                 for (;;) {
377                     final boolean on;
378                     final boolean onChanged;
379                     final int backlight;
380                     final boolean backlightChanged;
381                     synchronized (mLock) {
382                         on = mPendingOn;
383                         onChanged = (on != mActualOn);
384                         backlight = mPendingBacklight;
385                         backlightChanged = (backlight != mActualBacklight);
386                         if (!onChanged && !backlightChanged) {
387                             mChangeInProgress = false;
388                             break;
389                         }
390                         mActualOn = on;
391                         mActualBacklight = backlight;
392                     }
393
394                     if (DEBUG) {
395                         Slog.d(TAG, "Updating screen state: on=" + on
396                                 + ", backlight=" + backlight);
397                     }
398                     if (onChanged && on) {
399                         mDisplayBlanker.unblankAllDisplays();
400                     }
401                     if (backlightChanged) {
402                         mBacklight.setBrightness(backlight);
403                     }
404                     if (onChanged && !on) {
405                         mDisplayBlanker.blankAllDisplays();
406                     }
407                 }
408
409                 // Let the outer class know that all changes have been applied.
410                 postScreenUpdateThreadSafe();
411             }
412         };

這個有點長,不過咱們就看mDisplayBlanker.blankAllDisplays(); 這個 與mDisplayBlanker.unblankAllDisplays(); 這兩個函式一看就知道是相反的兩個功能,繼續跟隨這個函式,我們終於回到了PowerManagerService了
2658         @Override
2659         public void blankAllDisplays() {                                                                                                  
2660             synchronized (this) {
2661                 mBlanked = true;
2662                 mDisplayManagerService.blankAllDisplaysFromPowerManager();
2663                 nativeSetInteractive(false);
2664                 nativeSetAutoSuspend(true);
2665             }
2666         }
2667
2668         @Override
2669         public void unblankAllDisplays() {
2670             synchronized (this) {
2671                 nativeSetAutoSuspend(false);
2672                 nativeSetInteractive(true);
2673                 mDisplayManagerService.unblankAllDisplaysFromPowerManager();
2674                 mBlanked = false;
2675             }
2676         }

終於看到了親切的native開頭的函數了,馬上就要到了啊,堅持住啊,其中 nativeSetInteractive(false);nativeSetAutoSuspend(true); 這兩個函式都定義在
frameworks/base/services/jni/com_android_server_power_PowerManagerService.cpp 中,分別列舉下:

170 static void nativeSetInteractive(JNIEnv *env, jclass clazz, jboolean enable) {
171     if (gPowerModule) {
172         if (enable) {
173             ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(true) while turning screen on");
174             gPowerModule->setInteractive(gPowerModule, true);
175         } else {
176             ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(false) while turning screen off");
177             gPowerModule->setInteractive(gPowerModule, false);
178         }
179     }
180 }
181
182 static void nativeSetAutoSuspend(JNIEnv *env, jclass clazz, jboolean enable) {                                                             
183     if (enable) {
184         ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_enable() while turning screen off");
185         autosuspend_enable();
186     } else {
187         ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_disable() while turning screen on");
188         autosuspend_disable();
189     }
190 }

第一個暫時沒有找到實現,也不知道幹什麼用,第二個函式的autosuspend_enable()和autosuspend_disable這兩個函式就是就是真正往/sys/power/state寫mem和on的函式啦!但是他在哪裡呢?這個我找了半天,沒想到竟然實現在:system/core/libsuspend/  被編譯成了一個庫檔案,一直不明白為什麼同樣的power曾的Native的庫檔案,為什麼不放在一起呢?奇怪

水平有限,就先這樣吧,如果說不對的,請大牛幫忙指出,謝謝

現在大概的流程和介面都已經找到了,繼續詳細的看看程式碼了,就不再分析了!
下一篇會對kernel底層的earlysuspend的流程進行分析,走一遍!