Skip to content

Latest commit

 

History

History
293 lines (202 loc) · 21.6 KB

CodeRefs.md

File metadata and controls

293 lines (202 loc) · 21.6 KB

ソースコードの参照について

本書を読む時には、実際のソースコードも参照したくなる事があると思います。 そうした時の為に関連するソースコードの場所をリンクしておきます。

参照するサイトについて

オフィシャルなソースコードは https://android.googlesource.com/ になると思うのですが、 ブラウザからの見やすさを考えて、ミラーされているものはgithubのリンクを使います。 https://github.com/android/

また、自分でブラウズする場合は https://sites.google.com/site/devcollaboration/codesearch などのサイトも便利です。 これだけでは追いにくいコードも存在しますが、限界をわきまえて使えばとても便利なサービスです。

タグとしては本書が参考にしたandroid-7.0.0_r6か、それが無いツリーではそこに近いものを適宜使います。

なお、一部ファイルサイズが大きすぎてgithubのWeb UIからは目的のコードが表示されないファイルがあります。 その場合は直接ローカルにダウンロードしてエディタなどで開いてみてください。

1章

2章

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

2.4 InputReader

InputManager周辺のコードはだいたい https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/ にあります。 native下はたぶんgithub側にはホストされていないので公式の方をリンクします。

2.5 InputDispatcherとInputChannel

なお、InputManagerServiceは言語境界を超えて広く分散されてしまうが、例えばregisterInputChannel()を見たいなら、以下のあたりを見る。

3章

4章

4.4

4.5

4.6

5章

nSyncAndDrawFrame()は少し大変だが、

5.3

5.4

6章

6.2 HALとgralloc

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

egl呼び出しとgrallocの間は、実際はかなりいろんなクラスが出てきて、コードを全部追うのは大変です。 基本的な構造は本書で説明した通りですが、実際にコードを追いたいなら多くの瑣末な間接クラスを見ていく必要があります。

間接参照が多い類のコードなのでここに全部参照を貼るのは難しくなっています。 この手のコードを理解するのは、実際に頑張ってコードを読んでもらうのが一番と思いますが、その時のヒントを幾つか書いておきます。

  1. EGL関連呼び出しはCanvasContextが行うが、これはRenderProxyが呼び出している(RenderProxyについては本書5.2.2などで簡単に解説してあります)
  2. RenderProxyはThreadedRendererから呼ばれる(ThreadedRendererは本書5.2を参照)

以上を踏まえて、主要な所だけを見ていきましょう。

eglCreateWindowSurface()とeglMakeCurrent()がCanvasContextのどこで呼ばれているかを見る

こうして、eglCreateWindowSurface()がeglMakeCurrent()される事は分かった。 このCanvasContextのメソッドは以下のRenderProxyから呼ばれる。

6.4 SurfaceFlingerとHWC

6.3同様、6.4も間接参照やらBinderによる辿りにくい依存関係があって読んで行くのは大変です。 ここも膨大なリンクの羅列では無く、読んでく上でのヒントを書いていく事にします。

BufferQueueProducerとgralloc周辺を追う

HWCのprepare周辺、HWC1

HWCはちょうど現在HWC2という、よりオブジェクト指向的なインターフェースとなっているHALへの置き換えが行われている所になっています。 書籍執筆時点ではHWC1の内容で解説してあります。ここでは本文との対応を追う目的としてHWC1のコードを示しつつ、その後HWC2の話も少し補足しておく事にします。

まずHWC1から。

HWCはHWComposerというクラスに保持されている。 SurfaceFlingerがこのHWComposerを使用する。

HWC内のhwc_layer_1がどこからくるのかをちゃんと読んで行くのは大変だが、 基本的にはSurfaceFlinger内のLayerというオブジェクトとだいたい対応づいている。

LayerはBufferQueueProducerを保持しているもの。グラフィックスバッファを持っている物と言い換えても良い。 Layer周辺を全部読むのも大変だが、IGraphicBufferProducerとの対応付けはonFirstRef()のあたりを読むと良い。

これらを使っているのは、少し古いSurfaceFlingerのコードを見る必要がある。例えばMarshmallowのコードは以下。

以上が本文で説明しているコードとなります。

HWC2の話

Nougatのコードだと基本的にはHWC2が使われています。 細かい所は違いますが、本質的にはフラグの名前がHWC_FRAMEBUFFERからHWC2::Composition::Clientと呼ばれるようになっているだけで、大きくは変わりません。

6.5 ViewRootImpl

6.4までに比べると、6.5のコードは普通に読む人も多いと思います。 WindowManagerService側のコードは読むのは大変ですが、ViewRootImplくらいまでなら楽しく読めるのでは無いでしょうか?

DecorViewの登録

ThreadedRenderer等の初期化など

ThreadedRendererの初期化なども、上記のViewRootImpl::setView()の中で行われている。

ViewRootImplのperformTraversals()

ViewRootImplの入力処理全般

まずはInputChannelの登録。少し関連処理が散らばっているが、全てsetView()メソッドの中にある。

7章

7章はとりあえずNougatについての記述の所だけ集めておきます。 ICSなどのコードも読むと面白い発見はありますが、さすがに趣味の世界でしょう(このページ自体趣味の世界ですが…)

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

dexopt呼び出しから

installdはdexoptコマンドのメッセージを受け取ると、dexopt()関数を呼び出す。