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

Commit b1d26f10 authored by Jiakai Zhang's avatar Jiakai Zhang
Browse files

Add Mainline update hook for Pre-reboot Dexopt.

Bug: 311377497
Test: manual - Install an apex and see the hook called.
(cherry picked from https://googleplex-android-review.git.corp.google.com/c/platform/frameworks/base/+/26436891)
Change-Id: I604030f6d5df108bc6632e014ce35ebddb5dfaac
Merged-In: I604030f6d5df108bc6632e014ce35ebddb5dfaac
parent 344143b4
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -45,11 +45,15 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApexStagedEvent;
import android.content.pm.IPackageManagerNative;
import android.content.pm.IStagedApexObserver;
import android.content.pm.ResolveInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.dex.ArtManager;
import android.os.Binder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
@@ -1051,6 +1055,8 @@ public final class DexOptHelper {
                artManager.scheduleBackgroundDexoptJob();
            }
        }, new IntentFilter(Intent.ACTION_LOCKED_BOOT_COMPLETED));

        StagedApexObserver.registerForStagedApexUpdates(artManager);
    }

    /**
@@ -1096,4 +1102,32 @@ public final class DexOptHelper {
                        + " has unsupported status " + status);
        }
    }

    private static class StagedApexObserver extends IStagedApexObserver.Stub {
        private final @NonNull ArtManagerLocal mArtManager;

        static void registerForStagedApexUpdates(@NonNull ArtManagerLocal artManager) {
            IPackageManagerNative packageNative = IPackageManagerNative.Stub.asInterface(
                    ServiceManager.getService("package_native"));
            if (packageNative == null) {
                Log.e(TAG, "No IPackageManagerNative");
                return;
            }

            try {
                packageNative.registerStagedApexObserver(new StagedApexObserver(artManager));
            } catch (RemoteException e) {
                Log.e(TAG, "Failed to register staged apex observer", e);
            }
        }

        private StagedApexObserver(@NonNull ArtManagerLocal artManager) {
            mArtManager = artManager;
        }

        @Override
        public void onApexStaged(@NonNull ApexStagedEvent event) {
            mArtManager.onApexStaged(event.stagedApexModuleNames);
        }
    }
}