2013年11月17日日曜日

何気なく使っているFramework PrintManager

Android 4.4 KitKatoから追加されたPrint機能。

※調査する時間が取れず、中途半端ですが一旦公開します。


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

Print機能を構成するパッケージが4つに分かれています。
すべて重要なので、確認しておきましょう。

\frameworks\base\core\java\android\print
PrintManager.java
IPrintSpooler.aidl

\frameworks\base\core\java\android\printservice
PrintService.java
PrinterDiscoverySession.java
IPrintService.aidl

\frameworks\base\packages\PrintSpooler\src\com\android\printspooler
PrintSpoolerService.java

\frameworks\base\services\java\com\android\server\print
PrintManagerService.java
RemotePrintService.java
RemotePrintSpooler.java
UserState.java



簡易クラス図

2013年11月3日日曜日

Andoird 4.4 KitKat StatusBarの変更点(基本設計編)



システムよりの確認です。


SystemServerをみる

config.disable_systemuiの設定次第で、ステータスバーを非表示にできる。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/services/java/com/android/server/SystemServer.java
 
        boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);

            if (!disableSystemUI) {
                try {
                    Slog.i(TAG, "Status Bar");
                    statusBar = new StatusBarManagerService(context, wm);
                    ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
                } catch (Throwable e) {
                    reportWtf("starting StatusBarManagerService", e);
                }
            }


SystemUiをみる

そもそも、Tablet用のフォルダがなくなった。すでに、JBでは使われていなかった。(※Nexus系の端末)

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/

TV用は?

相変わらず、スケルトン。モジュールの定義のみ。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java

2013年11月2日土曜日

4.4 KitKatの表示レイヤーについて


android-4.4_r1がAOSP上で公開されました。
毎度おなじみの表示レイヤーのチェックを行いました。

確認OSバージョン

android-4.4_r1 KitKat

表示レイヤー

OSのメジャーアップデートなので、表示レイヤーの変更点があるかどうか確認しました。
ソース
android-4.4_r1/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
(★ = 4.4_r1にて新規追加されたレイヤー)
値レイヤー名用途
1TYPE_UNIVERSE_BACKGROUND
2TYPE_PRIVATE_PRESENTATION
2TYPE_WALLPAPER壁紙
3TYPE_PHONE着信などの電話用
4TYPE_SEARCH_BAR検索バー
5TYPE_RECENTS_OVERLAY履歴
5TYPE_SYSTEM_DIALOG電源OFFダイアログなどのシステムダイアログ
6TYPE_TOASTトースト表示
7TYPE_PRIORITY_PHONESIMエラー表示など
8TYPE_DREAMDream用レイヤー
9SYSTEM_ALERT_LAYERANRやLowバッテリー通知
10TYPE_INPUT_METHOD文字入力UI
11TYPE_INPUT_METHOD文字入力UIのダイアログ
12TYPE_KEYGUARD_SCRIM★keyguardが起動するまでの間、Keyguardの後ろに表示する
13TYPE_KEYGUARDキーガード表示
14TYPE_KEYGUARD_DIALOGシャットダウン中やSIMロック表示、キーガード表示中の電源OFFダイアログなど
15TYPE_STATUS_BAR_SUB_PANELPhone用expandしたパネル
16TYPE_STATUS_BARStatusBar
17TYPE_STATUS_BAR_PANELStatusBarをexpandしたパネル
18TYPE_VOLUME_OVERLAYボリューム変更
19TYPE_SYSTEM_OVERLAYキーガードより上位に表示するシステムオーバーレイ
20TYPE_NAVIGATION_BARナビゲーションBar
21TYPE_NAVIGATION_BAR_PANELナビゲーションBarの上に表示するために必要なパネル(searchなど)
22TYPE_SYSTEM_ERRORシステムエラー通知
23TYPE_MAGNIFICATION_OVERLAY拡大表示用
24TYPE_DISPLAY_OVERLAYSecondaryディスプレイ用
25TYPE_DRAGドラッグ&ドロップ操作用
26TYPE_SECURE_SYSTEM_OVERLAY
27TYPE_BOOT_PROGRESSBoot中のDialog表示
28TYPE_POINTERマウスポインター
29TYPE_HIDDEN_NAV_CONSUMERFakeWindow用


