Androidを支える技術<II>輪読会 1.3 1.4章
日付:2024/1/17
章:1.3 1.4章
調査者:iNoma.icon
章のまとめ
どんな内容が書かれているか?
1.3章
Activity機能の概観を眺める
1.4章
本書ではあまり触れないAndroidの構成要素まとめ
1.3 章 Activityはどう実現されているのか
アプリのインストールとActivityの情報の管理
2章で解説
アプリ1つ1つををLinuxのユーザー1人1人にマッピング
Linuxのホームディレクトリ(に相当するもの)にSQLiteのファイルやSharedPreferencesのファイルを置く
メモリ不足時のプロセスkill
3章で解説
Activityは裏に行くとメモリ不足時にプロセスkillされる
LinuxカーネルのOOM Killerという機能と、shrinkerという機能により実現
Androidのスタック管理とライフサイクル
4章で解説
Activityはスタックで管理されている
裏のプロセスをkill、表に来たら再編成
ActivityManagerServiceによって実現
アプリのプロセスの生成とアプリからみたライフサイクル
5章で解説
Zygoteというサービスがプロセス生成を担う
ActivityThreadというクラスがライフサイクル関連の作業をする
システムの始まり
6章で解説
カスタマイズされたinitプロセス
Linuxカーネルがinitプロセスを起動するが、この層ではAndroid特有のカスタムはない
ブートローダがLinuxカーネルを起動するが、このブートローダーにはAndroid特有の挙動がある
https://scrapbox.io/files/65a70d6d644ce70024cbc241.png
1.4章 本書で登場するAndroidの構成要素のうち、本書の主役ではない部分
1.4章以降の内容を理解するのに必要
LooperとUIスレッド
GUI関連の作業をする1つの特別なスレッド
複数の呼び名がある
UIスレッド
本書ではこれを採用
GUIスレッド
イベントスレッド
UIスレッドは、メッセージキューを用いたループ処理を行う
Looperクラスが担当
HandlerとhandleMessage()
Handler
UIスレッド外からUIスレッドに作業を行わせるためのクラス
ネットワーク関連の処理や時間のかかる処理を行うスレッドから、UI更新処理を行うときなど
本書では、はhandleMessage()をオーバーライドする使い方が多く登場
Handlerにに実装されているhandleMessage()自身は送られてきたメッセージをただ捨てるだけ
意味のあることをするためにはHandlerを継承してこのメソッドをオーバーライドする
code: ActivityThreadでのhandleMessage()の使われ方.java
// ❶Handlerのサブクラスを作る
private class H extends Handler {
// ❷メッセージIDの定義
public static final int LAUNCH_ACTIVITY = 100;
public static final int PAUSE_ACTIVITY = 101;
...
// ❸メッセージ処理のためhandleMessageをオーバーライド
public void handleMessage(Message msg) {
// ❹msg.whatでswitchする
switch (msg.what) {
case PAUSE_ACTIVITY: {
// ❺msg.objectに、処理に必要なデータを入れておく
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
// ここで処理する
handlePauseActivity(r, null);
<中略>
}
// ❻継承したHandlerをここでnewする
H handler = new H();
// ❼sendMessage()を呼び出すメソッドを用意。このメソッドはUIスレッド以外から呼ぶ
public final void schedulePauseActivity(ActivityClientRecord token) {
// ❽whatはH.PAUSE_ACTIVITY、objはtokenのメッセージオブジェクトを作成
Message msg = handler.obtainMessage(H.PAUSE_ACTIVITY, token);
// ここでsendMessage()を呼び出す
handler.sendMessage(msg);
}
Binderとシステムサービス
マシン内だけを対象とした分散オブジェクトの仕組み
Binderのおかげで以下の二つを気にしなくても良くなる
オブジェクトが動くプロセス
実装されている言語
Androidでは、このBinderを用いた分散オブジェクトとして機能を提供するオブジェクトを「システムサービス」と呼ぶ
本書を読むときに覚えておく必要があること
❶Binderを使う時には、各プロセスでドライバの初期化とスレッドプールの初期化が必要
どこでBinderの初期化を行っているか を気にしてActivityの生成を追いましょう
❷Binder越しに呼び出される側は、Binder独自のスレッドプールのスレッドで動く
(UIスレッドではない)
応用
code:sample.kt
質疑応答