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