有野和真のレビュー一覧

  • Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部

    Posted by ブクログ

    Web+DB Press Plus
    Androidを支える技術 II
    真のマルチタスクに挑んだモバイルOSの心臓部
    著:有野 和真
    出版社:技術評論社

    Android は、Javaと Linuxの世界であり、有限のメモリと電源を詰め込んだ組込み系のシステムと映りました

    最終章から逆によむのがいいと、あまのじゃくの考えが浮かびました。

    ブートローダから、カーネルのロード、これって昔のボードコンピュータ。

    Activityは、スタックで管理していて、戻り値を保存している

    メモリの関係で、Activityがいっぱいになったら、あるロジックで、Activityを自動的に消し込んでいって、
    万が一、戻り値がのこっていて、Activityにもどろうとしていたら、Killされていたら、復元する

    iphoneについては、Linux陣営がいろいろトライをしたが、結局 Android 以外はすべて絶命した

    本書を読むにあたっては、オブジェクト指向の知識をあらかじめ用意しておかないと何が書いているかわからない。とくに、クラスとかインスタンスなどの用語を事前に仕入れておいたほうがいいと思います。

    目次

    本書について

    第1章 AndroidとActivityの基礎知識

    1.1 Activityが実現する世界

    1.1.1 スマホにおける画面遷移の標準を提供
    1.1.2 たくさんのアプリが共同でタスクをこなす

    1.2 [入門]Activityプログラミング

    1.2.1 まずはHelloActivityから
    1.2.2 あるAというActivityからHelloActivityを起動してみる
    1.2.3 テキストファイルを別のアプリで開いてみる
    1.2.4 ギャラリーアプリなどで画像を選ぶ
    1.2.5 Activityが再生成された時の対応
    1.2.6 Activityのライフサイクルとは何か?

    1.3 Activityはどう実現されているのか?

    1.3.1 アプリのインストールとActivityの情報の管理
    1.3.2 メモリ不足時のプロセスkill
    1.3.3 Activityのスタック管理とライフサイクル
    1.3.4 アプリのプロセスの生成とアプリから見たライフサイクル
    1.3.5 システムの始まり ……[第6章]ブートローダーとinit

    1.4 [速習]本書で登場するAndroidの構成要素のうち、本書の主役ではない部分

    1.4.1 LooperとUIスレッド
    1.4.2 HandlerとhandleMessage()
    1.4.3 Binderとシステムサービス

    1.5 Activityの仕組みを支えるデーモンとシステムサービス達

    1.5.1 init.rcファイルの今と昔 ……mount_all
    1.5.2 serviceセクション
    1.5.3 本書で登場する、initから起動されるサービスとデーモン達

    1.6 まとめ

    第2章 [詳説]アプリのインストールとその情報

    2.1 Google Playの衝撃 ……ユーザーも! 開発者も! 世界がつながるマーケット

    2.1.1 Google Playを実現するために必要な2つの前提
    2.1.2 かつての携帯電話のOSには、プロセスがなかった
    2.1.3 アプリの権限を制限する仕組み
    2.1.4 Androidは、Linuxのセキュリティ機構を応用したセキュリティモデル

    2.2 アプリのインストール

    2.2.1 アプリのインストールの概要
    2.2.2 uidの割り振り

    2.3 installdによるdataディレクトリの作成

    2.3.1 dataディレクトリ
    2.3.2 installdプロセスの起動
    2.3.3 installdの権限
    2.3.4 dataディレクトリの作成と権限設定
    2.3.5 dataディレクトリに置かれるファイル達
    2.3.6 dexoptコマンドによるバイトコードのインストール時処理

    2.4 packages.xmlによるアプリの管理
    2.4.1 packages.xmlの役割
    2.4.2 実際のpackages.xmlの中身
    2.4.3 起動時のpackages.xml読み込み
    2.4.4 packages.xmlの権限と重要性

    2.5 インテントとインテントの解決

    2.5.1 インテントを送る側
    2.5.2 インテントを受け取る側
    2.5.3 インテントの解決

    2.6 まとめ

    第3章 カーネル側から見たメモリ不足

    3.1 [基礎知識]メモリ不足時のカーネル側の振る舞い

    3.1.1 メモリ不足時のカーネル側の振る舞い、全体像
    3.1.2 Linuxカーネルのメモリ回収とoom_score_adj
    3.1.3 lmkdデーモンとスコア更新
    3.1.4 lowmemorykillerドライバ

    3.2 Linuxカーネルのメモリ回収

    3.2.1 Linuxのページフレーム回収の難しさ
    3.2.2 Linuxのページフレーム回収の概要
    3.2.3 OOM Killerとoom_score
    3.2.4 oom_score_adjとOOM Killerの挙動のカスタマイズ

    3.3 AndroidのLow Memory Killer

    3.3.1 フラッシュメモリの仕組みとAndroidのスワップ事情
    3.3.2 Low Memory Killerの基礎知識
    3.3.3 lowmemorykillerモジュールとshrinker
    3.3.4 lmkdデーモンとoom_score_adj更新

    3.4 まとめ

    第4章 [徹底攻略Ⅰ]スタックから見た!Activityのライフサイクル

    4.1 ActivityStackとタスク ……遷移をデザインする技術

    4.1.1 なぜActivityをスタック構造で管理するのか?
    4.1.2 タスク
    4.1.3 タスク作成を意識する難しさ
    4.1.4 Activityを管理するスタック ……ActivityStack概要
    4.1.5 ActivityStackとタスクの戻り先フラグ
    4.1.6 launchModeとインテントフラグ
    4.1.7 タスクとActivityStackの具体例❶ ……通常のActivity起動のケース
    4.1.8 タスクとActivityStackの具体例❷ ……launchModeがsingleTaskのケース
    4.1.9 タスクとActivityStackの具体例❸ ……インテントフラグのFLAG_ACTIVITY_CLEAR_TOPを用いた
    4.1.10 タスクとActivityStackについての考え方

    4.2 アプリ側から見たメモリ不足

    4.2.1 Androidにおける重要なプロセス
    4.2.2 ActivityStackとoom_score_adj

    4.3 Activityの生成 ……ActivityRecordとBundle

    4.3.1 ActivityStackとActivityRecord
    4.3.2 Bundleはどこにあるのか?
    4.3.3 Bundleはどのくらいkillされないか?
    4.3.4 ActivityRecordからのActivity生成

    4.4 Activityのライフサイクル

    4.4.1 Activityのライフサイクル概要
    4.4.2 Activityのライフサイクルで実現したいこと
    4.4.3 Activityのライフサイクル❶ ……ActivityStackの視点から
    4.4.4 ActivityRecordの一時的な実体としてのActivity
    4.4.5 Activityのライフサイクル❷ ……Activityインスタンスの視点から
    4.4.6 Activityのライフサイクル❸ ……ActivityManagerServiceの視点から
    4.4.7 [再考]Activityのライフサイクル ……Androidらしいアプリの姿

    4.5 まとめ

    第5章 [徹底攻略Ⅱ]アプリのプロセスから見る! Activityの生成と再生成

    5.1 [基礎知識]アプリ側プロセスのActivity
    5.1.1 プロセスの生成からアプリのプロセスになるまで
    5.1.2 アプリのプロセスが、Activityを生成するまで

    5.2 バイトコードを実行するプロセスとその始まり

    5.2.1 app_processとそのmain()関数
    5.2.2 ZygoteInitのmain()メソッドの3つの処理
    5.2.3 preload()メソッドでロードされるクラス達
    5.2.4 runSelectLoop()メソッド処理概要
    5.2.5 ZygoteのforkAndSpecialize()とProcess.start()メソッド
    5.2.6 startSystemServer()メソッドとSystemServerプロセス

    5.3 ActivityThreadとは何か?

    5.3.1 ActivityThreadの3つの重要なメソッド
    5.3.2 ActivityThreadの役割

    5.4 ActivityThreadの構成要素とmain()メソッド

    5.4.1 ActivityThreadのmain()メソッド
    5.4.2 ActivityThreadの2つの内部クラス

    5.5 attach()メソッドとApplication Contextの誕生

    5.5.1 attach()メソッドで行われること
    5.5.2 handleBindApplication()でのApplication ContextとApplicationインスタンスの作成
    5.5.3 attach()メソッドの呼び出しスタック

    5.6 ActivityThreadのhandleMessage()
    5.6.1 handleMessage()周辺の構造
    5.6.2 ActivityとContextの誕生
    5.6.3 Hのメッセージ概観

    5.7 アプリの開始を見直す

    5.7.1 本節で見ていくstartActivity()の呼び出しコード例
    5.7.2 最初はインテントの解決
    5.7.3 プロセスの開始と初期化
    5.7.4 oom_score_adjによるプロセスのkill
    5.7.5 「アプリの開始」解説の結びに

    5.8 まとめ

    第6章 Androidの始まり

    6.1 ブートローダーとその周辺

    6.1.1 電源を入れてからinitを起動するまでの概要
    6.1.2 Android端末のパーティション
    6.1.3 ブートイメージとリカバリーイメージ

    6.2 Androidのブートローダー

    6.2.1 LKブートローダーとは何か?
    6.2.2 通常のブートローダーの処理
    6.2.3 fastboot概要
    6.2.4 ブートローダーの話、終わりに

    6.3 initプロセスとその始まり

    6.3.1 initプロセスとその処理概要
    6.3.2 initプロセスの始まり
    6.3.3 initのmain()関数後半
    6.3.4 initのシグナル処理

    6.4 プロパティ

    6.4.1 プロパティの具体例
    6.4.2 特殊なプロパティ
    6.4.3 プロパティのlistener
    6.4.4 プロパティの実装

    6.5 init.rcとその内容

    6.5.1 PCのrcスクリプトとの比較
    6.5.2 Android Init Language概要
    6.5.3 アクションとトリガー
    6.5.4 さまざまなトリガー
    6.5.5 serviceによるサービス定義

    6.6 まとめ

    A.1 ActivityのonSaveInstanceState()デフォルト実装

    A.1.1 基本事項のおさらい
    A.1.2 実際のActivityのonSaveInstanceState()のコード
    A.1.3 PhoneWindowのsaveHierarchyState()
    A.1.4 ParcelとParcelable
    A.1.5 ViewのsaveHierarchyState()より先の処理
    A.1.6 dispatchSaveInstanceState()を眺める

    おまけ
    おわりに
    索引

    0
    2025年09月03日
  • Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム

    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日
  • Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部

    Posted by ブクログ

    Android端末の内部でOSがどのような処理を行っているのかしっかりと理解してアプリ開発に役立てたい人におすすめ。筆者はガラケー時代から携帯端末のOS開発に携わった技術者とのことで、ITRON, SymbianなどのOSの話からWindows Mobileへの期待感、iPhone登場時のショックとその後のAndroidの成長などについて、本文とは別枠で書かれたコラムがとても面白かった。

    0
    2019年03月13日
  • Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム

    Posted by ブクログ

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

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

    0
    2019年02月10日
  • Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部

    Posted by ブクログ

    職場の大先輩におすすめされ、しかも貸してもらえた。

    ActivityというAndroidのアプリケーション構成要素を軸に、スマホというモバイル家電でいかにマルチタスクシステムを矛盾なく構築したか、が書かれている。

    書店でAndroidコーナーに行くとアプリケーション開発手法ばかりが取り上げられている中で、純粋にAndroid内部について書かれた(しかも日本人原著の!)貴重な本。

    Androidアプリ開発経験と、Linuxの知識がある人をメインの想定読者としているが、読み進める上で最低限必要なことはちゃんと説明してくれている。

    コラムでは、著者がずっと関わってきた携帯ソフト開発業界の歴史などが書かれていて、それもそれだけで本にできるんじゃないかというぐらい面白い。

    - メモリ不足対策
    - スマホでは、ユーザがプロセスを明示的に終了することを期待できない上に、フラッシュストレージのデバイス特性により、スワップ領域を用意することもできないため、メモリが不足する状態が普通に発生する。
    - そのため、メモリが不足したとき、Androidシステム上優先度の低いプロセスを自動で終了させる仕組みが必要となる。(例えば、裏に回ってしばらく使われていないActivityなど)
    - Androidでは自動で終了させる仕組みは二段構えとなっており、少しメモリが不足してきたタイミングでAndroid独自ドライバによって行われるものと、かなりメモリが不足してきたタイミングでLinuxの提供するOOM killerによって行われるものとがある。
    - どちらもoom_scoreに準じてどのプロセスを終了するかが選択される。
    - lmkd : oom_scoreを調整するデーモンプロセス
    - lowmemorykillerドライバ:linux kernelの提供するshrink_slab()を契機に、oom_scoreに準じてActivityを終了させる、Linux Kernel module。

    - Activityの管理
    - SystemServerプロセスのActivityManagerServiceクラスがActivityStackを管理する。
    - 状態の変化に応じて、Activityにメッセージを送ったり、終了している場合はプロセスの再生成を行う。
    - ActivityStackはActivityの再現に必要なすべての情報をもつActivityRecordを管理している。

    - Activityの起動
    - ZygoteサービスにActivityの起動依頼をしたら、zygoteサービスがforkし、setuidしたりlisten用のsocketを準備してから、指定したクラスのmainメソッドを呼び出す。

    - 工夫
    - 例外でスタックを巻き戻してから呼び出すことで、スタックを節約している(p.166)
    - Java Runtimeを使うプロセスは(SystemServiceも)、app_processからforkすることで、実メモリを共有し、節約している

    0
    2018年09月08日
  • Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部

    Posted by ブクログ

    Android アプリは、開発チームのリーダーとして関わったり、 Tangoデバイス で Google Tango の実力の評価用のアプリを作った(ほぼ NDK で C++)くらいなので Activity や Intent について自分でがっつりと向き合ったことがなかったのでせいぜい画面の制御単位でしょ、くらいにしか認識してなかったのですが、こういう裏側の仕組みが 適切な粒度で説明されていると その思想がわかって良かったです。

    想定読者にも書いてあるけど、まったくの初心者には厳しい本ながら、なんらかの核になる背景がある人だったらいい感じに読み進められると思います。(そして「物足りない」と思う部分はバックボーン知識によって変わってきそう)

    作者の 「ここは端折る」「ここは詳述する」というメリハリの感覚が 良い加減でした。

    0
    2019年01月20日
  • Androidを支える技術〈I〉──60fpsを達成するモダンなGUIシステム

    Posted by ブクログ

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

    0
    2017年10月10日