diff --git a/install/include/install/install.h b/install/include/install/install.h index 704841f8..12a73cc5 100644 --- a/install/include/install/install.h +++ b/install/include/install/install.h @@ -67,3 +67,5 @@ bool CheckPackageMetadata(const std::map& metadata, Ot // Ensures the path to the update package is mounted. Also set the |should_use_fuse| to true if the // package stays on a removable media. bool SetupPackageMount(const std::string& package_path, bool* should_use_fuse); + +bool Check_downgrade(Package* package, RecoveryUI* ui); diff --git a/install/install.cpp b/install/install.cpp index 4a795259..a282b582 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -663,6 +663,30 @@ static InstallResult TryUpdateBinary(Package* package, bool* wipe_cache, return INSTALL_SUCCESS; } +bool Check_downgrade(Package* package, RecoveryUI* ui) { + + if (!verify_package(package, ui)) { + // log_buffer->push_back(android::base::StringPrintf("error: %d", kZipVerificationFailure)); + return false; + } + std::map metadata; + auto zip = package->GetZipArchiveHandle(); + if (!ReadMetadataFromPackage(zip, &metadata)) { + LOG(ERROR) << "Failed to parse metadata in the zip file"; + return false; + } + + auto pkg_support_sdk = get_value(metadata,"post-sdk-level"); + if (!pkg_support_sdk.empty()) { + int64_t support = 0; + android::base::ParseInt(pkg_support_sdk, &support); + ui->Print("kbdbg Check_downgrade target sdk verison:%lld\n", support); + if (support < 31) + return true; + } + return false; +} + static InstallResult VerifyAndInstallPackage(Package* package, bool* wipe_cache, std::vector* log_buffer, int retry_count, int* max_temperature, RecoveryUI* ui) { diff --git a/sptek_recovery/sptek_control.cpp b/sptek_recovery/sptek_control.cpp index ed8572c4..21e65d71 100644 --- a/sptek_recovery/sptek_control.cpp +++ b/sptek_recovery/sptek_control.cpp @@ -453,6 +453,40 @@ bool SPTekControl::sRunDownloadUpgrade(int upgradeMode){ mUpdatePackage, std::bind(&RecoveryUI::SetProgress, mUI, std::placeholders::_1)); + if(Check_downgrade(memory_package.get(), mUI)) { + LOG(INFO) << "Check_downgrade Start wiping data.\n"; + printf("Check_downgrade Start wiping data.\n"); + + mUI->SetBackground(RecoveryUI::FACTORY_RESET); + /* factory reset operation is very short. so we need to wait here */ + sleep(5); + + setWipeCacheValue(false); + //bool convert_fbe = reason && strcmp(reason, "convert_fbe") == 0; + bool convert_fbe = mDevice->GetReason().value() == "convert_fbe"; + if (!WipeData(mDevice, convert_fbe)) { + status = INSTALL_ERROR; + } + + if (status != INSTALL_SUCCESS) { + mUI->Print("Data wipe failed.\n"); + LOG(ERROR) << "Data wipe failed.\n"; + } else { + mUI->Print("Data wipe success.\n"); + LOG(INFO) << "Data wipe success.\n"; + if (ensure_path_mounted("/btv_home/backup") != 0 || ensure_path_mounted("/data/app") != 0) { + printf("btv_home backup dir mount fail.\n"); + LOG(INFO) << "btv_home backup dir mount fail.\n"; + } else { + printf("btv_home backup dir mount success.\n"); + LOG(INFO) << "btv_home backup dir mount success.\n"; + } + } + printf("resetting partial number\n"); + set_partial_reset(); + } + + if (memory_package != nullptr) { status = InstallPackage(memory_package.get(), mUpdatePackage, should_wipe_cache, 0, mUI);