• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,286
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
24
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Intent の概略 横浜 Android プラットフォーム部 第 17 回勉強会 2012/1/28 @l_b__
  • 2. 今日の内容
    • Intent の仕組みの概略を簡単に。
    • 3. 結局” Android アプリケーションが起動するまでの流れ ” (http://dsas.blog.klab.org/archives/52003951.html) と変わらないので、このページのほうが詳細で分かりやすいです。
  • 4. Intent について今更説明するまでもありませんが
    • Android のコンポーネント ( アクティビティ、サービス ) の起動に使用
    • 5. コンポーネント間のメッセージングにも使用
  • 6. Intent の仕組みの前提として
    • Android は Linux カーネルの管理するプロセスを単位とした分散 OS 。
    • 7. 分散 OS としてのフレームワークが Binder フレームワーク。
    • 8. プロセス間のメッセージングとして Binder IPC (InterProcessCommunication) が用意されている。
  • 9.
      Intent の登場人物
    • Intent が使用される際の登場人物は
      • Binder ドライバ
      • 10. Zygote+Android フレームワーク +libbinder
      • 11. PackageManager
      • 12. ActivityManager
  • 13. Intent の登場人物 カーネルランド カーネルランド ユーザーランド LinuxKernel Binder Driver Init 各 Daemon 各 Daemon 各 Daemon ServiceManager Zygote (app_process) SystemServer ActivityManager 各 Manager 各 Manager 各 Manager PackageManager
  • 14. Binder ドライバ
    • ユーザーランド側に /dev/binder を提供し、ユーザーランド側プロセスは起動時に Binder ドライバに自身を登録
    • 15. Binder ドライバは登録されたユーザーランド側プロセスを Binder オブジェクトとして管理。
    • 16. Binder IPC のやり取りは Binder ドライバが行う。
      • 送信元はやり取りする情報 (Parcel) を Binder ドライバから取得した共有メモリに書き込む。
      • 17. Binder ドライバは Parcel を送信先に渡す。
    • Binder ドライバは Binder オブジェクト間の参照カウントを保持。
  • 18.
      • Zygote+Android フレームワーク +libbinder
    • Zygote の詳細は” Android アプリケーションが起動するまでの流れ ”や @tetsu_koba さんの資料を参照してください。
    • 19. アプリの起動時には
      • Zygote プロセスを Fork
      • 20. libbinder の ProcessState や IPCThreadPool を生成
        • ProcessState 生成時に /dev/binder を open し、 Binder ドライバにプロセスを Binder オブジェクトとして登録する
      • DalvikVM を起動し、起動するアプリケーションをロード。
  • 21. PackageManager
    • Intent に設定された情報から起動するパッケージを選択。
      • パッケージインストール時の AndroidManifest の情報を /data/system/packages.xml として保持している。
      • 22. 暗黙的 Intent やブロードキャスト Intent の場合、対象となるパッケージの情報を返す。
  • 23. ActivityManager
    • 要求されたコンポーネント (Activity や Service) を起動する。
    • 24. 実際の起動は ” Android アプリケーションが起動するまでの流れ ”に詳しい。
  • 25. Intent でのアプリ起動 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager App1が起動している状態。 App1がApp2を起動する。
  • 26. Intent でのアプリ起動 1.Intentの生成 2.package情報問い合わせのため Binder生成 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 27. Intent でのアプリ起動 3.Intentのデータをドライバ側に書き込み 4.ドライバ内で データをSystemServer側に転送 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 28. Intent でのアプリ起動 6.PackageManagerが情報問い合わせを受け、情報を返す。 5.ドライバ側からPackageManagerプロセスに通知 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 29. Intent でのアプリ起動 7.startActivity実行 8.ActivityManagerへの実行要求の Binder生成 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 30. Intent でのアプリ起動 9.Intentのデータをドライバ側に書き込み 10.ドライバ内で データをSystemServer側に転送 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 31. Intent でのアプリ起動 12.ActivityManagerが起動要求を受け、アプリ起動処理を開始。 11.ドライバ側からActivityManagerプロセスに通知 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager
  • 32. Intent でのアプリ起動 13.ActivityManagerの要求でZygoteプロセスをApp2向けにFork (Localソケットベースでの要求) BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager App2 libbinder libc dvm
  • 33. Intent でのアプリ起動 14.App2でProcessStateを生成、ドライバをオープンし、共有メモリをマッピング BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager App2 libbinder libc dvm
  • 34. Intent でのアプリ起動 15.App2のDexをロード、App2が起動する。 BinderDriver Init 各 Daemon Zygote SystemServer Home App1 libbinder libbinder libbinder libbinder libc libc libc libc dvm dvm dvm dvm Home App1 Activity Manager Package Manager 各 Manager App2 libbinder libc dvm App2
  • 35. 最後に
    • 次回以降にBinderドライバとlibbinder周りを調べて発表したいと考えています。