大きな変更点は
  1. TYPE_KEYGUARD_SCRIMの追加

アプリケーション開発者にはあまり関係ありませんが、Frameworksのカスタム作業がメインの方、WindowManagerServiceとKeyguard周りを調査しましょう。

2013年9月23日月曜日

IngressのComm風タブを作成してみた

IngressのComm風タブを作成してみました。


画面イメージ

デフェルトは画面下部にタブだけを表示し、タブを引っ張り上げることでViewを表示します。




引っ張り上げると、View内のコンテンツが表示されます。

ソース

以下、Githubにて公開中です。
ライセンスはMITライセンスです。
https://github.com/baroqueworksdev/MyApiDemo/blob/master/src/jp/baroqueworksdev/myapidemo/view/SlidePanelView.java

2013年8月1日木曜日

Android 4.3 で追加されたAppOpsの調査 その2

抑制できるパーミッション

以下のソースチェックしましょう。

frameworks/base/core/java/android/app/AppOpsManager.java

ソースを確認すると、次のような値が宣言されています。
これらの値を引数にして、モジュールをコールします。

 
public class AppOpsManager {
 :

    // when adding one of these:
    //  - increment _NUM_OP
    //  - add rows to sOpToSwitch, sOpNames, sOpPerms
    //  - add descriptive strings to Settings/res/values/arrays.xml
    public static final int OP_NONE = -1;
    public static final int OP_COARSE_LOCATION = 0;
    public static final int OP_FINE_LOCATION = 1;
    public static final int OP_GPS = 2;
    public static final int OP_VIBRATE = 3;
    public static final int OP_READ_CONTACTS = 4;
    public static final int OP_WRITE_CONTACTS = 5;
    public static final int OP_READ_CALL_LOG = 6;
    public static final int OP_WRITE_CALL_LOG = 7;
    public static final int OP_READ_CALENDAR = 8;
    public static final int OP_WRITE_CALENDAR = 9;
    public static final int OP_WIFI_SCAN = 10;
    public static final int OP_POST_NOTIFICATION = 11;
    public static final int OP_NEIGHBORING_CELLS = 12;
    public static final int OP_CALL_PHONE = 13;
    public static final int OP_READ_SMS = 14;
    public static final int OP_WRITE_SMS = 15;
    public static final int OP_RECEIVE_SMS = 16;
    public static final int OP_RECEIVE_EMERGECY_SMS = 17;
    public static final int OP_RECEIVE_MMS = 18;
    public static final int OP_RECEIVE_WAP_PUSH = 19;
    public static final int OP_SEND_SMS = 20;
    public static final int OP_READ_ICC_SMS = 21;
    public static final int OP_WRITE_ICC_SMS = 22;
    public static final int OP_WRITE_SETTINGS = 23;
    public static final int OP_SYSTEM_ALERT_WINDOW = 24;
    public static final int OP_ACCESS_NOTIFICATIONS = 25;
    public static final int OP_CAMERA = 26;
    public static final int OP_RECORD_AUDIO = 27;
    public static final int OP_PLAY_AUDIO = 28;
    public static final int OP_READ_CLIPBOARD = 29;
    public static final int OP_WRITE_CLIPBOARD = 30;
    /** @hide */
    public static final int _NUM_OP = 31;
 :
}


つまり、次のようなことしか抑制できません。
  • 位置情報
  • バイブレーション
  • 電話帳のR/W
  • 電話履歴のR/W
  • カレンダーのR/W
  • WiFiのスキャン
  • ノッティフィケーションのPost
  • 電話発信
  • SMSのR/W
  • SMS/メールの受信
  • SMSの送信
  • 設定のWrite
  • SystemAlertWindowの使用
  • ノッティフィケーションの参照
  • カメラ
  • オーディオの録音/鳴動
  • クリップボードのR/W

