【感想・ネタバレ】Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステムのレビュー

あらすじ

(概要)
Androidのインターナル解説書。
根底に流れるモバイルプラットフォームとしての哲学を丁寧に扱い,最新版(7,N/Nougat)までカバー。
第1巻となる本書では,プラットフォーム戦略の基幹部分を担う「GUIシステム」を主眼に置き,モバイルで主流となったAndroidの中枢を徹底解説。
Androidという巨大ソフトウェアを題材にしつつ,アプリ開発者の方々に身近なテーマの問題設定で,ハードウェアからマルチタッチ/UIスレッド/Handler/Viewツリー/レイアウト/OpenGL ES/バイトコード実行環境まで,ツーランク上のクオリティの製品開発を可能にする技術知識を集約しました。広くモバイル,Web,デスクトップ,組み込み... 分野ごとの要素技術の壁を越え,さらなるパワーアップをお考えのエンジニアの方々へ,今こそ知っておきたいトピックを凝縮してお届けします。

...続きを読む
\ レビュー投稿でポイントプレゼント / ※購入済みの作品が対象となります
レビューを書く

感情タグBEST3

Posted by ブクログ

Web+DB Press Plus
Androidを支える技術 I
60fpsを達成するモダンなGUIシステム
著:有野 和真
出版社:技術評論社

本書は、Android のGUIに関する解説書である

硬派な内容、1つ1つの解説が丁寧です。

何度も、行ったり来たりして、概要までたどりついた
ろんな図表がかかれていて、理解の一助となっています。

現行のAndroid のバージョンは、2024.10.15 現在 Android15ですが、本書は
Android 7.0 を扱っていますのでご注意を

2016.12 時点での Androidのソースコードは、12.4メガステップ、その大半が GUIの記述に使われれてます。

ちなみに、「Androidを支える技術 Ⅱ」ではGUI以外のシステムサービスを扱っています。

■基本

Androidとは、Linux ベースのシステムに、Java と C++で実装したGUIと組み合わせのシステムである
AndroidのGUIはLinuxのqt、GTK+ではなく独自に作られたものである。そしてその大半はJavaで書かれている
Androidアプリは、Viewを組み合わせてGUIを作ります

■Viewで実現できること

 ①レイアウト
  (1)measureパス
  (2)layoutパス

 ②画面の描画 OpenGL ESを利用
 (1) Viewツリーの Draw()
(2) OpenGL ES呼び出し
(3) Surfaceの合成

 ③タッチイベントのViewへの送信

■スマホのハードウェア構成

 CPU+メモリ
 GPU+メモリ
  HWC
 画面

 描画計算をGPUに任せると、省メモリで、省電力で計算できる

■スマホアプリについて

 スマホアプリはJavaで書かれている⇒実行するには、中間コード:バイトコードへコンパイルする必要がある

 JIT 都度コンパイルする方式
 AOT インストール時にコンパイルする方式

 JITだと、都度コンパイルすると、速度が落ちるが、AOTだと、AndroidのOSバージョンアップのとき、全アプリが自動的にリコンパイルされるので
 その間、スマホが使えなくなる。だから、JITとAOTを両用されている。

目次

本書について

第1章 AndroidとGUIシステムの基礎知識 ──モバイルプラットフォームの今と基本を知るために

1.1 Androidと最先端のモバイルGUIシステム

1.1.1 GUIシステムに対する要求は年々高まっている
1.1.2 AndroidとGUIシステム
1.1.3 Androidのバージョンの話

1.2 AndroidのGUIシステムの全体像と変遷

1.2.1 AndroidのGUIシステムの全体像について
1.2.2 GUIシステムの基礎Android初期からGBまで
1.2.3 ハードウェアアクセラレーションを用いた描画処理 
1.2.4 AOTコンパイルとprofile guidedコンパイル 
1.2.5 描画処理の概要

1.3 [速習]本書で登場するAndroidの構成要素のうち、GUIシステム以外の部分

