├── Part1 ├── CodeRefs.md └── Errata.md ├── Part2 └── Errata.md └── README.md /Part1/CodeRefs.md: -------------------------------------------------------------------------------- 1 | # ソースコードの参照について 2 | 3 | 本書を読む時には、実際のソースコードも参照したくなる事があると思います。 4 | そうした時の為に関連するソースコードの場所をリンクしておきます。 5 | 6 | ## 参照するサイトについて 7 | 8 | オフィシャルなソースコードは https://android.googlesource.com/ になると思うのですが、 9 | ブラウザからの見やすさを考えて、ミラーされているものはgithubのリンクを使います。 10 | https://github.com/android/ 11 | 12 | また、自分でブラウズする場合は https://sites.google.com/site/devcollaboration/codesearch などのサイトも便利です。 13 | これだけでは追いにくいコードも存在しますが、限界をわきまえて使えばとても便利なサービスです。 14 | 15 | タグとしては本書が参考にしたandroid-7.0.0_r6か、それが無いツリーではそこに近いものを適宜使います。 16 | 17 | なお、一部ファイルサイズが大きすぎてgithubのWeb UIからは目的のコードが表示されないファイルがあります。 18 | その場合は直接ローカルにダウンロードしてエディタなどで開いてみてください。 19 | 20 | 21 | ## 1章 22 | 23 | - 1.3.7 init.rc https://github.com/android/platform_system_core/blob/android-cts-7.0_r6/rootdir/init.rc 24 | 25 | ## 2章 26 | 27 | ### 2.2 LinuxのInputサブシステムとinput_event 28 | 29 | - 2.2.2 マルチタッチの例は例えば以下 https://android.googlesource.com/kernel/msm.git/+/android-7.0.0_r0.47/drivers/input/touchscreen/synaptics_i2c_rmi4.c 30 | 31 | ### 2.4 InputReader 32 | 33 | InputManager周辺のコードはだいたい https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/ にあります。 34 | native下はたぶんgithub側にはホストされていないので公式の方をリンクします。 35 | 36 | - InputReader https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/InputReader.cpp 37 | - InputMapperとそのサブクラスもこちら 38 | - EventHub https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/EventHub.cpp 39 | - デバイスクラスなどはEventHub.hにある https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/EventHub.h 40 | 41 | ### 2.5 InputDispatcherとInputChannel 42 | 43 | - InputDispatcher https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/inputflinger/InputDispatcher.cpp 44 | - InputChannel https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/libs/input/InputTransport.cpp 45 | - ヘッダはこちら https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/include/input/InputTransport.h 46 | 47 | なお、InputManagerServiceは言語境界を超えて広く分散されてしまうが、例えばregisterInputChannel()を見たいなら、以下のあたりを見る。 48 | 49 | - InputManagerServiceのjni https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/jni/com_android_server_input_InputManagerService.cpp 50 | 51 | ## 3章 52 | 53 | - Looper https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/os/Looper.java 54 | - MessageQueue https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/os/MessageQueue.java 55 | - nativePollOnceは、https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/jni/android_os_MessageQueue.cpp から 56 | 以下のpollOnceに行き着く https://github.com/android/platform_system_core/blob/android-cts-7.0_r6/libutils/Looper.cpp 57 | - Handler https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/os/Handler.java 58 | - ActivityThread https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/app/ActivityThread.java 59 | - scheduleLaunchActivity()などの例で本文では出てくる。main()も見てみるとLooperのloop()の呼び方の良い例となっている。詳細は第二巻。 60 | 61 | 62 | ## 4章 63 | 64 | - AssetManager https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/content/res/AssetManager.java 65 | - XmlResourcePraserの取得はopenXmlResourcePraser()のあたりを読む 66 | - LayoutInflater https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/LayoutInflater.java 67 | - PhoneLayoutInflater https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/com/android/internal/policy/PhoneLayoutInflater.java 68 | - XmlBlock https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/content/res/XmlBlock.java 69 | - XmlResourceParserの実装はこのXmlBlockのParserを見る 70 | - ネイティブ側はこちらを経由して https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/jni/android_util_XmlBlock.cpp 71 | - 最終的にResXMLTreeへ https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/androidfw/ResourceTypes.cpp 72 | - ResXMLTreeのsetTo()がmemcpy()しているあたり(本文の4.3.6に相当) 73 | - 本文ではResXMLTreeとResXMLParserの関係は詳細過ぎるという事で省いているが、ResXMLTreeがResXMLParserを持っていて、大部分の仕事はResXMLParserがやっています。 74 | - LinearLayout https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/widget/LinearLayout.java 75 | 76 | ### 4.4 77 | - Activity https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/app/Activity.java 78 | - setContentView()の実体はPhoneWindow側 79 | - PhoneWindow https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/com/android/internal/policy/PhoneWindow.java 80 | - screen_title.xml https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/res/res/layout/screen_title.xml 81 | 82 | ### 4.5 83 | 84 | - View https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/View.java 85 | - ImageView https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/widget/ImageView.java 86 | 87 | ### 4.6 88 | - LinearLayout https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/widget/LinearLayout.java 89 | - ViewGroup https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewGroup.java 90 | 91 | 92 | ## 5章 93 | 94 | - ViewRootImpl https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java 95 | - レンダリングのはじまりはViewRootImplのperformTraversals() -> performDraw() -> draw() 96 | - ThreadedRenderer::draw()呼び出しは以下 https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L2796 97 | - ThreadedRenderer https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ThreadedRenderer.java 98 | - View https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/View.java 99 | - RenderNode http://tools.oesf.biz/android-7.0.0_r1.0/xref/frameworks/base/core/java/android/view/RenderNode.java 100 | - DisplayListCanvas https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/DisplayListCanvas.java 101 | 102 | nSyncAndDrawFrame()は少し大変だが、 103 | 104 | - jniのnSyncAndDrawFrame() https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/jni/android_view_ThreadedRenderer.cpp 105 | - RenderProxy(プロセス間通信) https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/RenderProxy.cpp 106 | - DrawFrameTask(その時のコマンド) https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/DrawFrameTask.cpp 107 | - 少しややこしいけど、別スレッド(RenderThread)がDrawFrameTaskのrun()を呼ぶ 108 | - CanvasContextのdrawRenderNode()が呼ばれる(例えば以下) https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/CanvasContext.cpp#L433 109 | - mCanvasはOpenGLRendererのdrawRenderNode() https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/OpenGLRenderer.cpp#L1427 110 | 111 | ### 5.3 112 | 113 | - DisplayListOp https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/DisplayListOp.h 114 | 115 | 116 | ### 5.4 117 | 118 | - View https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/View.java 119 | - ViewGroup https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewGroup.java 120 | - android_view_RenderNode_offsetTopAndBottomとSET_AND_DIRTY https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/jni/android_view_RenderNode.cpp 121 | - fling()処理はこちら AbsListView https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/widget/AbsListView.java 122 | - なお、RecyclerViewのfling()は全く同じコード 123 | - https://github.com/android/platform_frameworks_support/blob/android-cts-7.0_r6/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java#L1866 124 | 125 | ## 6章 126 | 127 | ### 6.2 HALとgralloc 128 | 129 | - hw_get_module() https://github.com/android/platform_hardware_libhardware/blob/android-cts-7.0_r6/hardware.c 130 | - 実際の処理はhw_get_module_by_class() 131 | - さらにその中で呼ばれるload()でdlopen()が呼ばれる 132 | - hw_moduel_tの定義など https://github.com/android/platform_hardware_libhardware/blob/android-cts-7.0_r6/include/hardware/hardware.h 133 | - hw_module_tのgrallocの定義 https://github.com/android/platform_hardware_libhardware/blob/android-cts-7.0_r6/modules/gralloc/gralloc.cpp 134 | - HAL_MODULE_INFO_SYMのあたり 135 | - HAL_PIXEL_FORMATの一覧 https://github.com/android/platform_system_core/blob/android-cts-7.0_r6/include/system/graphics.h 136 | - GRALLOC_USAGEの一覧 https://github.com/android/platform_hardware_libhardware/blob/android-cts-7.0_r6/include/hardware/gralloc.h 137 | 138 | ### 6.3 EGLによるOpenGL ES描画対象の指定 139 | 140 | egl呼び出しとgrallocの間は、実際はかなりいろんなクラスが出てきて、コードを全部追うのは大変です。 141 | 基本的な構造は本書で説明した通りですが、実際にコードを追いたいなら多くの瑣末な間接クラスを見ていく必要があります。 142 | 143 | 間接参照が多い類のコードなのでここに全部参照を貼るのは難しくなっています。 144 | この手のコードを理解するのは、実際に頑張ってコードを読んでもらうのが一番と思いますが、その時のヒントを幾つか書いておきます。 145 | 146 | 1. EGL関連呼び出しはCanvasContextが行うが、これはRenderProxyが呼び出している(RenderProxyについては本書5.2.2などで簡単に解説してあります) 147 | 2. RenderProxyはThreadedRendererから呼ばれる(ThreadedRendererは本書5.2を参照) 148 | 149 | 以上を踏まえて、主要な所だけを見ていきましょう。 150 | 151 | #### eglCreateWindowSurface()とeglMakeCurrent()がCanvasContextのどこで呼ばれているかを見る 152 | 153 | - eglCreateWindowSurface()はCanvasContextのinitializeで呼ばれる 154 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/CanvasContext.cpp#L97 155 | - mEglManager::createSurface()でeglCreateWindowSurface()が呼ばれる 156 | - eglMakeCurrent()はEglManagerのbeginFrame()で呼ばれて、それはCanvasContext::draw()で呼ばれる 157 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/CanvasContext.cpp#L309 158 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/EglManager.cpp#L304 159 | 160 | こうして、eglCreateWindowSurface()がeglMakeCurrent()される事は分かった。 161 | このCanvasContextのメソッドは以下のRenderProxyから呼ばれる。 162 | 163 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/RenderProxy.cpp#L137 164 | - initializeはここ 165 | - CREATE_BRIDGE2マクロについては私の以前のブログなども参照のこと http://karino2.livejournal.com/370929.html 166 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/libs/hwui/renderthread/RenderProxy.cpp#L543 167 | - drawはここのprepareAndDrawから呼ばれる。 168 | 169 | 170 | ### 6.4 SurfaceFlingerとHWC 171 | 172 | 6.3同様、6.4も間接参照やらBinderによる辿りにくい依存関係があって読んで行くのは大変です。 173 | ここも膨大なリンクの羅列では無く、読んでく上でのヒントを書いていく事にします。 174 | 175 | #### BufferQueueProducerとgralloc周辺を追う 176 | 177 | - BufferQueueProducerのallocateBuffers()がgrallocを呼んでいる 178 | - これはBinder越しにSurfaceのallocateBuffers()が呼ぶ 179 | - 基本的には以下のフォルダ下 180 | - https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/libs/gui/ 181 | - SurfaceのallocateBuffers()はViewRootImplから呼ばれる 182 | - https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/ViewRootImpl.java#L1852 183 | 184 | #### HWCのprepare周辺、HWC1 185 | 186 | HWCはちょうど現在HWC2という、よりオブジェクト指向的なインターフェースとなっているHALへの置き換えが行われている所になっています。 187 | 書籍執筆時点ではHWC1の内容で解説してあります。ここでは本文との対応を追う目的としてHWC1のコードを示しつつ、その後HWC2の話も少し補足しておく事にします。 188 | 189 | まずHWC1から。 190 | 191 | HWCはHWComposerというクラスに保持されている。 192 | SurfaceFlingerがこのHWComposerを使用する。 193 | 194 | - HWC1のprepare()呼び出しはここ https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp#688 195 | 196 | HWC内のhwc_layer_1がどこからくるのかをちゃんと読んで行くのは大変だが、 197 | 基本的にはSurfaceFlinger内のLayerというオブジェクトとだいたい対応づいている。 198 | 199 | LayerはBufferQueueProducerを保持しているもの。グラフィックスバッファを持っている物と言い換えても良い。 200 | Layer周辺を全部読むのも大変だが、IGraphicBufferProducerとの対応付けはonFirstRef()のあたりを読むと良い。 201 | 202 | - Layer::onFirstRef() https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/surfaceflinger/Layer.cpp#152 203 | 204 | これらを使っているのは、少し古いSurfaceFlingerのコードを見る必要がある。例えばMarshmallowのコードは以下。 205 | 206 | - MarshmallowのSurfaceFlinger::doComposeSurfaces() https://android.googlesource.com/platform/frameworks/native/+/marshmallow-mr1-release/services/surfaceflinger/SurfaceFlinger.cpp#1994 207 | 208 | 以上が本文で説明しているコードとなります。 209 | 210 | #### HWC2の話 211 | 212 | Nougatのコードだと基本的にはHWC2が使われています。 213 | 細かい所は違いますが、本質的にはフラグの名前がHWC_FRAMEBUFFERからHWC2::Composition::Clientと呼ばれるようになっているだけで、大きくは変わりません。 214 | 215 | - NougatのSurfaceFlinger::doComposeSurfaces() https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/services/surfaceflinger/SurfaceFlinger.cpp#2028 216 | - HWC2の公式ドキュメント https://source.android.com/devices/graphics/implement-hwc.html#interface_activities 217 | - 最後の方にsync回りの変更の記述あり 218 | 219 | 220 | ### 6.5 ViewRootImpl 221 | 222 | 6.4までに比べると、6.5のコードは普通に読む人も多いと思います。 223 | WindowManagerService側のコードは読むのは大変ですが、ViewRootImplくらいまでなら楽しく読めるのでは無いでしょうか? 224 | 225 | #### DecorViewの登録 226 | 227 | - DecorViewの登録 https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/app/ActivityThread.java#L3537 228 | - このaddViewはWindowsManagerGlobalというクラスの物 https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/WindowManagerGlobal.java#L263 229 | - ここでViewRootImplが生成されたり、このViewRootImplにViewツリーがセットされたりする。 230 | - ViewRootImplのWindowManagerへの登録はViewRootImpl側のsetView() 231 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L640 232 | - 実際はWindowSessionという物に登録している事が分かる 233 | - InputChannelの登録もここ 234 | 235 | #### ThreadedRenderer等の初期化など 236 | 237 | ThreadedRendererの初期化なども、上記のViewRootImpl::setView()の中で行われている。 238 | 239 | - ViewRootImpl::setView() https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L595 240 | - enableHardwareAcceleration()呼び出しが行われている 241 | - ViewRootImpl::enableHardwareAcceleration()内でThreadedRenderer::create()が呼ばれている 242 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L878 243 | - ThreadedRenderer::create() https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ThreadedRenderer.java#L252 244 | - ThreadedRendererのコンストラクタではRenderProxyが作られ、そこからRenderThreadやEGL関連などのさまざまな重要な初期化が行われる 245 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ThreadedRenderer.java#L351 246 | - ここからは難しくはないので自分で追ってみてください。 247 | 248 | #### ViewRootImplのperformTraversals() 249 | 250 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L1436 251 | 252 | #### ViewRootImplの入力処理全般 253 | 254 | まずはInputChannelの登録。少し関連処理が散らばっているが、全てsetView()メソッドの中にある。 255 | 256 | - mInputChannelの生成 https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L631 257 | - 登録 https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L639 258 | - WindowInputReceiverとの関連付け https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L726 259 | - WindowInputReceiverはイベントがやってくるとenqueueInputEventする https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/view/ViewRootImpl.java#L6313 260 | - ここから先は割と素直なので読んでみていただけたらと。 261 | 262 | 263 | ## 7章 264 | 265 | 7章はとりあえずNougatについての記述の所だけ集めておきます。 266 | ICSなどのコードも読むと面白い発見はありますが、さすがに趣味の世界でしょう(このページ自体趣味の世界ですが…) 267 | 268 | ### 7.5 Nのバイトコード実行環境 269 | 270 | - ProfileSaver::Start()などはこちら https://android.googlesource.com/platform/art/+/android-7.0.0_r6/runtime/jit/profile_saver.cc 271 | - これが呼ばれるのはLoadedApkのVMRuntime.registerAppInfo()呼び出しから追うと分かりやすい 272 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/core/java/android/app/LoadedApk.java#L597 273 | - 実際にプロファイル情報を集めるのは同じファイル(ProfileSaver)のProcessProfilingInfo()を読む 274 | - BackgroundDexOptServiceの登録はこちら https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/BackgroundDexOptService.java#L69 275 | - profile guidedコンパイルが行われる条件が分かる(充電中とかアイドルとか) 276 | - そこから呼ばれるperformDexOpt()は、いろいろ通ってperformDexOptInternalWithDependenciesLI()に行き着く 277 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/PackageManagerService.java#L7453 278 | - そこからPackageDexOptimizer::perfromDexOpt()を呼んでいるのが分かる 279 | - 本体はperformDexOptLI() https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/PackageDexOptimizer.java#L152 280 | - merge_profile呼び出しはここ https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/PackageDexOptimizer.java#L182 281 | - その結果を受けてdexoptが呼ばれる https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/PackageDexOptimizer.java#L257 282 | - 渡しているフラグでprofile guided compileが行われるかが決まる。フラグの場所は以下。 283 | - https://github.com/android/platform_frameworks_base/blob/android-cts-7.0_r6/services/core/java/com/android/server/pm/PackageDexOptimizer.java#L248 284 | 285 | #### dexopt呼び出しから 286 | 287 | installdはdexoptコマンドのメッセージを受け取ると、dexopt()関数を呼び出す。 288 | 289 | - dexopt()はrun_dex2oat()を呼び出す https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/cmds/installd/commands.cpp#1538 290 | - run_dex2oat()の引数のprofile_fdに注意して追う https://android.googlesource.com/platform/frameworks/native/+/android-7.0.0_r6/cmds/installd/commands.cpp#694 291 | - dex2oatより先はこの辺から https://android.googlesource.com/platform/art/+/android-7.0.0_r6/dex2oat/dex2oat.cc#2613 292 | - イメージファイル周辺もこの辺 293 | 294 | -------------------------------------------------------------------------------- /Part1/Errata.md: -------------------------------------------------------------------------------- 1 | # Androidを支える技術 I 正誤表 2 | 3 | |ページ | 誤 | 正 | 4 | | ---- | --- | --- | 5 | | ix | 実際の原稿は7.0 Nougatを元に書きました。 | 実際の原稿は7.0 Nougatを元に書きましたが、6.4.7と6.4.8に関しては更新が間に合わず、6.0 Marshmallow のコードを元とした解説となっています。 | 6 | | p153 | このint値の上位2bitに、この値の種類を表す情報や丸め込まれた等の付加情報など、いろいろな数値を埋め込むことになっています。この付加情報のうち、上位の2bitにはMODEと言われる値の種類を入れることになっていて、 | このint値の上位2bitに、MODEと言われる値の種類を入れることになっていて、| 7 | | p170 | | (初代のNexus 7は最初から4.1でした)| 8 | | p206 | | (初代のNexus 7は最初から4.1で、アップデートは4.2, 4.3, 4.4, 5.0まで提供されました。アップデートの都度遅くなっていったのは本文の通り) | 9 | | p275 | |0と1が反対でした。電荷が封入されていると0、放出状態が1で、イレースすると全て1になり、0を書きこむ事だけが出来ます。| 10 | -------------------------------------------------------------------------------- /Part2/Errata.md: -------------------------------------------------------------------------------- 1 | # Androidを支える技術 II 正誤表 2 | 3 | |ページ | 誤 | 正 | 4 | | ---- | --- | --- | 5 | | p53 | SharedProfile | SharedPreferences | 6 | | p88~89 | | 0と1が反対でした。電荷が封入されていると0、放出状態が1で、イレースすると全て1になり、0を書きこむ事だけが出来ます。 | 7 | | p192 | beak; | break; | 8 | | p242 | とい名前 | という名前 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Androidを支える技術サポートページ 2 | 3 | Androidを支える技術のサポートページです。 4 | 目次はリンク先から見る事が出来ます。 5 | 6 | 7 | ![Androidを支える技術II、書影](https://github.com/karino2/AndroidSupportTech/blob/images/front_page_2.png) 8 | - [Androidを支える技術〈Ⅱ〉 ──真のマルチタスクに挑んだモバイルOSの心臓部](http://gihyo.jp/book/2017/978-4-7741-8861-4) 電子版もこちらから。 9 | - [Amazonのリンク](https://www.amazon.co.jp/dp/4774188611/) 10 | 11 | #### Androidを支える技術〈Ⅱ〉の内容紹介 12 | 13 | - [Androidを支える技術IIの概要文とサブタイトルはどうしてああなったのか?](http://karino2.livejournal.com/430500.html) 14 | - [プロセスの「使われ方」を知るにはActivityを調べるのが良い](http://karino2.livejournal.com/430592.html) 15 | - [Androidらしい画面遷移を実現する為に必要な事](http://karino2.livejournal.com/430965.html) 16 | 17 | ---- 18 | 19 | ![Androidを支える技術I、書影](https://github.com/karino2/AndroidSupportTech/blob/images/front_page.png) 20 | 21 | - [Androidを支える技術〈Ⅰ〉 ──60fpsを達成するモダンなGUIシステム](http://gihyo.jp/book/2017/978-4-7741-8759-4) 電子版もこちらから。 22 | - [Amazonのリンク](https://www.amazon.co.jp/dp/4774187593) 23 | 24 | #### Androidを支える技術〈Ⅰ〉の内容紹介 25 | 26 | - [PCのメモリサブシステムとGUIシステムの比較(Androidを支える技術〈Ⅰ〉の内容紹介)](https://gist.github.com/karino2/5ad8c0ca2966399de3bb7be5e070073f) 27 | - [GUIシステムの教科書を書きたかった: Androidを支える技術、の話](http://karino2.livejournal.com/430253.html) 28 | 29 | 30 | ## 正誤表 31 | 32 | - [第一巻、正誤表](./Part1/Errata.md) 33 | - [第二巻、正誤表](./Part2/Errata.md) 34 | 35 | ## コード参照一覧 36 | 37 | 本書で解説している内容に対応する、実際のコードのリストです。 38 | 39 | [第一巻コードリスト](./Part1/CodeRefs.md) 40 | 41 | 42 | ## Binderについて 43 | 44 | Binderは分量が多すぎる為、1巻と2巻に含めるのは諦めました。 45 | 3巻にするには量が中途半端であり、また草稿を完成稿まで持っていくだけの時間も取れそうにないので、 46 | 草稿のままas isで、フリーで公開する事にしました。pdf版とepub版を作っています。 47 | 以下のリンクからどうぞ。 48 | 49 | [別冊: 詳説Binder](https://github.com/karino2/InsideBinder/blob/master/README.md) 50 | --------------------------------------------------------------------------------