アクティビティ起動プロセス -- 起動アニメーション停止ロジック

記事の冒頭で、皆さんに記事をお勧めします https://blog.csdn.net/xlnaan/article/details/80904309#commentBox

前回の記事では、ブート アニメーションの 2 つの再生形式を分析しました https://blog.csdn.net/we1less/article/details/116464874

最初は android() モードでプレイします

android() AOSP/frameworks/base/cmds/bootanimation/BootAnimation.cpp

bool BootAnimation::android()
{ { ... checkExit(); } while (!exitPending()); ... return false; }ここでは、ブート アニメーションの再生ループで checkExit() が使用されていることがわかります。ループ再生を終了するかどうかを決定する







void BootAnimation::checkExit() { // サーフェス フリンガーが正常にシャットダウンをリクエストできるようにしますchar value[PROPERTY_VALUE_MAX]; property_get(EXIT_PROP_NAME, value, “0”); int exitnow = atoi(value); if (exitnow) { requestExit()このrequestExit( )と exitPending() については、https://blog.csdn.net/llping2011/article/details/9706599 を参照してください。一般的な意味は、requestExit() を呼び出すことですExitexitPending() は true を返します









ここで、ループを終了するための記号は EXIT_PROP_NAME であることがわかります。デフォルト値は 0 です。

static const char EXIT_PROP_NAME[] = “service.bootanim.exit”;
このプロパティがどこに設定されているかを確認できます。

godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1/frameworks$ grep “service.bootanim.exit” ./ -rn
./native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp:341: property_set( “service.bootanim.exit”, “1”);
./native/services/surfaceflinger/StartPropertySetThread.cpp:33: property_set(“service.bootanim.exit”, “0”);
./native/services/surfaceflinger/SurfaceFlinger.cpp:388: property_set(“service.bootanim.exit”, “1”);
./base/cmds/bootanimation/BootAnimation.cpp:93:static const char EXIT_PROP_NAME[] = “service.bootanim.exit”;
./base/cmds/bootanimation/FORMAT.md:77:システム プロパティをservice.bootanim.exitゼロ以外の文字列に設定します。)
./base/services/core/java/com/android/server/wm/WindowManagerService.java:3509: SystemProperties.set (“service.bootanim.exit”, “1”);
service.bootanim.exit 属性が SurfaceFlinger.cpp:388 および WindowManagerService.java:3509 に表示されていることがわかります。

ブート アニメーションの停止処理:
1. アプリケーションの起動後、 activityThread で handleResumeActivity を呼び出します。このメソッドは Idler メッセージを送信します
if (!r.onlyLocalRequest) { r.nextIdle = mNewActivities; mNewActivities = r; if (localLOGV) Slog.v ( TAG, "Scheduling idle handler for " + r); Looper.myQueue().addIdleHandler(new Idler()); } 2. Idler メッセージでは、 activityManagerServer の activityIdle メソッドが am.activityIdle if (a.activity ! = null && !a.activity.mFinished) { try { am.activityIdle(a.token, a.createdConfig, stopProfiling); a.createdConfig = null; } catch (RemoteException ex) { throw ex.rethrowFromSystemServer(); } }















3.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
ActivityManagerService 内の mStackSupervisor.activityIdleInternalLocked のメソッド
ActivityRecord r =
mStackSupervisor.activityIdleInternalLocked(token, false /* fromTimeout /,
false /
processPausingActivities */, 設定);
4.activityIdleInternalLockedはcheckFinishBootingLockedメソッドを介してpostFinishBooting–>enableScreenAfterBoot();
if (isFocusedStack(r.getStack()) || fromTimeout) { 起動 = checkFinishBootingLocked(); } private boolean checkFinishBootingLocked() { 最終ブールブート = mService.mBooting; ブール値のenableScreen = false; mService.mBooting = false;






if (!mService.mBooted) { mService.mBooted = true; イネーブルスクリーン = true; if (起動中 || EnableScreen) { mService.postFinishBooting(起動中, EnableScreen) ; 起動を返しますvoid enableScreenAfterBoot() { void enableScreenAfterBoot() { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN, SystemClock.uptimeMillis()); mWindowManager.enableScreenAfterBoot();












    synchronized (this) {
        updateEventDispatchingLocked();
    }
}

5.frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java は、
enableScreenAfterBoot を通じて WindowManagerService に戻ります。
アニメーションを停止するための WindowManagerService のenableScreenAfterBoot–>performEnableScreen のコードは、performEnableScreen にあります。 surfaceFlinger の SystemProperties と service.bootanim.exit を 1 に設定すると、
if (!mBootAnimationStopped) { Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, “Stop bootanim”, 0); // ブート アニメーションを停止します// 以前はプロセスを強制終了するだけでしたが、// アニメーションを停止する場所を選択できるように、終了するように要求します。 SystemProperties.set("service.bootanim.exit", "1"); mBootAnimationStopped = true; } try {








IBinder surfaceFlinger = ServiceManager.getService(“SurfaceFlinger”);
if (surfaceFlinger != null) { Slog.i(TAG_WM, “******* SURFACE FLINGER が起動していることを伝えています!”); パーセル データ = Parcel.obtain(); data.writeInterfaceToken(“android.ui.ISurfaceComposer”); surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHEDデータ, null, 0); データ.リサイクル(); catch (RemoteException ex) { Slog.e(TAG_WM, “ブート完了: SurfaceFlinger は死んだ!”); } } }









おすすめ

転載: blog.csdn.net/L779442863/article/details/124979092