『Androidを支える技術〈Ⅰ〉 ~ 60fps を達成するモダンな GUI システム』を読んで

Androidを支える技術〈Ⅰ〉 ~ 60fps を達成するモダンな GUI システム』を読みました。

Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)

Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム (WEB+DB PRESS plus)

感想

単純にとても面白かったです。

昔、Web ブラウザのレンダリングエンジンをいじっていた頃があって、ちょっとだけそのときのことを思い出した。 ツリーがあって、それをレイアウトして、描画ライブラリに投げて、その先が GPU で、っていう一連の処理とか。(ブラウザだと DOM Tree と Render Tree が別だったりしたね)。 大して理解もしないままその世界から離れてしまったけども。

思い出話は置いておいて、この本の何がすごいかというと、

  • 上は View ツリーの話から、下はシステムコールの話まで書いてある
  • 豊富な図解と分かりやすい説明
  • 現実のコードをベースにした展開
  • 著者が中の人じゃない

というところ。

知識を文字にする時って、実際にアウトプットすることの数倍の知識が必要だと思う。 だから、この筆者はこの本に書かれた数倍の知識を持ってるんだよなーと思って、すごいなーと思った(小並感)。 というか、書籍にまとめるレベルになると10倍くらい必要かもね、、、

感心したところ

HWC と GPU 周りはとても感心して、とくに SurfaceView の仕組みはなるほどーと思った。

  • SurfaceView の View としての特性は「単に領域に穴をあける」だけ(下の描画結果を透過する)
  • アプリレイヤでは SurfaceView.getHolder().getSurface() で Surface が取得できる
    • Surface というのは gralloc() で確保したメモリ領域へのハンドラ。
    • gralloc() は端末ベンダーによって実装される。大抵は描画ハードウェア(GPU や HWC)に近いメモリに置かれる。
  • アプリレイヤで取得したこの Surface を、メディアコーデックに渡す。
    • 結果、コーデックチップが Surface が指す先のメモリに直接結果を書くことができる、
    • そすうれば CPU を使う必要がなくて電池も消費しないしハッピー。
    • さらにいうと、合成に HWC が使えるなら GPU も使わなくていい!

図にするとこんな感じ(本から引用) ^(1)

f:id:hjm333:20170905223646p:plain

うーん、仕組みもよくできているし説明もすごく分かりやすかった。 (gralloc とかなんだよって話だけど、それは本書を読んでください)

(1): 有野和真.『Androidを支える技術〈Ⅰ〉~ 60fps を達成するモダンな GUI システム』,技術評論社,2017.図 6.16(p.250).

得られたもの

この本を読むとなんとなく Android が理解できた気分になれる。

結局、得られるのは気分だけなんだよね。 当たり前だけど。 実際に自分でコードを追ってデバッグしてってやらないと本当に使える知識/技術にはならない(少なくとも自分にとってはね)

だけども、このなんとなく理解出来た気になるのはけっこう重要かなぁという気もしている。 どこかに誰かも書いていたけど、例えばクラッシュログを見ていて、

うーん、この ViewRootImpl.java ってシステム側だからなぁ、、、とりあえずクローズかな、、、

と思っていたのが

そういえば、ここらへん本に出てたし、ちょっと見てみるかな(キリッ

という根拠のない自信に変わったりする。

そう思ってコードを読んだところで、なかなか結果は変わらないんだけど(だって変化したのは気分だけだからね)、こういう姿勢の変化は結構重要だったりする。 めげずにコード読んでるとたまーに結果が出て幸せになれたり、そもそも実際に読んでみないことには知識も得られないままだからね。

Android に対して「まあ、ちょっとコード読んでみるか」というメンタリティが持てるようになったことが、この本を読んで得られた最大のポイントかな。 あとは普通に読んでて楽しかったです(2回目)

Vol. 2 も出ていて、話題的にはこちらの方が興味があるので読むのが楽しみー。