Androidの仕組みについて教えてください

7,708 views
Skip to first unread message

たろサ

unread,
Mar 12, 2012, 3:58:28 PM3/12/12
to 日本Androidの会
 たろサです。

 漠然とした質問で申し訳ないのですが、教えてください。

 V2.3.3のソースしか見ていないのですが、他も一緒だろうと思っています。

 Androidが起動するとき、app_processがZygoteとして常駐して親プロセスとなり、その起動中に
com.android.internal.os.ZygoteInitが起動されて、これはsystem_serverとして常駐し、system_serverは起動
時にzygoteをforkして作られるので、Zygoteの子プロセスとなる。と理解しました。

 この後、いろいろなアプリが起動していくのですが、基本的に、この後のアプリ起動というのは、
AndroidManifest.xmlにBroadcastReceiverを書いているアプリが起動イベントを受けて、各自起きていると考え
ていいのでしょうか?

 そうすると、起動イベント等のイベントをBroadcastしているのは、system_serverが行っていると考えていい
のでしょうか?

 常駐しているサービスをkillしても、ゾンビのように起動してくるのは、何かのBroadcastイベントに反応し
て再起動してくるという感じなのでしょうか?ここらへんの仕組みに詳しい方、教えてください。

 質問のきっかけは、最初に起動するアプリがどこかのrcに書かれているのかなと思って、起動関係のファイル
を見てみても、そんな感じのコードが見当たらないので、質問しました。

 もう一つ、ついでに質問ですが、BroadcastReceiverから起動したサービスも起動の仕組みは通常のアプリ(イ
ンテント呼び出し)と同じで、
 system_serverがアプリのuidを決めてZygoteの666ポートにデータを渡して、Zygoteがforkしてプロセスが起
動したのを確認したら、そのアプリに「あなたはこのコードを読み込むんですよ」と教えてあげて...という手
順でスタートすると考えていいのでしょうか。

 誠に変な質問ですが、興味があるので教えてください。

 よろしくお願いします。

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

MORIHIRO

unread,
Mar 12, 2012, 7:25:21 PM3/12/12
to 日本Androidの会
既にチェック済みかもしれませんが、私はそのあたりの流れについては
以下のサイトで勉強させて頂きました。

 DSAS開発者の部屋 / Android アプリケーションが起動するまでの流れ
 http://dsas.blog.klab.org/archives/52003951.html
> E-Mail: taros...@gmail.com

l.b.

unread,
Mar 12, 2012, 9:12:02 PM3/12/12
to android-g...@googlegroups.com

 村上です。

 私の認識では以下の通りです。

 1.ユーザーランドで最初に起動するinitが、init.*.rcを読み込んで記述があるデーモンを起動する。
  常駐するNativeデーモンはここに記述。

 2.initに起動されるSystemServer(system_server及びSystemServer.java)がAndroidシステムの
  Dalvik側常駐サービスを起動する。
  ActivityManager/PackageManager/PowerManager... etc.etc.
  基本的にこれらのシステムサービスは全てSystemServerのプロセスで動作。
  SystemServer.javaにハードコーディングされています。

 3.SystemServerに起動されたシステムサービス群がready状態になったら
  (各サービスのsystemReady()で監視) ActivityManager(正確にはActivityManagerService)の
  systemReadyから、システム常駐アプリを起動する。
  AndroidManifest.xmlで"android:persistent=true"になっているものがシステム常駐アプリ。
  PhoneやSettings、IMEなどが該当。

 4.ActivityManagerはシステム常駐アプリを起動し終わったらBOOT_COMPLETEDのBroadcastIntentを
  投げる。これを受信したアプリが起動。

 全ての詳細なコードは追えていませんが、大枠は合っているかと思います。

 ご参考まで。
 では。

たろサ

unread,
Mar 13, 2012, 2:44:24 AM3/13/12
to android-g...@googlegroups.com
 たろサです。

 MORIHIRO様、ありがとうございます。

>  DSAS開発者の部屋 / Android アプリケーションが起動するまでの流れ
>  http://dsas.blog.klab.org/archives/52003951.html

 このサイトは、とても参考になりました。
 ありがとうございます。

 killしても起動してくるところの仕組みというのも気になったので、そこらへんの仕組みも知りたいなと思っ
た次第です。
 

E-Mail: taro...@gmail.com

たろサ

unread,
Mar 13, 2012, 2:58:33 AM3/13/12
to android-g...@googlegroups.com
 村上さん、こんにちは。

 丁寧なご説明ありがとうございます。

>   (各サービスのsystemReady()で監視) ActivityManager(正確にはActivityManagerService)の
>   systemReadyから、システム常駐アプリを起動する。
 ここら辺のソースを読んでみればいいのですね。

>   AndroidManifest.xmlで"android:persistent=true"になっているものがシステム常駐アプリ。
>   PhoneやSettings、IMEなどが該当。

 persistent=trueというのがあるのですか。これも調べてみます。
 たしかに、phoneやsettingはuidがapp_*ではなく、radioやsystemですね。

 この後に、BroadcastIntentを投げるのですね。BroadcastReceiverというのもintentなんですね。
了解しました。

 そうすると、killしてもどんどん起きてくるプロセスというのは、何らかのBroadcastIntentを受けて直ぐ起
きるように設計されているのですね。なるほど。

 いろいろとありがとうございます。ここら辺のイメージって、1回自分でポーティングしてみないと、なかな
かピンと来ないですね。大阪で勉強会ないかなぁ・・・。

> E-Mail: taro...@gmail.com <mailto:taro...@gmail.com>

l.b.

unread,
Mar 13, 2012, 10:52:22 AM3/13/12
to android-g...@googlegroups.com

 村上です。

 インラインで少々補足を。


>   (各サービスのsystemReady()で監視) ActivityManager(正確にはActivityManagerService)の
>   systemReadyから、システム常駐アプリを起動する。
 ここら辺のソースを読んでみればいいのですね。

 そうですね、SystemServer.java、ActivityManagerService.javaとその周辺、PackageManagerService.javaを
見ればOKだと思います。
 ただ、ActivityManagerServiceだけでも10000行以上、その周辺加えるとかなりの量があるのでなかなか大変ですけど。

 

>   AndroidManifest.xmlで"android:persistent=true"になっているものがシステム常駐アプリ。
>   PhoneやSettings、IMEなどが該当。

 persistent=trueというのがあるのですか。これも調べてみます。
 たしかに、phoneやsettingはuidがapp_*ではなく、radioやsystemですね。

 SettingsとIMEはpersistent=trueではありませんでした。私の思い違いです。
 なおPhoneやSettingsのUIDはAndroidManifest.xmlのandroid:sharedUserIdで決められます。
 この辺はPhoneやSettingsのAndroidManifest.xmlを確認すれば分かります。
 

 この後に、BroadcastIntentを投げるのですね。BroadcastReceiverというのもintentなんですね。
了解しました。

 そうすると、killしてもどんどん起きてくるプロセスというのは、何らかのBroadcastIntentを受けて直ぐ起
きるように設計されているのですね。なるほど。

 Nativeデーモンについてはinitが監視をしていて、killされたら再起動しています。
 常駐アプリについてはIntentと関係なくActivityManagerServiceが監視しているのではないかと
考えていますが、詳細は確認できていません。ActivityManagerServiceのソースを読めば何か分かると思います。

 では。
 
Reply all
Reply to author
Forward
0 new messages