1.3.1 Activity
1.3.2 ActivityThreadとmainメソッド
1.3.3 プロパティによる設定の管理
1.3.4 Binderとシステムサービス
1.3.5 SystemServerとsystemユーザー
1.3.6 Zygoteによるアプリの開始
1.3.7 init.rcから起動されるシステムサービスとデーモン達

1.4 [入門]AndroidのGUIプログラミング ……View周辺の基

1.4.1 HelloWorld
1.4.2 カスタムのView
1.4.3 カスタムの属性を定義する
1.4.4 AndroidのGUIプログラミング入門、まとめ

1.5 まとめ

第2章 タッチとマルチタッチ ──スマホがスマホであるために

2.1 Androidでのマルチタッチ、基本のしくみ

2.1.1 ViewのonTouchEvent()メソッドとMotionEvent
2.1.2 マルチタッチ概要
2.1.3 なぜInputManagerServiceを扱うのか?

2.2 LinuxのInputサブシステムとinput_event

2.2.1 LinuxのInputサブシステムについて
2.2.2 Linuxの入力関連デバイスドライバとinputモジュール
2.2.3 eventのhandlerとeventファイル

2.3 Androidフレームワークでの入力イベントの基礎 

2.3.1 InputManagerServiceとその構成要素

2.4 InputReader

2.4.1 InputReaderの構成要素
2.4.2 InputReaderのloopOnce()メソッドとRawEvent
2.4.3 EventHubのgetEvents()メソッド
2.4.4 InputDeviceとInputMapper
2.4.5 タッチの処理とMultiTouchInputMapper 
2.4.6 InputReaderまとめ

2.5 InputDispatcherとInputChannel 

2.5.1 InputDispatcher概要
2.5.2 ウィンドウとInputChannelの登録

2.6 まとめ

第3章 UIスレッドとHandler ──LooperとHandlerが見えてくる

3.1 UIスレッド

3.1.1 UIスレッドとは何か
3.1.2 UIスレッドでしかできないこと
3.1.3 UIスレッドではできないこと
3.1.4 メッセージループとUIスレッド
3.1.5 AndroidにおけるUIスレッド周辺の構成要素 

3.2 Looper ……UIスレッドを実現するメッセージループ機構

3.2.1 Looperの基本的な使い方
3.2.2 Looperとスレッドの関連付け
3.2.3 MessageQueueとnext()メソッド
3.2.4 Looper.loop()では何を行っているのか?❶

3.3 よくわかるHandler

3.3.1 [再入門]Handler
3.3.2 Handlerの使用例
3.3.3 メッセージ送り先となるLooperの決定
3.3.4 Handlerのpost()とMessageのenqueue
3.3.5 Looper.loop()では何を行っているのか?❷ 
3.3.6 HandlerのdispatchMessage()①
3.3.7 HandlerのdispatchMessage()②

3.4 まとめ

第4章 Viewのツリーとレイアウト ──GUIシステムの根幹

4.1 Viewツリーの基礎知識

4.1.1 Viewとツリー
4.1.2 Viewの担当する領域
4.1.3 Viewツリーの使われ方
4.1.4 ツリーの再帰的な呼び出し

4.2 AssetManagerとレイアウトのリソース

4.2.1 Viewツリーの構築とリソースファイル
4.2.2 リソースのコンパイルとAssetManager
4.2.3 バイナリ化されたリソースとaapt
4.2.4 バイナリリソースとXmlResourceParser

4.3 LayoutInflater

4.3.1 LayoutInflaterを取得する
4.3.2 LayoutInflaterの生成とContext
4.3.3 LayoutInflaterとinflate()メソッド
4.3.4 LayoutInflaterのonCreateView()メソッドとcreateView()メソッド
4.3.5 inflate()メソッドでのViewの生成
4.3.6 ResXMLParserとAttributeSet
4.3.7 スタイルとテーマ入門
4.3.8 スタイル解決 ……obtainStyledAttributes()メソッド
4.3.9 LayoutInflaterのまとめ

