diff --git a/update_verifier/Android.bp b/update_verifier/Android.bp index 1b84619a..f6567137 100644 --- a/update_verifier/Android.bp +++ b/update_verifier/Android.bp @@ -42,12 +42,15 @@ cc_library_static { static_libs: [ "libotautil", + "libvold_binder", ], shared_libs: [ "android.hardware.boot@1.0", "libbase", "libcutils", + "libbinder", + "libutils", ], proto: { @@ -70,6 +73,7 @@ cc_binary { static_libs: [ "libupdate_verifier", "libotautil", + "libvold_binder", ], shared_libs: [ @@ -80,6 +84,7 @@ cc_binary { "libhidlbase", "liblog", "libprotobuf-cpp-lite", + "libbinder", "libutils", ], diff --git a/update_verifier/update_verifier.cpp b/update_verifier/update_verifier.cpp index d7cd061e..5e5eac7a 100644 --- a/update_verifier/update_verifier.cpp +++ b/update_verifier/update_verifier.cpp @@ -38,6 +38,7 @@ */ #include "update_verifier/update_verifier.h" +#include #include #include @@ -56,6 +57,8 @@ #include #include #include +#include +#include #include #include "care_map.pb.h" @@ -376,13 +379,30 @@ int update_verifier(int argc, char** argv) { } } - 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 binder = sm->getService(android::String16("vold")); + if (binder) { + auto vold = android::interface_cast(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"; + } + + 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) << "Marked slot " << current_slot << " as booted successfully."; } LOG(INFO) << "Leaving update_verifier.";