2012年8月15日水曜日

何気なく使っているFrameworks 第9回 CPU使用状況を表示/ addView


CPU使用状況を表示

ICSから開発者向けオプションに「CPU使用状況を表示」が追加されました。

f:id:baroqueworksdev:20120124001631p:image:w360


Settingsで設定すると

以下の処理順でサービス:LoadAverageServiceが起動します。
このサービス内でProcessから取得した値をオーバーレイ表示を行っています。

値が何を意味するのかはProcessStats.javaをみればわかります。
ついでに、Viewの追加→WindowManagerServiceまでの流れも要チェックです。

特にViewRoot.javaがViewRootImpl.javaへ変わり、中身もそれなりに修正されています。

DevelopmentSettings#onPreferenceTreeClick
- writeCpuUsageOptions()
- startService "com.android.systemui.LoadAverageService" of SysttemUI.
- LoadAverageService#onCreate()
- new LoadView extends ProcessStats
- new Stats
- WindowManager#addView() with Overlay layer of SECURE_SYSTEM_OVERLAY_LAYER
- WindowManagerImpl#addView
- ViewRootImpl#setView
- IWindowSession#add
- Session#add
- WindowManagerService#addWindow


確認しておいた方がいいソース

\packages\apps\Settings\src\com\android\settings
  • DevelopmentSettings.java

\frameworks\base\packages\SystemUI\src\com\android\systemui
  • LoadAverageService.java

\frameworks\base\core\java\com\android\internal\os
  • ProcessStats.java

\frameworks\base\core\java\android\view
  • ViewRootImpl.java

\frameworks\base\services\java\com\android\server\wm
  • WindowManagerService.java

\frameworks\base\policy\src\com\android\internal\policy\impl
  • PhoneWindowManager.java


簡易クラス図

f:id:baroqueworksdev:20120124002429p:image:w640

4 件のコメント:

  1. LayoutParamsの TYPEで、どの表示レイヤーに表示するかを設定すると思いますが、この表示レイヤーに、新たなレイヤーを追加することを考えています。

    例えば、新たなレイヤーを定義して、TYPE_SYSTEM_ERRORと TYPE_SYSTEM_OVERLAYの間に表示する方法を、ご存知もしくは調査対象だけでも分かっていたら、ご教授お願いできないでしょうか。

    返信削除
  2. 以下のソースを調査してはいかがでしょうか。
    UIのWindow関連はこの周辺を調査すれば理解できると思います。

    https://android.googlesource.com/platform/frameworks/base.git/+/master/services/core/java/com/android/server/wm/WindowManagerService.java
    https://android.googlesource.com/platform/frameworks/base.git/+/master/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

    返信削除
  3. このコメントは投稿者によって削除されました。

    返信削除
  4. 回答ありがとうございます。

    PhoneWindowManager#windowTypeToLayerLw にて TYPEからレイヤーレベルに変換し、WindowManagerService#addWindowToListInOrderLockedにて該当のレイヤーレベルに追加していると理解しました。

    なので、新たなレイヤーとして、WindowManager.LayoutParamsに定義し、PhoneWindowManager#windowTypeToLayerLw に任意の箇所に追加する。
    また check関連では、PhoneWindowManager#checkAddPermission や PhoneWindowManager#checkShowToOwnerOnlyなどに修正して対応しようと思います。

    返信削除