4.4 ActivityとDecorView

4.4.1 setContentView()呼び出しの後のViewの階層 
4.4.2 DecorViewとWindow Style

4.5 Viewツリーのmeasureパス

4.5.1 Viewツリーのレイアウト概要
4.5.2 measureパスとonMeasure()メソッド

4.6 葉ViewのonMeasure()によるサイズ計算

4.6.1 葉ノードと内部ノードについて
4.6.2 葉のViewの幅の指定いろいろ
4.6.3 いろいろな幅の指定のコードによる表現 
4.6.4 onMeasure()の実際の実装

4.7 ViewGroupの場合のonMeasure()によるサイズ計算

4.7.1 問題の概要
4.7.2 基本ケースのButton B以外のonMeasure()処理
4.7.3 Button Bがwrap_contentの場合
4.7.4 Button Bがmatch_parentの場合
4.7.5 真ん中の子がlayout_weight="1"の場合

4.8 layoutパスとその他の話題

4.8.1 layout_で始まる属性達
4.8.2 layoutパスとgravity
4.8.3 タッチの送信とInputChannel
4.8.4 onDraw()とCanvasとハードウェアアクセラレーション

4.9 まとめ

第5章 OpenGL ESを用いたグラフィックスシステム ──DisplayListとハードウェアアクセラレーション

5.1 なぜOpenGL ESを使ったGUIシステムなのか?

5.1.1 解像度とゲートの数 ……消費電力とコア数
5.1.2 なめらかなアニメーションとViewごとのキャッシュ ……ListViewのスクロールを例に
5.1.3 動画の再生と消費電力
5.1.4 Androidのグラフィックスシステムのうち、本章で扱う範囲

5.2 Viewのdraw()からOpenGL ES呼び出しまで 

5.2.1 誰がdraw()を呼び出し、誰がOpenGL ESを呼び出すのか?
5.2.2 ThreadedRendererによるdraw()の呼び出し
5.2.3 RenderNodeとDisplayListCanvas
5.2.4 drawRenderNode()メソッドとDrawRenderNodeOp
5.2.5 nSyncAndDrawFrame()メソッドとRenderThread
5.2.6 drawからDisplayListのメソッド呼び出しまで、まとめ

5.3 DisplayList

5.3.1 DisplayListが保持するオペレーション
5.3.2 その他のDrawXXXOpクラス
5.3.3 DisplayListを用いた画面の再描画

5.4 ListViewのスクロールに見る、驚異のアニメーション処理 

5.4.1 スクロール処理の基本処理
5.4.2 60fpsを維持するために必要なこと
5.4.3 flingの構造
5.4.4 RenderNode単位の平行移動

5.5 まとめ

第6章 OpenGL ES呼び出しが画面に描かれるまで ──ViewRootImplとSurfaceFlinger

6.1 OpenGL ES呼び出しが画面に描かれるまで

6.1.1 本章で登場するクラス達の全体像
6.1.2 ハードウェアとAndroidの境界
6.1.3 EGL呼び出しでOpenGL ESの描画先を指定する
6.1.4 EGLで指定されたSurfaceが、grallocで取得したオフスクリーングラフィックスバッファを更新する
6.1.5 SurfaceFlingerが、HWCを用いてグラフィックスバッファを合成して表示
6.1.6 ViewRootImplがSurfaceの左上座標を保持し、WindowManagerServiceが複数のViewRootImplを管理

6.2 HALとgralloc

6.2.1 HALのモジュールの取得 ……hw_get_module()
6.2.2 hw_module_t構造体周辺の構造体定義
6.2.3 hw_device_tとalloc_device_t
6.2.4 alloc_device_tのalloc()関数
6.2.5 gralloc_module_tとprivate_module_tの定義

6.3 EGLによるOpenGL ES描画対象の指定

