android(1)、SystemServerおよびシステムサービスの開始

   Androidの起動プロセスでは、Linuxカーネルが最初に開始されます。カーネルがロードされた後、最初のユーザープロセスZygoteが開始されます。Zygoteは主に新しいプロセスのインキュベーションを担当します。ZygoteはSystemServerを起動します。
   SystemServerはandroidの非常に重要な部分であり、主にandroidフレームワークでサービスを開始する役割を果たします。SystemServerには、main()、init1()、init2()という重要な関数がいくつかあります。
  main関数で、サービスの実行パフォーマンスと安定性を確保するために、十分なメモリを割り当て、c ++ライブラリ(android_server)をロードして、init1関数を呼び出します。
  init1関数は、主にC ++レベルからSurfaceFlingerローカルサービスを開始するためのローカルサービスです。
  init2は主に、ServerThreadである本番スレッドを開始します。
SystemServerの作業は、2つの部分に分かれています。
   最初の部分は、システムにJavaサービス(AMS、WMSなど)をロードすることです。サービスのロードは、ServerThreadというスレッドによって処理されます。ServerThreadはandroidのjavaサービスを開始し、次のようなSystemUiServiceを開始します。システムバー、ステータスバー;
   2. SystemServerの2番目の部分は、ローカルシステムサービス(主にSurfaceFlingerなどのC ++で記述)を開始することです。

ServerThreadの本体は次のとおりで、システム内にjavaサービス、powerサービス、windowサービス、およびパッケージ管理サービスを大まかに作成します。

217             Slog.i(TAG, "Activity Manager");
218             context = ActivityManagerService.main(factoryTest);
259             ActivityManagerService.setSystemProcess();
260             
281             Slog.i(TAG, "System Content Providers");
282             ActivityManagerService.installSystemProviders();
283 
                省略若干服务
311             Slog.i(TAG, "Window Manager");
312             wm = WindowManagerService.main(context, power, display, inputManager,
313                     uiHandler, wmHandler,
314                     factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,
315                     !firstBoot, onlyCore);
316             ServiceManager.addService(Context.WINDOW_SERVICE, wm);
317             ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
318 


このメソッドの重みは、より重要な操作
   1です。このコードで比較的重要なことは、AMSがシステムレベルのコンテキストを作成し、ActivityManagerService(AMS)オブジェクト(AMSのメインメソッドが呼び出されたときに作成される)を作成することです。
   2つ目は、AMSの主な方法でも、システムプロセススレッドを作成することです(達成するためのActivityThread.systemMain())。
   3. InstrumentationツールクラスとApplicationオブジェクトが作成され、このアプリケーションがシステムプロセスをマップします。
   第4に、ActivityManagerService.setSystemProcess()では、ActivityThreadのframework-android.apkファイルをロードする2つのメソッドが実行され、システムのリソースファイルにアクセスできるようになります。
   5.このプロセスでは、ActivityMangerServiceおよびWindowManagerService(WMS)のインスタンスが作成され、WMSのインスタンスがAMSのメンバー変数として使用されるため、AMSはWMSのメンバー関数を使用してウィンドウ関連の操作を実行できます。

フレームワーク-android.apkファイルロードするための二つの重要な方法ActivityThreadは次のとおりです。

   すべてのアプリケーションにはContextImplのインスタンスがあります。これは、リソースファイルにアクセスしてサービスを呼び出すための重要なエントリポイントです。

1901    public ContextImpl getSystemContext() {
1902        synchronized (this) {
1903            if (mSystemContext == null) {
1904                ContextImpl context =
1905                    ContextImpl.createSystemContext(this);
1906                LoadedApk info = new LoadedApk(this, "android", context, null,
1907                        CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO);
1908                context.init(info, null, this);
1909                context.getResources().updateConfiguration(
1910                        getConfiguration(), getDisplayMetricsLocked(
1911                                Display.DEFAULT_DISPLAY,
1912                                CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO));
1913                mSystemContext = context;
1914                //Slog.i(TAG, "Created system resources " + context.getResources()
1915                //        + ": " + context.getResources().getConfiguration());
1916            }
1917        }
1918        return mSystemContext;
1919    }
1920
1921    public void installSystemApplicationInfo(ApplicationInfo info) {
1922        synchronized (this) {
1923            ContextImpl context = getSystemContext();
1924            context.init(new LoadedApk(this, "android", context, info,
1925                    CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO), null, this);
1926
1927            // give ourselves a default profiler
1928            mProfiler = new Profiler();
1929        }
1930    }
1931


おすすめ

転載: blog.csdn.net/jiabailong/article/details/42557373