android power_manager電源管理分析

http://dongyulong.blog.51cto.com/1451604/512362


1. Android電源管理アプリケーションレイヤー分析

 
    Androidには、デバイスの電源状態の切り替えを制御するために使用されるandroid.os.PowerManagerクラスが用意されています。
    このクラスには、3つのインターフェース関数があります。
    1. void goToSleep(長い時間); 
       デバイスを強制的にスリープ状態にする
       ときは、権限の問題に注意してください。
    2、newWakeLock(INTフラグは、文字列 タグ);
       ロックの対応するレベル取得する
       フラグパラメータ:
           PARTIAL_WAKE_LOCK:画面OFF、キーボードライトOFF
           SCREEN_DIM_WAKE_LOCK:スクリーン薄暗いキーボードライトOFF
           SCREEN_BRIGHT_WAKE_LOCK:スクリーン明るく、キーボードライトOFF
           FULL_WAKE_LOCK:スクリーン明るく、キーボード明るい
           ACQUIRE_CAUSES_WAKEUP:画面とキーボードのライトを強制的に開く
           ON_AFTER_RELEASE:ロックが要求 されたときにロックが解放されると、アクティビティタイマーをリセットする
 
       ウェイクロックの一部を申し込んだ場合、電源ボタンを押してもシステムはスリープ状態になりません。たとえば、音楽の再生中
       に他のウェイクロックを申し込んだ場合、電源ボタンを押してもシステムはスリープ状態になります。
    3. void userActivity(long when、boolean noChangeLights);
       ユーザーアクティビティイベントが発生すると、デバイスはフルオン の状態に切り替わり、画面のリセットタイマーがリセットされます
       。1)上記の関数を使用するアプリケーションでは、Manifest.xmlにある必要があります。次の権限をファイルに追加します。
           <uses-permission android:name = "android.permission.WAKE_LOCK" />
           <uses-permission android:name = "android.permission.DEVICE_POWER" />
       2)すべてのロックをペアにする必要があります申し込んで、すぐにリリースしないと、システム障害の原因になります。
          ウェイクロックが時間内に解放されない場合、システムはスリープモードに入ることができません。
 
第二に、Android電源管理Javaレイヤー分析
 
    メインコードファイルは次のとおりです
       。frameworks\ base \ core \ java \ android \ os \ PowerManager.java
       frameworks \ base \ services \ java \ com \ android \ server \ PowerManagerService.java
       frameworks \ base \ core \ java \ android \ os \ Power.java
 
    その中でも、PowerManagerService.javaがコアであり、PowerManager.javaはアプリケーションレイヤーが呼び出すために提供され、Power.javaは
    JNIレイヤーと対話するための基本的な関数インターフェイスを提供します。PowerManagerService.javaクラスの役割は、PowerManager
    の機能と電源管理ステートマシン全体の操作を提供することです。その中には
    、外部と内部の分割に関する限り、多くの関数とクラスがあります
    1.最初に外部電源について話しましょう。PowerManagerServiceはどのように電源管理を実行しますか?次に、外部イベントがあるときに通知する必要があります。
       これは主に
       frameworks \ base \ services \ java \ com \ android \ server \ WindowManagerService.java
       中。WindowManagerServiceは、画面上でのユーザーのクリック、キーなどをユーザーアクティビティイベントとして呼び出します
       userActivity関数、PowerManagerServiceは反映するuserActivityのイベントタイプを決定します。
       操作を提供するために画面をライトアップするか、完全に無視するか、ライトのみの後でオフにするか。WindowManagerServiceによって呼び出されます
       gotoSleepや、screenIsOnなどの電源ステータスを取得する他の関数もあります。
     2.さらに、内部的には、外部インターフェイスとしてのuserActivityメソッドは、主にsetPowerStateを通じて機能を完了します。設定しようとしています
        画面のバックライトの切り替えなどのデバイスの電源状態は、パラメーターとしてsetPowerStateと呼ばれます。
        たとえば、画面を点灯する必要があるが、画面がロックされている場合、画面を点灯できない場合は、目的の状態を完了できますか。それ以外の場合は調整できます。
        Power.setScreenState(true)を使用して、jniを介してドライバーを実行し、画面を明るくします。そしてパワーサイクル
        これは主にハンドラーによって実現されます。PowerManagerServiceはinitで開始します
        HandlerThreadバックグラウンドメッセージループを使用してタスクの配信を遅延させます。Handlerを使用してカスタムを延期できます。
        ステートマシンのサイクルを実現するためのタスクの実行時間。たとえば、タイムアウト後、しばらくすると画面を暗くする操作はありません。
        閉じると、次のようにコードに反映されます。
            userActivityでは、setTimeoutLockedを使用して、setPowerStateを呼び出した後のタイムアウトを設定します。
            次に、setTimeoutLockedで、現在の状態に従って次の状態と時間が計算され、判断後に調整されます
            mHandler.postAtTime(mTimeoutTask、いつ)を使用してTimeoutTaskをポストします。このように
            TimeoutTaskは、ミリ秒後に実行されます。TimeoutTaskでは、設定された状態に従って呼び出されます  
            setPowerStateを使用して電源状態を変更し、新しい状態を設定します。たとえば、画面が明るい状態から暗い状態に変更されます。
            setTimeoutLocked(現在はSCREEN_OFF)を使用して、画面が完全にオフになるのを待ちます。今回はもう
            画面がオフになり、タイムアウト状態のサイクルが終了したと見なされます。
 
     たとえば、タイムアウト画面をオフにした後で一部の周辺機器をオフにする必要がある場合など、それをカスタマイズする場合は、
     TimeoutTaskで画面をオフにし、他のデバイスをオフにするコードを追加するだけです。新しい状態が元の状態とまったく同じである必要がある場合でも
     同じではなく、ハンドラーを使用することは難しくありません。コードを適切な場所に配置するのは当然です。

