Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b7dda73 authored by Jiakai Zhang's avatar Jiakai Zhang
Browse files

Fix the boot time regression caused by DexUseManagerLocal init.

See details in the bug.

Before:
D SystemServerTiming: DexUseManagerLocal
I system_server: Waiting for a blocking GC ClassLinker
I system_server: Background concurrent copying GC freed 207020(9016KB) AllocSpace objects, 21(896KB) LOS objects, 49% free, 12MB/25MB, paused 56us,21us total 209.779ms
I system_server: WaitForGcToComplete blocked ClassLinker on Background for 177.623ms
V SystemServerTiming: DexUseManagerLocal took to complete: 182ms

After:
D SystemServerTiming: ArtModuleServiceInitializer
V SystemServerTiming: ArtModuleServiceInitializer took to complete: 3ms
...
D SystemServerTiming: DexUseManagerLocal
V SystemServerTiming: DexUseManagerLocal took to complete: 20ms

Bug: 263373204
Test: manual - See above.
Change-Id: I81e517fd3c18ccd3490947b16e36e7d43b2fc07c
parent e5773c3f
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -1049,6 +1049,17 @@ public final class SystemServer implements Dumpable {
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        t.traceBegin("startBootstrapServices");
        t.traceBegin("startBootstrapServices");


        t.traceBegin("ArtModuleServiceInitializer");
        // This needs to happen before DexUseManagerLocal init. We do it here to avoid colliding
        // with a GC. ArtModuleServiceInitializer is a class from a separate dex file
        // "service-art.jar", so referencing it involves the class linker. The class linker and the
        // GC are mutually exclusive (b/263486535). Therefore, we do this here to force trigger the
        // class linker earlier. If we did this later, especially after PackageManagerService init,
        // the class linker would be consistently blocked by a GC because PackageManagerService
        // allocates a lot of memory and almost certainly triggers a GC.
        ArtModuleServiceInitializer.setArtModuleServiceManager(new ArtModuleServiceManager());
        t.traceEnd();

        // Start the watchdog as early as possible so we can crash the system server
        // Start the watchdog as early as possible so we can crash the system server
        // if we deadlock during early boot
        // if we deadlock during early boot
        t.traceBegin("StartWatchdog");
        t.traceBegin("StartWatchdog");
@@ -1235,8 +1246,6 @@ public final class SystemServer implements Dumpable {
        t.traceBegin("DexUseManagerLocal");
        t.traceBegin("DexUseManagerLocal");
        // DexUseManagerLocal needs to be loaded after PackageManagerLocal has been registered, but
        // DexUseManagerLocal needs to be loaded after PackageManagerLocal has been registered, but
        // before PackageManagerService starts processing binder calls to notifyDexLoad.
        // before PackageManagerService starts processing binder calls to notifyDexLoad.
        // DexUseManagerLocal may also call artd, so ensure ArtModuleServiceManager is instantiated.
        ArtModuleServiceInitializer.setArtModuleServiceManager(new ArtModuleServiceManager());
        LocalManagerRegistry.addManager(
        LocalManagerRegistry.addManager(
                DexUseManagerLocal.class, DexUseManagerLocal.createInstance());
                DexUseManagerLocal.class, DexUseManagerLocal.createInstance());
        t.traceEnd();
        t.traceEnd();