Internet、Bluetooth、SDカードなど、アプリケーションの再起動が必要そうな機能の抑制できないようです。
(※なぜアプリケーションの再起動が必要なのかは、frameworksのソースを確認しよう)


2013年7月27日土曜日

Android 4.3 で追加されたAppOpsの調査

Android4.3で追加されているAppOpsを確認しました。
アプリケーションのパーミッションの管理ができるかもしれません。


ポイント

AppOpsのポイントです。
  • AppOpsManager、AppOpsServiceが追加された
  • アプリケーションで使うには、getSystemService(Context.LAYOUT_INFLATER_SERVICE)をコール
  • アプリケーションのパーミッションの抑制ができる
  • framewokrs内の各サービスは、AppOpsServiceから設定値を取得して動作ON/OFFを決定
(AppOpsManager.MODE_ALLOWED / MODE_IGNOREDなどでgrepすればOK)


簡易クラス図



AppOpsServiceが生成されるタイミング

ActivityManagerServiceのコンストラクタで、AppOpsServiceが生成されます。

 
    private ActivityManagerService() {
        File systemDir = new File(dataDir, "system");
            :
        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"));
            :
    }


AppOpsManagerの設定データ

AppOpsの設定値は次のように保存されています。
格納ディレクトリは上記のとおり、Systemディレクトリでファイル名はappops.xmlです。
設定値のR/Wは次のように、AppOpsServiceで処理されています。詳しく知りたい方はソースを確認しましょう。

 
public class AppOpsService extends IAppOpsService.Stub {
    public AppOpsService(File storagePath) {
        mFile = new AtomicFile(storagePath);
        mHandler = new Handler();
        readState();
    }

    void readState() {

    }
    void writeState() {

    }
}


ソース

android-4.3_r2.1のソースを確認すると、次のソースがAppOpsに該当します。
以下のソースは要チェックです。

Settingsアプリ
packages/apps/Settings/src/com/android/settings/applications
- AppOpsCategory.java
- AppOpsDetails.java
- AppOpsState.java
- AppOpsSummary.java


Frameworks
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/android/app/AppOpsManager.java
frameworks/base/services/java/com/android/server/AppOpsService.java
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java


『プロの力が身につく Androidプログラミングの教科書』が発売されました

執筆に参加

『プロの力が身につく Androidプログラミングの教科書』は6人のAndroiderによって、書かれています。
私も執筆に参加させていただきました。


こんな方へ

Androidをこれからはじめようとする方&脱初心者を望んでいる方に、是非、手に取っていただきたい本です。
本書HPから熱い思いをお伝えします。
引用元:http://android-textbook.com/android-programming-textbook/
※ここから引用
本書は、Android のことを「知る」「学ぶ」「考える」「使う」「守る」「試す」ための入門書になります。 Androidのことをより深く知ってもらうための書籍でもあり、Androidアプリケーションの開発をはじめたばかりの方でも、本書を順番に読み進めながら学べる学習スタイルを採用しています。初心者の方だけでなく、Androidアプリケーションを開発された経験がある方でも、Androidのことをより深く知ってもらうための要素を含んでいます。最終的にはオリジナルのアプリケーションを開発し、世の中に公開できるようになることを目標にしています。また本書は、Androidアプリケーションの開発方法のみならず、執筆者の経験から得たノウハウを詰め込んでいますので、すべての開発者が「Android」というものを深く知ることができます。
※ここまで引用

本書の目次が上記HPに公開されています。是非、ご覧ください。



プロの力が身につく Androidプログラミングの教科書
藤田 竜史 要 徳幸 住友 孝郎 日高 正博 小林 慎治 木村 尭海
ソフトバンククリエイティブ
売り上げランキング: 38,541