テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

インタビュアー:アプリケーションが起動するとは何ですか

アプリケーションを起動し、根の活動を開始するために呼び出すことができます。しかし、アプリケーションの起動の話をする前に、それがアプリケーション・プロセスのために必要である(AppProcess)理解を開始し、あなたは、アプリケーションが最初のアプリケーション・プロセスが開始されていることを確認する必要があります起動するので、それはあります。あなたがアプリケーションを起動したときにAMS、アプリケーションプロセスは、最初のアプリケーション・プロセスを作成して開始する要求受精卵プロセスへの必要がない場合は、そこにあるかどうかを確認します。私は、大規模なコードの大部分の塊が、いくつかの結論を貼り付け、および関連するソースコードへのリンクを提供していません。

アプリケーション・プロセス(AppProcess)開始

スタート概要

  1. AMSは、アプリケーション・プロセスを開始するための要求を送信します。
  2. 受精卵は要求を受信し、アプリケーション・プロセスを作成します。

AMSは、アプリケーション・プロセスを開始するためのリクエストを送信します

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

  • AMSは、メソッドを呼び出すことによってstartProcessLocked受精卵プロセスに要求を送信します。

  • 呼び出しプロセスstartZygoteProcess使用方法、start方法。

  • ZygoteProcessではstartこの方法は、呼ばれておりstartViaZygotezygoteSendArgsAndGetResultおよびopenZygoteSocketIfNeededように、そして最終的にopenZygoteSocketIfNeeded法との接続を確立するconnectメソッドZygoteState受精卵プロセスを呼び出します。

AMSは、アプリケーション・プロセスを開始するためのリクエストを送信します

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

  • ZygoteServer実行runSelectLoop方法は、AMSは、要求されたデータの到着を待っています。

  • AMS要求はZygoteConnectionによって受精卵プロセスとの接続確立後に来るとprocessOneCommand要求されたデータ処理方法を。要求データにスタートアップパラメータープログラムのプロセスを取得するために解析し、受精卵の通じているforkAndSpecialize作成されたアプリケーションの処理方法。

  • 进程创建完成后,交由ZygoteInit的zygoteInit方法和RuntimeInit的applicationInit方法分别进行进程和应用的初始化。在zygoteInit方法中,为应用程序进程创建了Binder线程池,这样进程就可以跨进程进行通信了。而applicationInit方法通过反射最终会调用ActivityThread的main方法,从而完成应用程序进程的创建。

    • *

应用程序(App)启动

讲完了应用程序进程(AppProcess)启动的相关内容后,接下来我们就来看看应用程序是如何一步一步启动的。

启动大纲

  1. Launcher请求AMS。
  2. AMS请求ApplicationThread。
  3. ActivityThread启动Activity。

启动时序图

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

Launcher请求AMS

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

  • 当我们点击应用程序的图标时,就会自动调用Launcher的startActivitySafely方法, 最终会调用Activity的startActivity方法。

  • 在Activity的startActivity中又调用了startActivityForResult方法,而startActivityForResult方法内部又调用了Instrumentation的execStartActivity方法。

  • 在Instrumentation的execStartActivity方法中又通过ActivityManager的getService方法获取了IBinder类型的AMS引用IActivityManager,最后调用了AMS的startActivity方法。

AMS请求ApplicationThread

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

  • 在AMS的startActivity方法中,又调用了其本身的startActivityAsUser方法,进行权限的检查。

  • 权限检查完后,调用ActivityStarter的startActivityMayWait方法,并在该方法中解析处理应用程序需要的参数,并进行相关参数的初始化,最终会调用其startActivity方法。而在startActivity方法中又调用了startActivityUnchecked方法来处理与栈管理相关的逻辑。

  • 在处理完栈的关系后,紧接着会调用ActivityStackSupervisor的resumeFocusedStackTopActivityLocked方法获取需要启动的Activity所在栈的栈顶。

  • 当需要启动的Activity的状态不是RESUMED状态,就需要调用ActivityStack的resumeTopActivityUncheckedLocked方法,而它的内部又调用了resumeTopActivityInnerLocked方法进行一系列的栈状态的判断,最终又回调了ActivityStackSupervisor的startSpecificActivityLocked方法。

  • 在ActivityStackSupervisor的startSpecificActivityLocked方法中先是获取了即将启动的Activity所在的应用程序进程(就是在这个地方判断应用所在进程是否存在且已启动,如果没有启动,就需要启动应用程序进程),然后调用realStartActivityLocked方法。

  • 在ActivityStackSupervisor的realStartActivityLocked方法中,对启动的应用程序进程进行一系列的判断和处理,最终会调用IBinder类型的ApplicationThread引用IApplicationThread,通过传入IApplicationThread建立ClientTransaction,加入执行LaunchActivityItem任务,最终实现跨进程执行调用ActivityThread的handleLaunchActivity方法。

ActivityThread启动Activity

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

  • 在ActivityThread调用了它的handleLaunchActivity方法中,会先调用其performLaunchActivity方法,之后调用handleResumeActivity,将Activity的状态置为Resume。

  • 私たちは、中performLaunchActivity方法ActivityThreadで物事の多くを行います。
  1. まず、の実装createBaseContextForActivity方法は、活動を起動するためのコンテキストを作成します。
  2. 第二に、コールは計装実行されるnewActivityアクティビティのインスタンスを作成する方法を。
  3. その後、LoadedApkを呼び出すmakeApplicationアプリケーションのアプリケーションを作成する方法を。
  4. 後、呼び出しを開始するアクティビティ必要attach方法は、Windowオブジェクトが作成され、アクティビティ自体に関連付けられている、アクティビティを初期化します。
  5. 最後に、呼び出しが計装実行されるcallActivityOnCreate活動を開始する方法を。
  • インストルメンテーションがで実行callActivityOnCreateする方法、の活動呼び出すperformCreate方法は、最終的に活動を呼び出しますonCreate。このアプリケーションは起動しますが、方法を。

アプリケーションは、プロセス図を開始します

アプリケーションの起動、ランチャー、SystemServerプロセス、接合子プロセスに関与する主要なプロセス及びこれら4つの処理のアプリケーション・プロセスを処理し、それらの間の関係は次の通りです。

テンセント注目のインタビューの重要な問題:Androidのソースコード解析 - アプリケーションランチャ

概要

さて、あなたはインタビューの中で問題が発生した場合、またはわずか数年は混乱卒業し、面接の準備の仕事を知っているし、自分の将来のために、自分自身をアップグレードクオ状態を壊さないものをここに今日のシェアは、私にはわからない知っているだけでは不十分ですどのように計画し、私はあなたが、関連する表面データパケットとビデオ学習についての簡単な質問と回答を得ることができると信じています。

バットのインタビューでは、大規模な共有知識に焦点を当てたフォローアップよりAndroidのAndroidのシステムエンジニアが理解し、Androidのシステムをマスターするように、これらの高度な顔面接の質問を通じてしきい値Androidの投稿を下げることができるという希望を更新していきます。私は〜を見てクリックトラブルに好きと同じように

おすすめ

転載: blog.51cto.com/14332859/2450455