3、Android電源管理JNIレイヤー分析
 
    メインコードファイルは次のとおりです
       。frameworks\ base \ core \ jni \ android_os_power.cpp
       hardware \ libhardware \ power \ power.c
 
    JNIレイヤーのコードは主にandroid_os_Power.cppファイルにあり、Linuxカーネルとの相互作用はPower.cによって実現されます
    はい、Andriodとカーネル間の相互作用は、主にsysファイルによって実現されます。
 
4、Androidカーネルの電力管理分析
 
    1.メインコードは次の場所にあります:
       drivers / android / power.c
 
     カーネルが提供するインターフェース関数は
         EXPORT_SYMBOL(android_init_suspend_lock)です。
         //サスペンドロックを初期化します
         。使用する前にEXPORT_SYMBOL(android_uninit_suspend_lock)を初期化する必要があります
         //一時停止ロックに関連するリソースを解放します
         EXPORT_SYMBOL(android_lock_suspend);
         //ロックを申請します。対応するロック解除を呼び出して、それを解放する必要があります
         EXPORT_SYMBOL(android_lock_suspend_auto_expire);
         //アプリケーション部分wakelockは、一定時間後に自動的に解放されます
         EXPORT_SYMBOL(android_unlock_suspendを); //は、ロック解除
         EXPORT_SYMBOL(android_power_wakeupを); //は上のシステムをウェイクアップする
         EXPORT_SYMBOL(android_register_early_suspend); //登録するには、早期の駆動を一時停止
         EXPORT_SYMBOL(android_unregister_early_suspend)。
         //登録された初期サスペンドドライバをキャンセルします
 
     Androidフレームワークレイヤーに提供されるprocファイルは次のとおりです:
         "/ sys / android_power / quire_partial_wake_lock" //部分的なウェイクロックの適用
         "/ sys / android_power / acquire_full_wake_lock" //完全なウェイクロックの適用
         "/ sys / android_power / release_wake_lock" //対応するリリースウェイ
         クロック "/ sys / android_power / request_state"
            //システム状態の変更を要求し、スタンバイに入り、ウェイクアップ2つの状態に戻ります
         "/ sys / android_power / state" //現在のシステム状態を示します
 
    2. Androidの電源管理は主にウェイクロックによって実現されます。下部では、主に次の3つのキューがその管理を実現するために使用されます。
       理由:
           static LIST_HEAD(g_inactive_locks);
           static LIST_HEAD(g_active_partial_wake_locks);
           static LIST_HEAD(g_active_full_wake_locks);
       初期化されたすべてのロックがg_inactive_locksキューに挿入され、現在アクティブな部分ウェイク
       ロックがg_active_partial_wake_locksキューに挿入され、アクティブなフルウェイクロックがに挿入されます
       g_active_full_wake_locksキューでは、部分的なウェイクロックと完全なウェイクロックがすべて期限切れになります。
       ロック解除された後、非アクティブなキューに移動され、次の呼び出しを待ちます。
 
    3.カーネルレイヤーでウェイクロックを使用する手順は次のとおりです。
       1)android_init_suspend_lock関数を呼び出して、ウェイクロックを初期化します。
       2)関連する関数lock_android_lock_suspendまたはAndroid_lock_suspend_auto_expireを呼び出します
          ロックをリクエストします。ここでは、部分的なウェイクロックのみを申請できます。フルウェイクロックを申請する場合は、手紙を呼び出す必要があります。
          番号android_lock_partial_suspend_auto_expire(関数はEXPORTから取得されません)、この命名
          奇妙なことに、以前のandroid_lock_suspend_auto_expireと混同しないでください。
       3)自動期限切れのウェイクロックの場合は無視できます。それ以外の場合は、関連するウェイクロックを時間内に解放する必要があります。
          そうしないと、システムは長時間にわたって高電力消費の状態で実行されます。
       4)ドライバーがアンロードされたとき、またはウェイクロックが使用されなくなったときに、android_uninit_suspend_lockを呼び出して解放することを忘れないでください。
          リソース。
    4、システムの状態:
         USER_AWAKE、//ステータス
         USER_NOTIFICATIONで完全 、//ドライバは一時停止中ですが、CPUは
         USER_SLEEPを維持し ます// CPUはスリープモードに入ります
 
