diff options
Diffstat (limited to 'install')
-rw-r--r-- | install/Android.bp | 2 | ||||
-rw-r--r-- | install/include/install/snapshot_utils.h | 21 | ||||
-rw-r--r-- | install/snapshot_utils.cpp | 49 | ||||
-rw-r--r-- | install/wipe_data.cpp | 7 |
4 files changed, 79 insertions, 0 deletions
diff --git a/install/Android.bp b/install/Android.bp index d4606e92c..be08506e5 100644 --- a/install/Android.bp +++ b/install/Android.bp @@ -39,6 +39,7 @@ cc_defaults { static_libs: [ "librecovery_utils", "libotautil", + "libsnapshot_nobinder", // external dependencies "libvintf_recovery", @@ -60,6 +61,7 @@ cc_library_static { "fuse_install.cpp", "install.cpp", "package.cpp", + "snapshot_utils.cpp", "verifier.cpp", "wipe_data.cpp", "wipe_device.cpp", diff --git a/install/include/install/snapshot_utils.h b/install/include/install/snapshot_utils.h new file mode 100644 index 000000000..00c3ef7e1 --- /dev/null +++ b/install/include/install/snapshot_utils.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "recovery_ui/device.h" + +bool FinishPendingSnapshotMerges(Device* device); diff --git a/install/snapshot_utils.cpp b/install/snapshot_utils.cpp new file mode 100644 index 000000000..69da5eea0 --- /dev/null +++ b/install/snapshot_utils.cpp @@ -0,0 +1,49 @@ + +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <android-base/properties.h> +#include <libsnapshot/snapshot.h> + +#include "recovery_ui/device.h" +#include "recovery_ui/ui.h" +#include "recovery_utils/roots.h" + +using android::snapshot::SnapshotManager; + +bool FinishPendingSnapshotMerges(Device* device) { + if (!android::base::GetBoolProperty("ro.virtual_ab.enabled", false)) { + return true; + } + + RecoveryUI* ui = device->GetUI(); + auto sm = SnapshotManager::NewForFirstStageMount(); + if (!sm) { + ui->Print("Could not create SnapshotManager.\n"); + return false; + } + + auto callback = [&]() -> void { + double progress; + sm->GetUpdateState(&progress); + ui->Print("Waiting for merge to complete: %.2f\n", progress); + }; + if (!sm->HandleImminentDataWipe(callback)) { + ui->Print("Unable to check merge status and/or complete update merge.\n"); + return false; + } + return true; +} diff --git a/install/wipe_data.cpp b/install/wipe_data.cpp index 82660bef0..287208583 100644 --- a/install/wipe_data.cpp +++ b/install/wipe_data.cpp @@ -27,6 +27,7 @@ #include <android-base/logging.h> #include <android-base/stringprintf.h> +#include "install/snapshot_utils.h" #include "otautil/dirutil.h" #include "recovery_ui/ui.h" #include "recovery_utils/logging.h" @@ -104,6 +105,12 @@ bool WipeCache(RecoveryUI* ui, const std::function<bool()>& confirm_func) { bool WipeData(Device* device, bool convert_fbe) { RecoveryUI* ui = device->GetUI(); ui->Print("\n-- Wiping data...\n"); + + if (!FinishPendingSnapshotMerges(device)) { + ui->Print("Unable to check update status or complete merge, cannot wipe partitions.\n"); + return false; + } + bool success = device->PreWipeData(); if (success) { success &= EraseVolume(DATA_ROOT, ui, convert_fbe); |