6.3.1 EGLによる、OpenGL ESの描き出し先指定
6.3.2 EGL、gralloc、OpenGL ESが端末依存である意義
6.3.3 アプリのOpenGL ES呼び出しを基に、EGL周辺の構成の意義を考える

6.4 SurfaceFlingerとHWC

6.4.1 グラフィックスバッファとSurfaceをつなぐBufferQueue
6.4.2 BufferQueueConsumerとしてのSurfaceとOpenGL ES呼び出し
6.4.3 SurfaceFlingerシステムサービス
6.4.4 他のプロセスから見たSurfaceFlingerと画面の描画
6.4.5 SurfaceFlingerから見た画面の描画
6.4.6 HWC (Hardware Composer) HAL概要
6.4.7 HWCのprepare()メソッド
6.4.8 SurfaceFlingerによるグラフィックスバッファの合成

6.5 ViewRootImpl

6.5.1 ViewRootImpl概要
6.5.2 ViewRootImplの生まれる場所
6.5.3 IWindowとしてのViewRootImpl
6.5.4 ViewRootImplでEGL呼び出しが行われる場所
6.5.5 ViewRootImplのperformTraversal()メソッド
6.5.6 ViewRootImplがViewへタッチイベントを届けるまで

6.6 Surfaceをアプリ開発者が使う例

6.6.1 フローティングウィンドウ
6.6.2 SurfaceViewとMediaCodec

6.7 まとめ

第7章 バイトコード実行環境 ──DalvikとART

7.1 Androidのバイトコード実行環境の基礎知識 ……仮想マシンとART

7.1.1 スマホにおけるバイトコードの課題
7.1.2 Androidのバイトコード実行環境の変遷
7.1.3 本章で扱うバイトコード実行環境のバージョンとその方針

7.2 Dalvikバイトコードとdex

7.2.1 dexファイルができるまで
7.2.2 仮想マシンの2つの派閥
7.2.3 2つの仮想マシンの比較
7.2.4 バイトコード比較 ……JavaとDalvik
7.2.5 dexフォーマットとその制約

7.3 メモリ節約の工夫とZygote

7.3.1 フラッシュメモリの仕組みとAndroidのスワップ事情
7.3.2 使用しているメモリの分類
7.3.3 Cleanなメモリとmmap
7.3.4 Androidにおける、実メモリを節約する2つの工夫

7.4 これまでのバイトコード実行環境

7.4.1 Dalvik VM時代
7.4.2 JIT入門
7.4.3 AOT時代

7.5 Nのバイトコード実行環境

7.5.1 Nのバイトコード実行環境概要
7.5.2 Nのバイトコード実行環境、構成要素
7.5.3 ProfileSaverによるプロファイルの保存
7.5.4 BackgroundDexOptServiceの起動と処理内容
7.5.5 dex2oatによるprofile guidedコンパイル
7.5.6 イメージファイルによる起動の高速化
7.5.7 Nのバイトコード実行環境、まとめ

7.6 まとめ

おわりに
索引

ISBN:9784774187594
出版社:技術評論社
判型:A5
ページ数:336ページ
定価:3600円(本体)
発行年月日:2017年03月
発売日:2017年02月23日

0
2025年07月09日

Posted by ブクログ

AndroidのGUIシステムの上(アプリのAPI)から下(ハードウェア)まで、網羅的に解説がなされていた。

概念的な説明(どうしてこんな設計になっているのか、など)から、詳細な説明(具体的なクラス名やAPI名、呼び出し順序など)まで、解説されていた。また、他のGUIシステムを学ぶ場合でも、共通の考え方が多いので、この本に解説されている内容は参考になった。

0
2019年02月10日

Posted by ブクログ

普通にAndroidアプリを作る上では目にしない奥の方まで解説されていて、普段意識しない部分の意味付けを少し把握することができた。layout_weight="1"のときの振る舞いとか、layout_で始まるタグの説明とか。

0
2017年10月10日

「IT・コンピュータ」ランキング