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

Commit d078d8b1 authored by Daniel Rosenberg's avatar Daniel Rosenberg
Browse files

Make RescueParty call vold directly

This changes RescueParty to call vold over binder directly for
Checkpointing related calls. It turns out that if the system is in a bad
enough state, the other method would not work, as some of the services
required would not be running.

Bug: 135558798
Test: setprop persist.sys.enable_rescue 1
      setprop debug.crash_system 1 or setprop debug.crash_sysui 1
      vdc checkpoint startCheckpoint 3
      stop
      start
      Device should go through the rescueparty flow, and reboot.
      Repeat without checkpoint. Device should prompt reboot.

Change-Id: I8b11d68075cc291e9557d524bc87b54d17b370e4
parent 60aabc40
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.storage.IStorageManager;
import android.provider.Settings;
import android.telephony.euicc.EuiccManager;
import android.text.TextUtils;
@@ -39,8 +38,6 @@ import android.util.Log;
import android.view.Display;
import android.view.WindowManager;

import com.android.internal.content.PackageHelper;

import libcore.io.Streams;

import java.io.ByteArrayInputStream;
@@ -858,18 +855,31 @@ public class RecoverySystem {
    public static void rebootPromptAndWipeUserData(Context context, String reason)
            throws IOException {
        boolean checkpointing = false;
        boolean needReboot = false;
        IVold vold = null;
        try {
            vold = IVold.Stub.asInterface(ServiceManager.checkService("vold"));
            if (vold != null) {
                checkpointing = vold.needsCheckpoint();
            } else  {
                Log.w(TAG, "Failed to get vold");
            }
        } catch (Exception e) {
            Log.w(TAG, "Failed to check for checkpointing");
        }

        // If we are running in checkpointing mode, we should not prompt a wipe.
        // Checkpointing may save us. If it doesn't, we will wind up here again.
        if (checkpointing) {
            try {
            IStorageManager storageManager = PackageHelper.getStorageManager();
            if (storageManager.needsCheckpoint()) {
                Log.i(TAG, "Rescue Party requested wipe. Aborting update instead.");
                storageManager.abortChanges("rescueparty", false);
                return;
                vold.abortChanges("rescueparty", false);
                Log.i(TAG, "Rescue Party requested wipe. Aborting update");
            } catch (Exception e) {
                Log.i(TAG, "Rescue Party requested wipe. Rebooting instead.");
                PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                pm.reboot("rescueparty");
            }
        } catch (RemoteException e) {
            Log.i(TAG, "Failed to handle with checkpointing. Continuing with wipe.");
            return;
        }

        String reasonArg = null;