Merge "Defer marking boot successful when checkpointing"
diff --git a/update_verifier/Android.bp b/update_verifier/Android.bp
index 1b84619..f656713 100644
--- a/update_verifier/Android.bp
+++ b/update_verifier/Android.bp
@@ -42,12 +42,15 @@
 
     static_libs: [
         "libotautil",
+        "libvold_binder",
     ],
 
     shared_libs: [
         "android.hardware.boot@1.0",
         "libbase",
         "libcutils",
+        "libbinder",
+        "libutils",
     ],
 
     proto: {
@@ -70,6 +73,7 @@
     static_libs: [
         "libupdate_verifier",
         "libotautil",
+        "libvold_binder",
     ],
 
     shared_libs: [
@@ -80,6 +84,7 @@
         "libhidlbase",
         "liblog",
         "libprotobuf-cpp-lite",
+        "libbinder",
         "libutils",
     ],
 
diff --git a/update_verifier/update_verifier.cpp b/update_verifier/update_verifier.cpp
index d7cd061..5e5eac7 100644
--- a/update_verifier/update_verifier.cpp
+++ b/update_verifier/update_verifier.cpp
@@ -38,6 +38,7 @@
  */
 
 #include "update_verifier/update_verifier.h"
+#include <android/os/IVold.h>
 
 #include <dirent.h>
 #include <errno.h>
@@ -56,6 +57,8 @@
 #include <android-base/strings.h>
 #include <android-base/unique_fd.h>
 #include <android/hardware/boot/1.0/IBootControl.h>
+#include <binder/BinderService.h>
+#include <binder/Status.h>
 #include <cutils/android_reboot.h>
 
 #include "care_map.pb.h"
@@ -376,13 +379,30 @@
       }
     }
 
-    CommandResult cr;
-    module->markBootSuccessful([&cr](CommandResult result) { cr = result; });
-    if (!cr.success) {
-      LOG(ERROR) << "Error marking booted successfully: " << cr.errMsg;
-      return reboot_device();
+    bool supports_checkpoint = false;
+    auto sm = android::defaultServiceManager();
+    android::sp<android::IBinder> binder = sm->getService(android::String16("vold"));
+    if (binder) {
+      auto vold = android::interface_cast<android::os::IVold>(binder);
+      android::binder::Status status = vold->supportsCheckpoint(&supports_checkpoint);
+      if (!status.isOk()) {
+        LOG(ERROR) << "Failed to check if checkpoints supported. Continuing";
+      }
+    } else {
+      LOG(ERROR) << "Failed to obtain vold Binder. Continuing";
     }
-    LOG(INFO) << "Marked slot " << current_slot << " as booted successfully.";
+
+    if (!supports_checkpoint) {
+      CommandResult cr;
+      module->markBootSuccessful([&cr](CommandResult result) { cr = result; });
+      if (!cr.success) {
+        LOG(ERROR) << "Error marking booted successfully: " << cr.errMsg;
+        return reboot_device();
+      }
+      LOG(INFO) << "Marked slot " << current_slot << " as booted successfully.";
+    } else {
+      LOG(INFO) << "Deferred marking slot " << current_slot << " as booted successfully.";
+    }
   }
 
   LOG(INFO) << "Leaving update_verifier.";