5、Androidの電源管理プロセス
 
    システムが正常にオンになった後、システムはAWAKE状態になり、バックライトは最も明るい場所からユーザーが設定した明るさまでゆっくり調整されます。
    スクリーンオフタイマー(設定->サウンドとディスプレイ->ディスプレイ設定->スクリーン
    timeout)タッチクリックなどのアクティビティイベントが発生した場合は、タイミング時間が経過する前に、タイミングを開始します。
    キーボードが押された場合やその他のイベントの場合、リセット画面オフタイマーはシステムを起動状態に保ちます。
    この間、プログラムはフルウェイクロックに適用されます。その後、ユーザーがボタンを押さない限り、システムはAWAKE状態のままになります。
    電源キー。AWAKE状態で、バッテリー残量が少ない場合、またはAC電源が使用されている場合、画面オフタイマーが作動して選択されます。
    プラグインされている間は画面をオンのままにします。バックライトは強制的にDIM状態に調整されます。
 
    画面オフタイマーが作動していて、完全なスリープ解除ロックがないか、ユーザーが電源キーを押した場合、システムのステータスは
    NOTIFICATIONに切り替えられ、登録されているすべてのg_early_suspend_handlers関数(通常はLCD)が呼び出されました
    アーリーサスペンドタイプとしてバックライトドライバーに登録します。必要に応じて、他のドライバーをアーリーサスペンドとして登録することもできます。
    サンプルは最初の段階でシャットダウンされます。次に、システムは、部分的なwake lockが取得されているかどうかを判断し、存在する場合は待機します
    その解放。待機中にユーザーアクティビティイベントがある場合、システムはすぐにAWAKE状態に戻ります。
    部分的なスリープ解除ロックが取得されていない場合、システムはすぐに関数pm_suspendを呼び出して他の関連するドライバーを閉じます
    システムがスリープ状態中にウェイクアップソースを検出すると、CPUはスリープ状態に入り、CPUはスリープ状態から移行します。
    状態が起こされ、関連するドライバーの再開機能が呼び出され、次に早期に登録された早期中断ドライバーがすぐに呼び出されます
    関数を再開し、最後にシステム状態がAWAKE状態に戻ります。ここで、アーリーサスペンドを登録したすべての関数が開始されるという問題があります。
    サスペンドの最初の段階が呼び出されることは理解できますが、再開時に、Linuxは最初にすべてのドライバーの再開機能を呼び出します。
    このとき、先に登録したアーリーサスペンドドライバーのレジューム機能が呼び出されます

   他の人の記事を転載してください、これに基づいて将来改善する時間があるでしょう!

元の記事を6件公開 賞賛された4件 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/sjc53yy/article/details/8494354