From 4f74abe89fbd4f927b5c58edcc7bfe039c40c672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Fri, 21 Mar 2025 15:52:14 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=B5=81=E5=BC=8F=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- interfaces/kits/packages/package.cpp | 2 + interfaces/kits/slot_info/slot_info.cpp | 6 +- services/include/package/pkg_manager.h | 3 + services/include/updater/updater.h | 7 + services/include/updater/updater_const.h | 3 +- .../package/pkg_manager/pkg_managerImpl.cpp | 78 +++- .../package/pkg_manager/pkg_manager_impl.h | 2 + .../package/pkg_verify/hash_data_verifier.cpp | 6 + .../package/pkg_verify/pkcs7_signed_data.cpp | 2 +- .../package/pkg_verify/pkg_verify_util.cpp | 1 + services/stream_update/bin_chunk_update.cpp | 7 +- services/stream_update/bin_chunk_update.h | 1 + services/updater.cpp | 158 ++++++- services/updater_binary/BUILD.gn | 2 + services/updater_binary/main.cpp | 12 +- services/updater_binary/update_processor.cpp | 1 + .../update_processor_stream.cpp | 202 ++++++++ .../updater_binary/update_processor_stream.h | 37 ++ services/updater_main.cpp | 437 +++++++++++++++++- utils/utils.cpp | 3 + utils/write_updater.cpp | 26 +- 21 files changed, 960 insertions(+), 36 deletions(-) create mode 100755 services/updater_binary/update_processor_stream.cpp create mode 100755 services/updater_binary/update_processor_stream.h diff --git a/interfaces/kits/packages/package.cpp b/interfaces/kits/packages/package.cpp index c61dd543..cd1d173b 100755 --- a/interfaces/kits/packages/package.cpp +++ b/interfaces/kits/packages/package.cpp @@ -236,6 +236,7 @@ int32_t VerifyPackageWithCallback(const std::string &packagePath, int32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *dir, const char *outPath) { + LOG(INFO) << "enter ExtraPackageDir:" << outPath; if (packagePath == nullptr || outPath == nullptr) { LOG(ERROR) << "Check param fail "; return PKG_INVALID_PARAM; @@ -259,6 +260,7 @@ int32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *ke continue; } PkgManager::StreamPtr outStream = nullptr; + LOG(INFO) << "components" << components[i]; manager->CreatePkgStream(outStream, std::string(outPath) + components[i], 0, PkgStream::PkgStreamType_Write); if (outStream == nullptr) { LOG(ERROR) << "CreatePkgStream fail"; diff --git a/interfaces/kits/slot_info/slot_info.cpp b/interfaces/kits/slot_info/slot_info.cpp index e6f2787d..0d622352 100644 --- a/interfaces/kits/slot_info/slot_info.cpp +++ b/interfaces/kits/slot_info/slot_info.cpp @@ -36,7 +36,7 @@ void SetActiveSlot() #else void GetPartitionSuffix(std::string &suffix) { - OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); @@ -56,7 +56,7 @@ void GetPartitionSuffix(std::string &suffix) void GetActivePartitionSuffix(std::string &suffix) { - OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); @@ -75,7 +75,7 @@ void GetActivePartitionSuffix(std::string &suffix) void SetActiveSlot() { - OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); diff --git a/services/include/package/pkg_manager.h b/services/include/package/pkg_manager.h index f4219215..7fbc7d5a 100644 --- a/services/include/package/pkg_manager.h +++ b/services/include/package/pkg_manager.h @@ -152,6 +152,7 @@ public: virtual void ClearPkgStream() = 0; virtual int32_t ReadImgHashDataFile(const std::string &pkgType) = 0; + }; class PkgEntry { @@ -278,6 +279,8 @@ public: virtual int32_t LoadPackage(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) = 0; + virtual int32_t ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) = 0; + virtual int32_t VerifyAccPackage(const std::string &packagePath, const std::string &keyPath) = 0; virtual int32_t VerifyOtaPackage(const std::string &devPath, uint64_t offset, size_t size) = 0; diff --git a/services/include/updater/updater.h b/services/include/updater/updater.h index 798afa60..596efcec 100644 --- a/services/include/updater/updater.h +++ b/services/include/updater/updater.h @@ -62,6 +62,7 @@ struct UpdaterParams { std::string shrinkInfo = ""; std::string virtualShrinkInfo = ""; std::string miscCmd {"boot_updater"}; + std::vector updateBin {}; std::vector updatePackage {}; std::vector> installTime {}; std::function callbackProgress {}; @@ -90,9 +91,15 @@ void ProgressSmoothHandler(int beginProgress, int endProgress); UpdaterStatus DoInstallUpdaterPackage(Hpackage::PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams, PackageUpdateMode updateMode); +UpdaterStatus DoInstallUpdaterBinfile(Hpackage::PkgManager::PkgManagerPtr pkgManager, + UpdaterParams &upParams, PackageUpdateMode updateMode); + UpdaterStatus StartUpdaterProc(Hpackage::PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams); +UpdaterStatus StartUpdaterProcFromBin(Hpackage::PkgManager::PkgManagerPtr pkgManager, + UpdaterParams &upParams); + int GetUpdatePackageInfo(Hpackage::PkgManager::PkgManagerPtr pkgManager, const std::string& path); int ExecUpdate(Hpackage::PkgManager::PkgManagerPtr pkgManager, int retry, const std::string &pkgPath, diff --git a/services/include/updater/updater_const.h b/services/include/updater/updater_const.h index 7378ab57..8d0e0ed3 100644 --- a/services/include/updater/updater_const.h +++ b/services/include/updater/updater_const.h @@ -38,6 +38,7 @@ constexpr const char *MODULE_UPDATE_RESULT_FILE = "module_update_result"; constexpr const char *MISC_FILE = "/dev/block/platform/soc/10100000.himci.eMMC/by-name/misc"; constexpr const char *MISC_PATH = "/misc"; constexpr const char *UPDATER_BINARY = "updater_binary"; +constexpr const char *STREAM_ZIP_PATH = "/data/updater/update_stream.zip"; constexpr const char *SDCARD_PATH = "/sdcard"; constexpr const char *INTERNAL_DATA_PATH = "/internaldata"; constexpr const char *UPDATER_HDC_LOG = "/data/updater/log/flashd_hdc.log"; @@ -90,7 +91,7 @@ constexpr int MINIMAL_ARGC_LIMIT = 2; constexpr int MAXIMAL_ARGC_LIMIT = 4; constexpr int MAX_LOG_BUF_SIZE = 4096; constexpr int MAX_LOG_NAME_SIZE = 100; -constexpr long MAX_LOG_SIZE = 2 * 1024 * 1024; +constexpr long MAX_LOG_SIZE = 10 * 1024 * 1024; constexpr long MAX_LOG_DIR_SIZE = 10 * 1024 * 1024; constexpr int MAX_RESULT_SIZE = 20; constexpr int MAX_RESULT_BUFF_SIZE = 1000; diff --git a/services/package/pkg_manager/pkg_managerImpl.cpp b/services/package/pkg_manager/pkg_managerImpl.cpp index ccd8722e..ad7b1ccb 100644 --- a/services/package/pkg_manager/pkg_managerImpl.cpp +++ b/services/package/pkg_manager/pkg_managerImpl.cpp @@ -239,6 +239,7 @@ PkgFilePtr PkgManagerImpl::CreatePackage(PkgStreamPtr stream, PkgFile::PkgType t int32_t PkgManagerImpl::LoadPackageWithoutUnPack(const std::string &packagePath, std::vector &fileIds) { + LOG(INFO) << "enter LoadPackageWithoutUnPack"; PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); int32_t ret = LoadPackage(packagePath, fileIds, pkgType); if (ret != PKG_SUCCESS) { @@ -275,9 +276,69 @@ int32_t PkgManagerImpl::ParsePackage(StreamPtr stream, std::vector return PKG_SUCCESS; } +int32_t PkgManagerImpl::ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) +{ + LOG(INFO) << "enter LoadPackage -1"; + UPDATER_INIT_RECORD; + if (access(packagePath.c_str(), 0) != 0) { + UPDATER_LAST_WORD(PKG_INVALID_FILE, "access pkgpath failed"); + return PKG_INVALID_FILE; + } + if (SetSignVerifyKeyName(keyPath) != PKG_SUCCESS) { + UPDATER_LAST_WORD(PKG_INVALID_FILE, "SetSignVerifyKeyName failed"); + return PKG_INVALID_FILE; + } + // Check if package already loaded + for (auto iter : pkgFiles_) { + if (iter != nullptr && iter->GetPkgStream()->GetFileName().compare(packagePath) == 0) { + return PKG_SUCCESS; + } + } + PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); + LOG(INFO) << "pkgType" << pkgType; + unzipToFile_ = ((pkgType == PkgFile::PKG_TYPE_GZIP) ? true : unzipToFile_); + if (pkgType == PkgFile::PKG_TYPE_UPGRADE) { + if (LoadPackage(packagePath, fileIds, pkgType) != PKG_SUCCESS) { + ClearPkgFile(); + UPDATER_LAST_WORD("LoadPackage failed", packagePath); + PKG_LOGE("Parse %s fail ", packagePath.c_str()); + return PKG_INVALID_FILE; + } + } else if (pkgType != PkgFile::PKG_TYPE_NONE) { + std::vector innerFileNames; + // 加载update_full.zip + int32_t ret = LoadPackage(packagePath, innerFileNames, pkgType); + if (ret != PKG_SUCCESS) { + ClearPkgFile(); + PKG_LOGE("Unzip %s fail ", packagePath.c_str()); + return ret; + } + for (auto name : innerFileNames) { + pkgType = GetPkgTypeByName(name); + if (pkgType == PkgFile::PKG_TYPE_NONE || (pkgType == PkgFile::PKG_TYPE_UPGRADE + && std::find(innerFileNames.begin(), innerFileNames.end(), "board_list") != innerFileNames.end())) { + fileIds.push_back(name); + continue; + } + LOG(INFO) << "name = " << name; + LOG(INFO) << "packagePath = " << packagePath; + LOG(INFO) << "pkgType = " << pkgType; + // LOG(INFO) << "filedIds = " << fileIds; + ret = ExtraAndLoadPackage(GetFilePath(packagePath), name, pkgType, fileIds); + if (ret != PKG_SUCCESS) { + ClearPkgFile(); + UPDATER_LAST_WORD(ret, "ExtraAndLoadPackage failed"); + PKG_LOGE("unpack %s fail in package %s ", name.c_str(), packagePath.c_str()); + return ret; + } + } + } + return PKG_SUCCESS; +} int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) { + LOG(INFO) << "enter LoadPackage -1"; UPDATER_INIT_RECORD; if (access(packagePath.c_str(), 0) != 0) { UPDATER_LAST_WORD(PKG_INVALID_FILE, "access pkgpath failed"); @@ -294,6 +355,7 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s } } PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); + LOG(INFO) << "pkgType" << pkgType; unzipToFile_ = ((pkgType == PkgFile::PKG_TYPE_GZIP) ? true : unzipToFile_); if (pkgType == PkgFile::PKG_TYPE_UPGRADE) { if (LoadPackage(packagePath, fileIds, pkgType) != PKG_SUCCESS) { @@ -304,6 +366,7 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s } } else if (pkgType != PkgFile::PKG_TYPE_NONE) { std::vector innerFileNames; + // 加载update_full.zip int32_t ret = LoadPackage(packagePath, innerFileNames, pkgType); if (ret != PKG_SUCCESS) { ClearPkgFile(); @@ -317,6 +380,10 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s fileIds.push_back(name); continue; } + LOG(INFO) << "name = " << name; + LOG(INFO) << "packagePath = " << packagePath; + LOG(INFO) << "pkgType = " << pkgType; + // LOG(INFO) << "filedIds = " << fileIds; ret = ExtraAndLoadPackage(GetFilePath(packagePath), name, pkgType, fileIds); if (ret != PKG_SUCCESS) { ClearPkgFile(); @@ -343,6 +410,7 @@ const std::string PkgManagerImpl::GetExtraPath(const std::string &path) int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std::string &name, PkgFile::PkgType type, std::vector &fileIds) { + LOG(INFO) << "enter ExtraAndLoadPackage"; int32_t ret = PKG_SUCCESS; const FileInfo *info = GetFileInfo(name); if (info == nullptr) { @@ -358,11 +426,15 @@ int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std:: (void)mkdir(tempPath.c_str(), 0775); // 0775 : rwxrwxr-x #endif } - + LOG(INFO) << "tempPath:" << tempPath; // Extract package to file or memory if (unzipToFile_ || type == PkgFile::PKG_TYPE_UPGRADE) { + LOG(INFO) << "PkgStreamType_Write"; + LOG(INFO) << "info->unpackedSize" << info->unpackedSize; ret = CreatePkgStream(stream, tempPath + name + ".tmp", info->unpackedSize, PkgStream::PkgStreamType_Write); } else { + LOG(INFO) << "PkgStreamType_MemoryMap"; + LOG(INFO) << "info->unpackedSize" << info->unpackedSize; ret = CreatePkgStream(stream, tempPath + name + ".tmp", info->unpackedSize, PkgStream::PkgStreamType_MemoryMap); } if (ret != PKG_SUCCESS) { @@ -382,6 +454,7 @@ int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std:: int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) { + LOG(INFO) << "enter LoadPackage -2"; UPDATER_INIT_RECORD; PkgStreamPtr stream = nullptr; int32_t ret = CreatePkgStream(stream, packagePath, 0, PkgStream::PKgStreamType_FileMap); @@ -448,6 +521,7 @@ int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, co int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type, PkgStreamPtr stream) { + LOG(INFO) << "enter LoadPackageWithStream"; UPDATER_INIT_RECORD; int32_t ret = PKG_SUCCESS; PkgFilePtr pkgFile = CreatePackage(stream, type, nullptr); @@ -474,6 +548,7 @@ int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, int32_t PkgManagerImpl::ExtractFile(const std::string &path, PkgManager::StreamPtr output) { + LOG(INFO) << "enter ExtractFile"; UPDATER_INIT_RECORD; if (output == nullptr) { PKG_LOGE("Invalid stream"); @@ -515,6 +590,7 @@ const PkgInfo *PkgManagerImpl::GetPackageInfo(const std::string &packagePath) const FileInfo *PkgManagerImpl::GetFileInfo(const std::string &path) { + LOG(INFO) << "enter GetFileInfo"; PkgEntryPtr pkgEntry = GetPkgEntry(path); if (pkgEntry != nullptr) { return pkgEntry->GetFileInfo(); diff --git a/services/package/pkg_manager/pkg_manager_impl.h b/services/package/pkg_manager/pkg_manager_impl.h index ba6a6604..cdbf848a 100644 --- a/services/package/pkg_manager/pkg_manager_impl.h +++ b/services/package/pkg_manager/pkg_manager_impl.h @@ -101,6 +101,8 @@ public: int32_t LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) override; + + int32_t ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) override; private: PkgFilePtr CreatePackage(PkgStreamPtr stream, PkgFile::PkgType type, PkgInfoPtr header = nullptr); diff --git a/services/package/pkg_verify/hash_data_verifier.cpp b/services/package/pkg_verify/hash_data_verifier.cpp index 1fa79361..931bf0e1 100644 --- a/services/package/pkg_verify/hash_data_verifier.cpp +++ b/services/package/pkg_verify/hash_data_verifier.cpp @@ -37,6 +37,7 @@ HashDataVerifier::~HashDataVerifier() bool HashDataVerifier::LoadHashDataAndPkcs7(const std::string &pkgPath) { + LOG(INFO) << "enter LoadHashDataAndPkcs7"; Updater::UPDATER_INIT_RECORD; if (pkgPath == UPDATRE_SCRIPT_ZIP) { isNeedVerify_ = false; @@ -78,6 +79,7 @@ bool HashDataVerifier::LoadHashDataFromPackage(const std::string &buffer) bool HashDataVerifier::LoadHashDataFromPackage(void) { + LOG(INFO) << "enter LoadHashDataFromPackage"; Updater::UPDATER_INIT_RECORD; PkgManager::StreamPtr outStream = nullptr; auto info = manager_->GetFileInfo(UPDATER_HASH_SIGNED_DATA); @@ -113,8 +115,10 @@ bool HashDataVerifier::LoadHashDataFromPackage(void) bool HashDataVerifier::LoadPkcs7FromPackage(const std::string &pkgPath) { + LOG(INFO) << "enter LoadPkcs7FromPackage"; Updater::UPDATER_INIT_RECORD; PkgManager::StreamPtr pkgStream = nullptr; + LOG(INFO) << "pkgPath:" << pkgPath; int32_t ret = manager_->CreatePkgStream(pkgStream, pkgPath, 0, PkgStream::PkgStreamType_Read); if (ret != PKG_SUCCESS) { PKG_LOGE("CreatePackage fail %s", pkgPath.c_str()); @@ -133,12 +137,14 @@ bool HashDataVerifier::LoadPkcs7FromPackage(const std::string &pkgPath) UPDATER_LAST_WORD(ret, "GetSignature failed"); return false; } + LOG(INFO) << "signature.data()" << signature.data() << "signature.size()" << signature.size(); return pkcs7_ != nullptr && pkcs7_->ParsePkcs7Data(signature.data(), signature.size()) == 0; } bool HashDataVerifier::VerifyHashData(const std::string &preName, const std::string &fileName, PkgManager::StreamPtr stream) const { + LOG(INFO) << "enter VerifyHashData"; if (!isNeedVerify_) { return true; } diff --git a/services/package/pkg_verify/pkcs7_signed_data.cpp b/services/package/pkg_verify/pkcs7_signed_data.cpp index fb38f77d..b4b0abbe 100644 --- a/services/package/pkg_verify/pkcs7_signed_data.cpp +++ b/services/package/pkg_verify/pkcs7_signed_data.cpp @@ -89,7 +89,7 @@ int32_t Pkcs7SignedData::ParsePkcs7Data(const uint8_t *srcData, const size_t dat } int32_t Pkcs7SignedData::Verify() const -{ +{ std::vector digestForEVP; for (unsigned int i = 0; i < signatureInfo.overall.length; i++) { digestForEVP.push_back(static_cast(signatureInfo.overall.buffer[i])); diff --git a/services/package/pkg_verify/pkg_verify_util.cpp b/services/package/pkg_verify/pkg_verify_util.cpp index 904c6f85..3993c06d 100644 --- a/services/package/pkg_verify/pkg_verify_util.cpp +++ b/services/package/pkg_verify/pkg_verify_util.cpp @@ -139,6 +139,7 @@ int32_t PkgVerifyUtil::VerifyPackageSign(const PkgStreamPtr pkgStream, const std int32_t PkgVerifyUtil::GetSignature(const PkgStreamPtr pkgStream, size_t &signatureSize, std::vector &signature, uint16_t &commentTotalLenAll) const { + PKG_LOGI("enter GetSignature"); Updater::UPDATER_INIT_RECORD; size_t signatureStart = 0; int32_t ret = ParsePackage(pkgStream, signatureStart, signatureSize, commentTotalLenAll); diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 5a7736e9..7a15ec72 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -93,7 +93,6 @@ UpdateResultCode BinChunkUpdate::StartBinChunkUpdate(const uint8_t *data, uint32 return STREAM_UPDATE_FAILURE; } } - dealLen = len + leftLen - curlen_; LOG(DEBUG) << "BinChunkUpdate StartBinChunkUpdate dealLen:" << dealLen << " len:" << len << " curlen_:" << curlen_ << " leftLen:" << leftLen; @@ -253,7 +252,7 @@ bool BinChunkUpdate::ProcessPartitionNum(uint8_t *data, uint32_t &len, uint32_t } updateInfo_.patitionNum = ReadLE16(data + offset); - LOG(INFO) << "BinChunkUpdate::UpdateBinHash patitionNum:" << updateInfo_.patitionNum; + LOG(DEBUG) << "BinChunkUpdate::UpdateBinHash patitionNum:" << updateInfo_.patitionNum; updateInfo_.algorithm->Update({data + offset, tlv.length}, tlv.length); offset += tlv.length; @@ -405,7 +404,7 @@ bool BinChunkUpdate::VerifySignature(std::vector &signData) return false; } - LOG(INFO) << "BinChunkUpdate VerifyDigest success"; + LOG(DEBUG) << "BinChunkUpdate VerifyDigest success"; return true; } @@ -706,7 +705,7 @@ bool BinChunkUpdate::ExecuteCmdLine() return false; } - LOG(INFO) << "cf->Execute SUCCESS"; + LOG(DEBUG) << "cf->Execute SUCCESS"; return true; } diff --git a/services/stream_update/bin_chunk_update.h b/services/stream_update/bin_chunk_update.h index c9710b54..8b028e09 100755 --- a/services/stream_update/bin_chunk_update.h +++ b/services/stream_update/bin_chunk_update.h @@ -47,6 +47,7 @@ using UpdateResultCode = enum { }; using BinUpdateTip = enum { + BIN_UPDATE_ZIP_TIP = 0x11, BIN_UPDATE_HEAD_TIP = 0x01, BIN_UPDATE_DATA_TIP = 0x12, BIN_UPDATE_HASH_TIP = 0x16 diff --git a/services/updater.cpp b/services/updater.cpp index 9e8e4a95..29ff9cd3 100644 --- a/services/updater.cpp +++ b/services/updater.cpp @@ -36,6 +36,7 @@ #include "package/packages_info.h" #include "parameter.h" #include "misc_info/misc_info.h" +#include #ifdef WITH_SELINUX #include #include "selinux/selinux.h" @@ -51,7 +52,8 @@ #include "updater_ui_stub.h" #include "utils.h" #include "write_state/write_state.h" - +#include +namespace fs = std::filesystem; namespace Updater { using Updater::Utils::SplitString; using Updater::Utils::Trim; @@ -64,6 +66,7 @@ int g_tmpValue; int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &packagePath, const std::string &updaterBinary) { + LOG(INFO) << "enter ExtractUpdaterBinary"; UPDATER_INIT_RECORD; PkgManager::StreamPtr outStream = nullptr; int32_t ret = manager->CreatePkgStream(outStream, GetWorkPath() + updaterBinary, @@ -80,16 +83,44 @@ int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &pac return UPDATE_CORRUPT; } HashDataVerifier verifier {manager}; + LOG(INFO) << "ExtractUpdaterBinary Path:" << packagePath; if (!verifier.LoadHashDataAndPkcs7(packagePath) || !verifier.VerifyHashData("build_tools/", updaterBinary, outStream)) { LOG(ERROR) << "verify updater_binary failed"; UPDATER_LAST_WORD(UPDATE_CORRUPT, "verify updater_binary failed"); return UPDATE_CORRUPT; } + manager->ClosePkgStream(outStream); return UPDATE_SUCCESS; } +const std::string GetExtraPath(const std::string &path) +{ + if (path.find(Updater::SDCARD_CARD_PATH) != std::string::npos) { + return path; + } else if (path == UPDATRE_SCRIPT_ZIP) { + return "/tmp/"; + } + + return std::string(Updater::UPDATER_PATH) + "/"; +} + +int GetUpdateStreamzipInfo(PkgManager::PkgManagerPtr pkgManager, const std::string &path) +{ + std::vector components; + if (pkgManager == nullptr) { + LOG(ERROR) << "pkgManager is nullptr"; + return UPDATE_CORRUPT; + } + int32_t ret = pkgManager->ParaseUpdateStreamzip(path, Utils::GetCertName(), components);; + if (ret != PKG_SUCCESS) { + LOG(INFO) << "LoadPackage fail ret :"<< ret; + return ret; + } + return PKG_SUCCESS; +} + int GetUpdatePackageInfo(PkgManager::PkgManagerPtr pkgManager, const std::string &path) { std::vector components; @@ -265,6 +296,64 @@ __attribute__((weak)) bool PreStartBinaryEntry([[maybe_unused]] const std::strin return true; } +UpdaterStatus DoInstallUpdaterBinfile(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams, + PackageUpdateMode updateMode) +{ + UPDATER_INIT_RECORD; + UPDATER_UI_INSTANCE.ShowProgressPage(); + if (upParams.callbackProgress == nullptr) { + LOG(ERROR) << "CallbackProgress is nullptr"; + UPDATER_LAST_WORD(UPDATE_CORRUPT, "CallbackProgress is nullptr"); + return UPDATE_CORRUPT; + } + upParams.callbackProgress(upParams.initialProgress * FULL_PERCENT_PROGRESS); + if (pkgManager == nullptr) { + LOG(ERROR) << "pkgManager is nullptr"; + UPDATER_LAST_WORD(UPDATE_CORRUPT, "pkgManager is nullptr"); + return UPDATE_CORRUPT; + } + + if (SetupPartitions(updateMode != SDCARD_UPDATE || upParams.sdExtMode == SDCARD_UPDATE_FROM_DEV || + upParams.sdExtMode == SDCARD_UPDATE_FROM_DATA || Utils::CheckUpdateMode(Updater::SDCARD_INTRAL_MODE) || + Utils::CheckUpdateMode(Updater::FACTORY_INTERNAL_MODE)) != 0) { + UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_SETPART_FAIL), true); + UPDATER_LAST_WORD(UPDATE_ERROR, "SetupPartitions failed"); + return UPDATE_ERROR; + } + + if (upParams.retryCount > 0) { + LOG(INFO) << "Retry for " << upParams.retryCount << " time(s)"; + } + LOG(INFO) << "upParams.updateBin[upParams.pkgLocation]:" << upParams.updateBin[upParams.pkgLocation]; + + // 获取zip信息 + int ret = GetUpdateStreamzipInfo(pkgManager, STREAM_ZIP_PATH); + if (ret != 0) { + LOG(ERROR) << "get update package info fail"; + UPDATER_LAST_WORD(UPDATE_CORRUPT, "GetUpdatePackageInfo failed"); + return UPDATE_CORRUPT; + } + if (!PreStartBinaryEntry(upParams.updateBin[upParams.pkgLocation])) { + LOG(ERROR) << "pre binary process failed"; + UPDATER_LAST_WORD(UPDATE_ERROR, "PreStartBinaryEntry failed"); + return UPDATE_ERROR; + } + + g_tmpProgressValue = 0; + // 从bin文件开启进程 + UpdaterStatus updateRet = StartUpdaterProc(pkgManager, upParams); + if (updateRet != UPDATE_SUCCESS) { + UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_INSTALL_FAIL)); + UPDATER_LAST_WORD(updateRet, "StartUpdaterProc failed"); + LOG(ERROR) << "Install package failed."; + } + if (WriteResult(upParams.updateBin[upParams.pkgLocation], + updateRet == UPDATE_SUCCESS ? "verify_success" : "verify_fail") != UPDATE_SUCCESS) { + LOG(ERROR) << "write update state fail"; + } + return updateRet; +} + UpdaterStatus DoInstallUpdaterPackage(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams, PackageUpdateMode updateMode) { @@ -400,8 +489,36 @@ void HandleChildOutput(const std::string &buffer, int32_t bufferLen, bool &retry } } +// void ExcuteSubProcFromBin(const UpdaterParams &upParams, const std::string &fullPath, int pipeWrite) +// { +// LOG(INFO) << "enter ExcuteSubProcFromBin"; +// UPDATER_INIT_RECORD; +// // Set process scheduler to normal if current scheduler is +// // SCHED_FIFO, which may cause bad performance. +// int policy = syscall(SYS_sched_getscheduler, getpid()); +// if (policy == -1) { +// LOG(INFO) << "Cannnot get current process scheduler"; +// } else if (policy == SCHED_FIFO) { +// LOG(DEBUG) << "Current process with scheduler SCHED_FIFO"; +// struct sched_param sp = { +// .sched_priority = 0, +// }; +// if (syscall(SYS_sched_setscheduler, getpid(), SCHED_OTHER, &sp) < 0) { +// LOG(WARNING) << "Cannot set current process schedule with SCHED_OTHER"; +// } +// } +// const std::string retryPara = upParams.retryCount > 0 ? "retry=1" : "retry=0"; +// execl(fullPath.c_str(), fullPath.c_str(), upParams.updateBin[upParams.pkgLocation].c_str(), +// std::to_string(pipeWrite).c_str(), retryPara.c_str(), nullptr); +// LOG(ERROR) << "Execute updater binary failed"; +// UPDATER_LAST_WORD(UPDATE_ERROR, "Execute updater binary failed"); +// exit(-1); +// } + + void ExcuteSubProc(const UpdaterParams &upParams, const std::string &fullPath, int pipeWrite) { + LOG(INFO) << "enter ExcuteSubProc"; UPDATER_INIT_RECORD; // Set process scheduler to normal if current scheduler is // SCHED_FIFO, which may cause bad performance. @@ -418,8 +535,15 @@ void ExcuteSubProc(const UpdaterParams &upParams, const std::string &fullPath, i } } const std::string retryPara = upParams.retryCount > 0 ? "retry=1" : "retry=0"; - execl(fullPath.c_str(), fullPath.c_str(), upParams.updatePackage[upParams.pkgLocation].c_str(), + if (upParams.updateBin.size() > 0) { + LOG(INFO) << "Binary Path:" << upParams.updateBin[upParams.pkgLocation].c_str(); + execl(fullPath.c_str(), fullPath.c_str(), upParams.updateBin[upParams.pkgLocation].c_str(), + std::to_string(pipeWrite).c_str(), retryPara.c_str(), nullptr); + } else if (upParams.updatePackage.size() > 0) { + LOG(INFO) << "Binary Path:" << upParams.updatePackage[upParams.pkgLocation].c_str(); + execl(fullPath.c_str(), fullPath.c_str(), upParams.updatePackage[upParams.pkgLocation].c_str(), std::to_string(pipeWrite).c_str(), retryPara.c_str(), nullptr); + } LOG(ERROR) << "Execute updater binary failed"; UPDATER_LAST_WORD(UPDATE_ERROR, "Execute updater binary failed"); exit(-1); @@ -476,11 +600,30 @@ UpdaterStatus CheckProcStatus(pid_t pid, bool retryUpdate) return UPDATE_SUCCESS; } -static std::string GetBinaryPath(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams) +static std::string GetBinaryPathFromBin(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams) { + LOG(INFO) << "enter GetBinaryPathFromBin"; std::string fullPath = GetWorkPath() + std::string(UPDATER_BINARY); (void)Utils::DeleteFile(fullPath); + std::string toolPath = "/data/updater/update_stream.zip"; + LOG(INFO) << "GetBinaryPath:" << toolPath; + if (ExtractUpdaterBinary(pkgManager, toolPath, UPDATER_BINARY) != 0) { + LOG(INFO) << "There is no valid updater_binary in package, use updater_binary in device"; + fullPath = "/bin/updater_binary"; + } + +#ifdef UPDATER_UT + fullPath = "/data/updater/updater_binary"; +#endif + return fullPath; +} +static std::string GetBinaryPath(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams) +{ + LOG(INFO) << "enter GetBinaryPath"; + std::string fullPath = GetWorkPath() + std::string(UPDATER_BINARY); + (void)Utils::DeleteFile(fullPath); + LOG(INFO) << "GetBinaryPath:" << upParams.updatePackage[upParams.pkgLocation]; if (ExtractUpdaterBinary(pkgManager, upParams.updatePackage[upParams.pkgLocation], UPDATER_BINARY) != 0) { LOG(INFO) << "There is no valid updater_binary in package, use updater_binary in device"; fullPath = "/bin/updater_binary"; @@ -509,7 +652,13 @@ UpdaterStatus StartUpdaterProc(PkgManager::PkgManagerPtr pkgManager, UpdaterPara int pipeRead = pfd[0]; int pipeWrite = pfd[1]; - std::string fullPath = GetBinaryPath(pkgManager, upParams); + std::string fullPath = ""; + if (upParams.updateBin.size() > 0) { + fullPath = GetBinaryPathFromBin(pkgManager, upParams); + } else if (upParams.updatePackage.size() > 0) { + fullPath = GetBinaryPath(pkgManager, upParams); + } + LOG(INFO) << "fullPath" << fullPath; if (chmod(fullPath.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) { LOG(ERROR) << "Failed to change mode"; } @@ -517,7 +666,6 @@ UpdaterStatus StartUpdaterProc(PkgManager::PkgManagerPtr pkgManager, UpdaterPara #ifdef WITH_SELINUX Restorecon(fullPath.c_str()); #endif // WITH_SELINUX - pid_t pid = fork(); if (pid < 0) { ERROR_CODE(CODE_FORK_FAIL); diff --git a/services/updater_binary/BUILD.gn b/services/updater_binary/BUILD.gn index 754e1e2f..a22162a0 100644 --- a/services/updater_binary/BUILD.gn +++ b/services/updater_binary/BUILD.gn @@ -46,6 +46,7 @@ updater_gen("updater_binary") { ohos_static_library("libupdater_binary") { sources = [ "${updater_path}/services/updater_binary/main.cpp", + "${updater_path}/services/updater_binary/update_processor_stream.cpp", "${updater_path}/services/updater_binary/update_image_block.cpp", "${updater_path}/services/updater_binary/update_image_patch.cpp", "${updater_path}/services/updater_binary/update_partitions.cpp", @@ -61,6 +62,7 @@ ohos_static_library("libupdater_binary") { "${updater_path}/services/applypatch:libapplypatch", "${updater_path}/services/diffpatch/patch:libpatch", "${updater_path}/services/flow_update/update_bin:libBinFlowUpdate", + "${updater_path}/services/stream_update:libbinchunkupdate", "${updater_path}/services/fs_manager:libfsmanager", "${updater_path}/services/log:libupdaterlog", "${updater_path}/services/package:libupdaterpackage", diff --git a/services/updater_binary/main.cpp b/services/updater_binary/main.cpp index a581259e..6ce4225e 100644 --- a/services/updater_binary/main.cpp +++ b/services/updater_binary/main.cpp @@ -21,12 +21,14 @@ #include "log.h" #include "updater/updater_const.h" #include "update_processor.h" +#include "update_processor_stream.h" #include "utils.h" using namespace Updater; #ifndef UPDATER_UT int main(int argc, char **argv) { + LOG(INFO) << "enter updaterbinary"; InitLogger("UPDATER_BINARY"); if (argc < MINIMAL_ARGC_LIMIT || argc > MAXIMAL_ARGC_LIMIT) { LOG(ERROR) << "Invalid arguments:" << argc; @@ -52,6 +54,14 @@ int main(int argc, char **argv) // Re-load fstab to child process. LoadFstab(); - return ProcessUpdater(retry, pipeFd, packagePath, Utils::GetCertName()); + + // 根据 packagePath 的后缀选择执行不同的函数 + std::string fileExtension = packagePath.substr(packagePath.find_last_of(".") + 1); + std::transform(fileExtension.begin(), fileExtension.end(), fileExtension.begin(), ::tolower); + if (fileExtension == "zip") { + return ProcessUpdater(retry, pipeFd, packagePath, Utils::GetCertName()); + } else if (fileExtension == "bin") { + return ProcessUpdaterStream(retry, pipeFd, packagePath, Utils::GetCertName()); + } } #endif diff --git a/services/updater_binary/update_processor.cpp b/services/updater_binary/update_processor.cpp index 3241e550..a2a07566 100644 --- a/services/updater_binary/update_processor.cpp +++ b/services/updater_binary/update_processor.cpp @@ -471,6 +471,7 @@ int UScriptInstructionRawImageWrite::GetWritePathAndOffset(const std::string &pa int ProcessUpdater(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath) { + LOG(INFO) << "enter ProcessUpdater"; UPDATER_INIT_RECORD; UpdaterInit::GetInstance().InvokeEvent(UPDATER_BINARY_INIT_EVENT); Dump::GetInstance().RegisterDump("DumpHelperLog", std::make_unique()); diff --git a/services/updater_binary/update_processor_stream.cpp b/services/updater_binary/update_processor_stream.cpp new file mode 100755 index 00000000..a9388da5 --- /dev/null +++ b/services/updater_binary/update_processor_stream.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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 "update_processor.h" +#include +#include +#include +#include +#include +#include "securec.h" +#include "applypatch/data_writer.h" +#include "applypatch/partition_record.h" +#include "applypatch/update_progress.h" +#include "dump.h" +#include "log.h" +#include "package/hash_data_verifier.h" +#include "pkg_manager.h" +#ifdef UPDATER_USE_PTABLE +#include "ptable_manager.h" +#endif +#include "script_instruction.h" +#include "script_manager.h" +#include "slot_info/slot_info.h" +#include "updater_main.h" +#include "updater/updater_const.h" +#include "update_bin/bin_process.h" +#include "scope_guard.h" +#include "bin_chunk_update.h" + +using namespace Uscript; +using namespace Hpackage; +using namespace Updater; + +namespace Updater { +constexpr uint32_t BUFFER_SIZE = 50 * 1024; +constexpr uint32_t MAX_UPDATER_BUFFER_SIZE = 2 * BUFFER_SIZE; + +enum UpdateStatus { + UPDATE_STATE_INIT = 0, + UPDATE_STATE_ONGOING, + UPDATE_STATE_FAILED, + UPDATE_STATE_SUCCESSFUL, + UPDATE_STATE_MAX +}; + + +bool ReadLE16(std::istream& is, uint16_t& value) { + char buf[2]; + if (!is.read(buf, sizeof(buf))) return false; + value = static_cast(static_cast(buf[0])) | + (static_cast(static_cast(buf[1])) << 8); + return true; +} + +bool ReadLE32(std::istream& is, uint32_t& value) { + char buf[4]; + if (!is.read(buf, sizeof(buf))) return false; + value = static_cast(static_cast(buf[0])) | + (static_cast(static_cast(buf[1])) << 8) | + (static_cast(static_cast(buf[2])) << 16) | + (static_cast(static_cast(buf[3])) << 24); + return true; +} + +static int ProcessUpdateFile(const std::string &packagePath, FILE* pipeWrite) +{ + std::shared_ptr binChunkUpdate_ {}; + LOG(INFO) << "enter Doinstallbinfile"; + // 打开输入文件 + std::ifstream in_file(packagePath, std::ios::binary); + if (!in_file) { + LOG(ERROR) << "Error: Failed to open " << packagePath; + return UPDATE_ERROR; + } + uint16_t type = 0; + if (!ReadLE16(in_file, type)) { + LOG(ERROR) << "Failed to read type"; + return UPDATE_ERROR; + } + LOG(INFO) << "header.type = 0x" << std::hex << type;; + if (type != 0x11) { + LOG(ERROR) << "Unsupported header type: 0x" << std::hex << type; + in_file.close(); + return UPDATE_ERROR; + } + uint32_t length = 0; + if (!ReadLE32(in_file, length)) { + LOG(ERROR) << "Failed to read length"; + return UPDATE_ERROR; + } + LOG(INFO) << "header.length = " << length; + + if (!in_file.seekg(length, std::ios::cur)) { + in_file.close(); + LOG(ERROR) << "Failed to seekg length"; + return UPDATE_ERROR; + } + + LOG(INFO) << "read file zip successful!"; + + // 读取剩余数据 + std::vector buffer_stream(BUFFER_SIZE); + binChunkUpdate_ = std::make_unique(MAX_UPDATER_BUFFER_SIZE); + while (!in_file.eof()) { + in_file.read(reinterpret_cast(buffer_stream.data()), buffer_stream.size()); + size_t read_bytes = in_file.gcount(); + uint32_t dealLen = 0; + LOG(INFO) << "Read " << read_bytes << " bytes from new update.bin"; + if (read_bytes > 0) { + LOG(INFO) << "do libbinchunkupdate"; + UpdateResultCode ret = binChunkUpdate_->StartBinChunkUpdate(buffer_stream.data(), static_cast(read_bytes), dealLen); + LOG(INFO) << "StartBinChunkUpdate ret = " << ret; + if (STREAM_UPDATE_SUCCESS == ret) { + LOG(INFO) << "StreamInstallProcesser ThreadExecuteFunc STREM_UPDATE_SUCCESS"; + } else if (STREAM_UPDATE_FAILURE == ret) { + LOG(ERROR) << "StreamInstallProcesser ThreadExecuteFunc STREM_UPDATE_FAILURE"; + return UPDATE_ERROR; + } else if (STREAM_UPDATE_COMPLETE == ret) { + LOG(INFO) << "StreamInstallProcesser ThreadExecuteFunc STREM_UPDATE_COMPLETE"; + break; + } + } + } + in_file.close(); + return UPDATE_SUCCESS; +} + +int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath) { + UPDATER_INIT_RECORD; + UpdaterInit::GetInstance().InvokeEvent(UPDATER_BINARY_INIT_EVENT); + Dump::GetInstance().RegisterDump("DumpHelperLog", std::make_unique()); + + // 初始化管道 + std::unique_ptr pipeWrite(fdopen(pipeFd, "w"), fclose); + if (pipeWrite == nullptr) { + LOG(ERROR) << "Fail to fdopen, err: " << strerror(errno); + UPDATER_LAST_WORD(strerror(errno), "Fail to fdopen"); + return EXIT_INVALID_ARGS; + } + + int ret = -1; + Detail::ScopeGuard guard([&] { + (void)fprintf(pipeWrite.get(), "subProcessResult:%d\n", ret); + (void)fflush(pipeWrite.get()); + }); + setlinebuf(pipeWrite.get()); + + // 初始化包管理器 + PkgManager::PkgManagerPtr pkgManager = PkgManager::CreatePackageInstance(); + if (pkgManager == nullptr) { + LOG(ERROR) << "pkgManager is nullptr"; + UPDATER_LAST_WORD(EXIT_INVALID_ARGS, "pkgManager is nullptr"); + return EXIT_INVALID_ARGS; + } + + // 加载包 + std::vector components; + int loadRet = pkgManager->LoadPackage(packagePath, keyPath, components); + if (loadRet != PKG_SUCCESS) { + LOG(ERROR) << "Fail to load package"; + PkgManager::ReleasePackageInstance(pkgManager); + UPDATER_LAST_WORD("Fail to load package", packagePath, keyPath); + return EXIT_INVALID_ARGS; + } + +#ifdef UPDATER_USE_PTABLE + // 分区表操作 + if (!PackagePtable::GetInstance().WritePtableWithFile()) { + LOG(ERROR) << "write ptable with file fail"; + PkgManager::ReleasePackageInstance(pkgManager); + UPDATER_LAST_WORD("Error to write ptable with file"); + return EXIT_EXEC_SCRIPT_ERROR; + } + if (!DevicePtable::GetInstance().LoadPartitionInfo()) { + PkgManager::ReleasePackageInstance(pkgManager); + return EXIT_EXEC_SCRIPT_ERROR; + } +#endif + + // 调用核心函数并传递管道 + LOG(INFO) << "enter ProcessUpdater"; + ret = ProcessUpdateFile(packagePath, pipeWrite.get()); + if (ret != UPDATE_SUCCESS) { + LOG(ERROR) << "ProcessUpdaterStream failed with code: " << ret; + } + + // 释放资源 + PkgManager::ReleasePackageInstance(pkgManager); + return ret; +} +} // Updater \ No newline at end of file diff --git a/services/updater_binary/update_processor_stream.h b/services/updater_binary/update_processor_stream.h new file mode 100755 index 00000000..e9407346 --- /dev/null +++ b/services/updater_binary/update_processor_stream.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * 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. + */ +#ifndef UPDATE_PROCESSOR_STREAM_H +#define UPDATE_PROCESSOR_STREAM_H + +#include +#include +#include +#include +#include "applypatch/data_writer.h" +#include "pkg_manager.h" +#include "script_instruction.h" +#include "script_manager.h" +#include "bin_chunk_update.h" + +using Uscript::UScriptEnv; +using Uscript::UScriptInstructionFactory; +using Uscript::UScriptInstructionFactoryPtr; +using Uscript::UScriptInstructionPtr; + +namespace Updater { +int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath); + +} // Updater +#endif /* UPDATE_PROCESSOR_H */ diff --git a/services/updater_main.cpp b/services/updater_main.cpp index 01f324b5..b5d900ec 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -51,6 +51,8 @@ #include "factory_reset/factory_reset.h" #include "write_state/write_state.h" +#define TYPE_ZIP_HEADER 0x11 + namespace Updater { using Utils::String2Int; using namespace Hpackage; @@ -59,6 +61,7 @@ using namespace std::literals::chrono_literals; [[maybe_unused]] constexpr int DISPLAY_TIME = 1000 * 1000; constexpr struct option OPTIONS[] = { + { "update_bin", required_argument, nullptr, 0 }, { "update_package", required_argument, nullptr, 0 }, { "retry_count", required_argument, nullptr, 0 }, { "factory_wipe_data", no_argument, nullptr, 0 }, @@ -84,6 +87,24 @@ constexpr struct option OPTIONS[] = { constexpr float VERIFY_PERCENT = 0.05; constexpr double FULL_PERCENT = 100.00; +bool ReadLE16(std::istream& is, uint16_t& value) { + char buf[2]; + if (!is.read(buf, sizeof(buf))) return false; + value = static_cast(static_cast(buf[0])) | + (static_cast(static_cast(buf[1])) << 8); + return true; +} + +bool ReadLE32(std::istream& is, uint32_t& value) { + char buf[4]; + if (!is.read(buf, sizeof(buf))) return false; + value = static_cast(static_cast(buf[0])) | + (static_cast(static_cast(buf[1])) << 8) | + (static_cast(static_cast(buf[2])) << 16) | + (static_cast(static_cast(buf[3])) << 24); + return true; +} + int FactoryReset(FactoryResetMode mode, const std::string &path) { UpdaterInit::GetInstance().InvokeEvent(FACTORY_RESET_INIT_EVENT); @@ -95,6 +116,93 @@ int FactoryReset(FactoryResetMode mode, const std::string &path) return ret; } +static UpdaterStatus ReadUpdateStreamzip(const std::string &packagePath) +{ + std::filesystem::path packageFsPath(packagePath); + std::filesystem::path outputPath = packageFsPath.parent_path() / "update_stream.zip"; + std::string outputPathStr = outputPath.string(); + LOG(INFO) << "outputPathStr:" << outputPathStr; + + std::ifstream in_file(packagePath, std::ios::binary); + if (!in_file) { + LOG(ERROR) << "Error: Failed to open " << packagePath; + return UPDATE_ERROR; + } + uint16_t type; + if (!ReadLE16(in_file, type)) { + LOG(ERROR) << "Failed to read type"; + return UPDATE_ERROR; + } + if (type != TYPE_ZIP_HEADER) { + LOG(ERROR) << "Invalid type, expected 0x11 but got " << type; + return UPDATE_ERROR; + } + + uint32_t length; + if (!ReadLE32(in_file, length)) { + LOG(ERROR) << "Failed to read length"; + return UPDATE_ERROR; + } + LOG(INFO) << "header.length = " << length; + + std::vector valueData(length); + if (!in_file.read(valueData.data(), length)) { + LOG(ERROR) << "Incomplete value data"; + return UPDATE_ERROR; + } + + std::ofstream outFile(outputPathStr, std::ios::binary); + if (!outFile.write(valueData.data(), length)) { + LOG(ERROR) << "Write failed"; + return UPDATE_ERROR; + } + LOG(INFO) << "Successfully restored build_tools.zip to " << outputPathStr; + return UPDATE_SUCCESS; +} +const char* getFileType(const char* path, struct stat* st) { + if (lstat(path, st) != 0) { + return "Unknown"; + } + + switch (st->st_mode & S_IFMT) { + case S_IFREG: return "File"; + case S_IFDIR: return "Directory"; + case S_IFLNK: return "Symlink"; + case S_IFIFO: return "FIFO"; + case S_IFSOCK: return "Socket"; + case S_IFCHR: return "CharDevice"; + case S_IFBLK: return "BlockDevice"; + default: return "Unknown"; + } +} +static UpdaterStatus GetReadUpdateStreamzipFromBinfile(PkgManager::PkgManagerPtr pkgManager, const std::string &packagePath) +{ + UPDATER_INIT_RECORD; + if (pkgManager == nullptr) { + LOG(ERROR) << "pkgManager is nullptr"; + UPDATER_LAST_WORD(PKG_INVALID_FILE, "pkgManager is nullptr"); + return UPDATE_CORRUPT; + } + char realPath[PATH_MAX + 1] = {0}; + if (realpath(packagePath.c_str(), realPath) == nullptr) { + LOG(ERROR) << "realpath error"; + UPDATER_LAST_WORD(PKG_INVALID_FILE, "realpath error"); + return UPDATE_CORRUPT; + } + if (access(realPath, F_OK) != 0) { + LOG(ERROR) << "binfile does not exist!"; + UPDATER_LAST_WORD(PKG_INVALID_FILE, "package does not exist!"); + return UPDATE_CORRUPT; + } + // 获取Build_tools_zip内容 + int32_t status = ReadUpdateStreamzip(packagePath); + if (status != UPDATE_SUCCESS) { + LOG(ERROR) << "ReadUpdateStreamzip failed"; + return UPDATE_ERROR; + } + return UPDATE_SUCCESS; +} + static int OtaUpdatePreCheck(PkgManager::PkgManagerPtr pkgManager, const std::string &packagePath) { UPDATER_INIT_RECORD; @@ -157,6 +265,12 @@ static UpdaterStatus UpdatePreCheck(UpdaterParams &upParams, const std::string p return UPDATE_SUCCESS; } +__attribute__((weak)) int32_t VerifySpecialBin([[maybe_unused]]UpdaterParams &upParams) +{ + return PKG_SUCCESS; +} + + __attribute__((weak)) int32_t VerifySpecialPkgs([[maybe_unused]]UpdaterParams &upParams) { return PKG_SUCCESS; @@ -180,6 +294,60 @@ __attribute__((weak)) void NotifyReboot(const std::string& rebootTarget, Updater::Utils::UpdaterDoReboot(rebootTarget, rebootReason, extData); } +static UpdaterStatus VerifyBinfiles(UpdaterParams &upParams) +{ + UPDATER_INIT_RECORD; + LOG(INFO) << "Verify binfiles start..."; + UPDATER_UI_INSTANCE.ShowProgressPage(); + UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKG)); + + if (upParams.callbackProgress == nullptr) { + UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true); + UPDATER_LAST_WORD(UPDATE_CORRUPT, "upParams.callbackProgress is null"); + return UPDATE_CORRUPT; + } + upParams.callbackProgress(0.0); + upParams.installTime.resize(upParams.updateBin.size(), std::chrono::duration(0)); + ReadInstallTime(upParams); + for (unsigned int i = upParams.pkgLocation; i < upParams.updateBin.size(); i++) { + LOG(INFO) << "Verify package:" << upParams.updateBin[i]; + auto startTime = std::chrono::system_clock::now(); + PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); + if (manager == nullptr) { + LOG(ERROR) << "CreatePackageInstance fail"; + return UPDATE_ERROR; + } + // 从update_bin中获取zip + int32_t status = GetReadUpdateStreamzipFromBinfile(manager, upParams.updateBin[i]); + if (status != UPDATE_SUCCESS) { + LOG(ERROR) << "GetReadUpdateStreamzipFromBinfile fail"; + return UPDATE_ERROR; + } + // 验证update_stream.zip包 + int32_t verifyret = OtaUpdatePreCheck(manager, STREAM_ZIP_PATH); + PkgManager::ReleasePackageInstance(manager); + if (verifyret != UPDATE_SUCCESS) { + UpdaterVerifyFailEntry((verifyret == PKG_INVALID_DIGEST) && (upParams.updateMode == HOTA_UPDATE)); + upParams.pkgLocation = i; + UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true); + auto endTime = std::chrono::system_clock::now(); + upParams.installTime[i] = endTime - startTime; + return UPDATE_CORRUPT; + } + auto endTime = std::chrono::system_clock::now(); + upParams.installTime[i] = endTime - startTime; + } + + if (VerifySpecialBin(upParams) != PKG_SUCCESS) { + UPDATER_LAST_WORD(UPDATE_CORRUPT, "VerifySpecialBin failed"); + return UPDATE_CORRUPT; + } + ProgressSmoothHandler(UPDATER_UI_INSTANCE.GetCurrentPercent(), + UPDATER_UI_INSTANCE.GetCurrentPercent() + static_cast(VERIFY_PERCENT * FULL_PERCENT_PROGRESS)); + LOG(INFO) << "Verify binfiles successfull..."; + return UPDATE_SUCCESS; +} + static UpdaterStatus VerifyPackages(UpdaterParams &upParams) { UPDATER_INIT_RECORD; @@ -297,6 +465,27 @@ bool IsBatteryCapacitySufficient() return capacity >= lowLevel; } +UpdaterStatus InstallUpdaterBinfile(UpdaterParams &upParams, PkgManager::PkgManagerPtr manager) +{ + UPDATER_INIT_RECORD; + UpdaterStatus status = UPDATE_UNKNOWN; + STAGE(UPDATE_STAGE_BEGIN) << "enter InstallUpdaterBinfile"; + status = DoInstallUpdaterBinfile(manager, upParams, HOTA_UPDATE); + if (status != UPDATE_SUCCESS) { + UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION); + UPDATER_UI_INSTANCE.ShowLog(TR(LOG_UPDFAIL)); + STAGE(UPDATE_STAGE_FAIL) << "Install failed"; + if (status == UPDATE_RETRY) { + HwFaultRetry::GetInstance().DoRetryAction(); + UPDATER_UI_INSTANCE.ShowFailedPage(); + } + } else { + LOG(INFO) << "Install binfile success."; + STAGE(UPDATE_STAGE_SUCCESS) << "Install binfile"; + } + return status; +} + UpdaterStatus InstallUpdaterPackage(UpdaterParams &upParams, PkgManager::PkgManagerPtr manager) { UPDATER_INIT_RECORD; @@ -331,6 +520,49 @@ UpdaterStatus InstallUpdaterPackage(UpdaterParams &upParams, PkgManager::PkgMana return status; } +static UpdaterStatus CalcProgressFromBin(const UpdaterParams &upParams, + std::vector &pkgStartPosition, double &updateStartPosition) +{ + UPDATER_INIT_RECORD; + int64_t allPkgSize = 0; + std::vector everyPkgSize; + if (upParams.pkgLocation == upParams.updateBin.size()) { + updateStartPosition = VERIFY_PERCENT; + return UPDATE_SUCCESS; + } + for (const auto &path : upParams.updateBin) { + char realPath[PATH_MAX + 1] = {0}; + if (realpath(path.c_str(), realPath) == nullptr) { + LOG(WARNING) << "Can not find updatePackage : " << path; + everyPkgSize.push_back(0); + continue; + } + struct stat st {}; + if (stat(realPath, &st) == 0) { + everyPkgSize.push_back(st.st_size); + allPkgSize += st.st_size; + LOG(INFO) << "pkg " << path << " size is:" << st.st_size; + } + } + pkgStartPosition.push_back(VERIFY_PERCENT); + if (allPkgSize == 0) { + LOG(ERROR) << "All packages's size is 0."; + UPDATER_LAST_WORD(UPDATE_ERROR, "All packages's size is 0."); + return UPDATE_ERROR; + } + int64_t startSize = 0; + for (auto size : everyPkgSize) { + startSize += size; + float percent = static_cast(startSize) / static_cast(allPkgSize) + VERIFY_PERCENT; + percent = (percent > 1.0) ? 1.0 : percent; // 1.0 : 100% + LOG(INFO) << "percent is:" << percent; + pkgStartPosition.push_back(percent); + } + + updateStartPosition = pkgStartPosition[upParams.pkgLocation]; + return UPDATE_SUCCESS; +} + static UpdaterStatus CalcProgress(const UpdaterParams &upParams, std::vector &pkgStartPosition, double &updateStartPosition) { @@ -408,30 +640,48 @@ static UpdaterStatus PreUpdatePackages(UpdaterParams &upParams) UpdaterStatus status = UPDATE_UNKNOWN; - upParams.installTime.resize(upParams.updatePackage.size(), std::chrono::duration(0)); - if (CheckMountData() != 0) { - return UPDATE_ERROR; + if (upParams.updateBin.size() > 0) { + upParams.installTime.resize(upParams.updateBin.size(), std::chrono::duration(0)); + if (CheckMountData() != 0) { + return UPDATE_ERROR; + } + } else if (upParams.updatePackage.size() > 0) { + upParams.installTime.resize(upParams.updatePackage.size(), std::chrono::duration(0)); + if (CheckMountData() != 0) { + return UPDATE_ERROR; + } } const std::string resultPath = std::string(UPDATER_PATH) + "/" + std::string(UPDATER_RESULT_FILE); if (access(resultPath.c_str(), F_OK) != -1) { (void)DeleteFile(resultPath); LOG(INFO) << "delete last upgrade file"; } - - if (upParams.pkgLocation == upParams.updatePackage.size()) { - LOG(WARNING) << "all package has been upgraded, skip pre process"; - return UPDATE_SUCCESS; - } - - // verify package first - if (VerifyPackages(upParams) != UPDATE_SUCCESS) { - return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!! + if (upParams.updateBin.size() > 0) { + if (upParams.pkgLocation == upParams.updateBin.size()) { + LOG(WARNING) << "all package has been upgraded, skip pre process"; + return UPDATE_SUCCESS; + } + // 从bin文件中提取zip文件 + if (VerifyBinfiles(upParams) != UPDATE_SUCCESS) { + return UPDATE_CORRUPT; // verify binfiles failed must return UPDATE_CORRUPT, ux need it !!! + } + } else if (upParams.updatePackage.size() > 0) { + if (upParams.pkgLocation == upParams.updatePackage.size()) { + LOG(WARNING) << "all package has been upgraded, skip pre process"; + return UPDATE_SUCCESS; + } + // verify package first + if (VerifyPackages(upParams) != UPDATE_SUCCESS) { + return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!! + } } // Only handle UPATE_ERROR and UPDATE_SUCCESS here.Let package verify handle others. - if (IsSpaceCapacitySufficient(upParams) == UPDATE_ERROR) { - UPDATER_LAST_WORD(status, "space nott enough"); - return status; + if (upParams.updatePackage.size() > 0) { + if (IsSpaceCapacitySufficient(upParams) == UPDATE_ERROR) { + UPDATER_LAST_WORD(status, "space nott enough"); + return status; + } } if (upParams.retryCount == 0 && !IsBatteryCapacitySufficient()) { UPDATER_UI_INSTANCE.ShowUpdInfo(TR(LOG_LOWPOWER)); @@ -455,6 +705,49 @@ static UpdaterStatus PreUpdatePackages(UpdaterParams &upParams) return UPDATE_SUCCESS; } +static UpdaterStatus DoInstallBinfiles(UpdaterParams &upParams, std::vector &pkgStartPosition) +{ + UPDATER_INIT_RECORD; + UpdaterStatus status = UPDATE_UNKNOWN; + if (upParams.pkgLocation == upParams.updateBin.size()) { + LOG(WARNING) << "all Binfiles has been installed, directly return success"; + upParams.callbackProgress(FULL_PERCENT_PROGRESS); + return UPDATE_SUCCESS; + } + PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance(); + if (manager == nullptr) { + LOG(ERROR) << "CreatePackageInstance fail"; + return UPDATE_ERROR; + } + auto startTime = std::chrono::system_clock::now(); + upParams.initialProgress = ((UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) > + pkgStartPosition[upParams.pkgLocation]) ? + (UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) : pkgStartPosition[upParams.pkgLocation]; + upParams.currentPercentage = pkgStartPosition[upParams.pkgLocation + 1] - upParams.initialProgress; + LOG(INFO) << "InstallUpdaterBin pkg is " << upParams.updateBin[upParams.pkgLocation] << + " percent:" << upParams.initialProgress << "~" << pkgStartPosition[upParams.pkgLocation + 1]; + // 安装bin文件 + status = InstallUpdaterBinfile(upParams, manager); + auto endTime = std::chrono::system_clock::now(); + upParams.installTime[upParams.pkgLocation] = upParams.installTime[upParams.pkgLocation] + endTime - startTime; + WriteInstallTime(upParams); + if (status != UPDATE_SUCCESS) { + LOG(ERROR) << "InstallUpdaterBin failed! Pkg is " << upParams.updateBin[upParams.pkgLocation]; + if (!CheckResultFail()) { + UPDATER_LAST_WORD(status, "InstallUpdaterBin failed"); + } + PkgManager::ReleasePackageInstance(manager); + return status; + } + ProgressSmoothHandler( + static_cast(upParams.initialProgress * FULL_PERCENT_PROGRESS + + upParams.currentPercentage * GetTmpProgressValue()), + static_cast(pkgStartPosition[upParams.pkgLocation + 1] * FULL_PERCENT_PROGRESS)); + SetMessageToMisc(upParams.miscCmd, upParams.pkgLocation + 1, "upgraded_pkg_num"); + PkgManager::ReleasePackageInstance(manager); + return status; +} + static UpdaterStatus DoInstallPackages(UpdaterParams &upParams, std::vector &pkgStartPosition) { UPDATER_INIT_RECORD; @@ -499,6 +792,48 @@ static UpdaterStatus DoInstallPackages(UpdaterParams &upParams, std::vector pkgStartPosition {}; + double updateStartPosition = 0.0; + status = CalcProgressFromBin(upParams, pkgStartPosition, updateStartPosition); + if (status != UPDATE_SUCCESS) { + UPDATER_LAST_WORD(status, "CalcProgress failed"); + return status; + } + for (unsigned int i = 0; i < upParams.updateBin.size(); i++) { + LOG(INFO) << "package " << i << ":" << upParams.updateBin[i] << + " percent:" << upParams.currentPercentage; + } + if (upParams.callbackProgress == nullptr) { + LOG(ERROR) << "CallbackProgress is nullptr"; + return UPDATE_CORRUPT; + } + float value = (UPDATER_UI_INSTANCE.GetCurrentPercent() > (updateStartPosition * FULL_PERCENT_PROGRESS)) ? + UPDATER_UI_INSTANCE.GetCurrentPercent() : (updateStartPosition * FULL_PERCENT_PROGRESS); + upParams.callbackProgress(value); + // 执行安装 + status = DoInstallBinfiles(upParams, pkgStartPosition); + if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) { + LOG(ERROR) << "get status fail"; + return UPDATE_CORRUPT; + } + if (status != UPDATE_SUCCESS) { + UPDATER_LAST_WORD(status, "DoInstallBinfiles failed"); + return status; + } + if (upParams.forceUpdate) { + UPDATER_UI_INSTANCE.ShowLogRes(TR(LABEL_UPD_OK_SHUTDOWN)); + } + if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) { + LOG(ERROR) << "get status fail"; + return UPDATE_CORRUPT; + } + UPDATER_UI_INSTANCE.ShowSuccessPage(); + return status; +} UpdaterStatus DoUpdatePackages(UpdaterParams &upParams) { @@ -542,6 +877,44 @@ UpdaterStatus DoUpdatePackages(UpdaterParams &upParams) return status; } +static void PostUpdateBinfiles(UpdaterParams &upParams, bool updateResult) +{ + std::string writeBuffer; + std::string buf; + std::string time; + if (!updateResult) { + const std::string resultPath = std::string(UPDATER_PATH) + "/" + std::string(UPDATER_RESULT_FILE); + std::ifstream fin {resultPath}; + if (!fin.is_open() || !std::getline(fin, buf)) { + LOG(ERROR) << "read result file error " << resultPath; + buf = "fail|"; + } + } else { + buf = "pass|"; + upParams.pkgLocation = upParams.pkgLocation == 0 ? upParams.pkgLocation : (upParams.pkgLocation - 1); + } + + for (unsigned int i = 0; i < upParams.pkgLocation; i++) { + time = DurationToString(upParams.installTime, i); + writeBuffer += upParams.updateBin.size() < i + 1 ? "" : upParams.updateBin[i]; + writeBuffer += "|pass||install_time=" + time + "|\n"; + } + time = DurationToString(upParams.installTime, upParams.pkgLocation); + + writeBuffer += upParams.updateBin.size() < upParams.pkgLocation + 1 ? "" : + upParams.updateBin[upParams.pkgLocation]; + writeBuffer += "|" + buf + "|install_time=" + time + "|\n"; + for (unsigned int i = upParams.pkgLocation + 1; i < upParams.updateBin.size(); i++) { + writeBuffer += upParams.updateBin[i] + "\n"; + } + if (writeBuffer != "") { + writeBuffer.pop_back(); + } + LOG(INFO) << "post over, writeBuffer = " << writeBuffer; + WriteDumpResult(writeBuffer, UPDATER_RESULT_FILE); + DeleteInstallTimeFile(); +} + static void PostUpdatePackages(UpdaterParams &upParams, bool updateResult) { std::string writeBuffer; @@ -614,6 +987,14 @@ static void PostSdcardUpdatePackages(UpdaterParams &upParams, bool updateResult) } } +UpdaterStatus UpdaterFromBinfile(UpdaterParams &upParams) +{ + UPDATER_INIT_RECORD; + LOG(INFO) << "enter UPdaterFromBinfile"; + upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); }; + return UPDATE_SUCCESS; +} + UpdaterStatus UpdaterFromSdcard(UpdaterParams &upParams) { UPDATER_INIT_RECORD; @@ -641,6 +1022,18 @@ UpdaterStatus UpdaterFromSdcard(UpdaterParams &upParams) return status; } +UpdaterStatus InstallUpdaterBinfiles(UpdaterParams &upParams) +{ + UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_UPDATE_PACKAGE_EVENT); + UpdaterStatus status = PreUpdatePackages(upParams); + if (status == UPDATE_SUCCESS) { + status = DoUpdateBinfiles(upParams); + } + PostUpdateBinfiles(upParams, status == UPDATE_SUCCESS); + UpdaterInit::GetInstance().InvokeEvent(UPDATER_POST_UPDATE_PACKAGE_EVENT); + return status; +} + UpdaterStatus InstallUpdaterPackages(UpdaterParams &upParams) { UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_UPDATE_PACKAGE_EVENT); @@ -661,12 +1054,10 @@ UpdaterStatus StartUpdaterEntry(UpdaterParams &upParams) LOG(ERROR) << "PreStartUpdaterEntry failed"; return status; } - status = DoUpdaterEntry(upParams); if (status != UPDATE_SUCCESS) { LOG(WARNING) << "DoUpdaterEntry failed"; } - status = PostStartUpdaterEntry(upParams, status); if (status != UPDATE_SUCCESS) { LOG(ERROR) << "PostStartUpdaterEntry failed"; @@ -677,7 +1068,11 @@ UpdaterStatus StartUpdaterEntry(UpdaterParams &upParams) UpdaterStatus DoUpdaterEntry(UpdaterParams &upParams) { UpdaterStatus status = UPDATE_UNKNOWN; - if (upParams.updateMode == SDCARD_UPDATE) { + if (upParams.updateBin.size() > 0) { + LOG(INFO) << "start bin update"; + UPDATER_UI_INSTANCE.ShowProgressPage(); + status = InstallUpdaterBinfiles(upParams); + } else if (upParams.updateMode == SDCARD_UPDATE) { LOG(INFO) << "start sdcard update"; UPDATER_UI_INSTANCE.ShowProgressPage(); status = UpdaterFromSdcard(upParams); @@ -726,6 +1121,12 @@ std::unordered_map> InitOptionsFuncTab(char* PackageUpdateMode &mode, UpdaterParams &upParams) { std::unordered_map> optionsFuncTab { + {"update_bin", [&]() -> void + { + upParams.updateBin.push_back(optarg); + (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_OTA); + mode = HOTA_UPDATE; + }}, {"update_package", [&]() -> void { upParams.updatePackage.push_back(optarg); diff --git a/utils/utils.cpp b/utils/utils.cpp index 854e135c..96341e91 100644 --- a/utils/utils.cpp +++ b/utils/utils.cpp @@ -109,6 +109,7 @@ void SaveLogs() std::string stageLogPath = std::string(UPDATER_STAGE_LOG); // save logs + STAGE(UPDATE_STAGE_SUCCESS) << "PostUpdaterLog"; bool ret = CopyUpdaterLogs(TMP_LOG, updaterLogPath); if (!ret) { LOG(ERROR) << "Copy updater log failed!"; @@ -587,6 +588,8 @@ bool CopyUpdaterLogs(const std::string &sLog, const std::string &dLog) } while (Utils::GetFileSize(sLog) + GetDirSizeForFile(dLog) > MAX_LOG_DIR_SIZE) { + LOG(ERROR) << "Size bigger for" << sLog; + STAGE(UPDATE_STAGE_FAIL) << "sLog and dLog file error, unable to copy"; if (DeleteOldFile(destPath) != true) { break; } diff --git a/utils/write_updater.cpp b/utils/write_updater.cpp index e8c9d9e6..4ca55a98 100644 --- a/utils/write_updater.cpp +++ b/utils/write_updater.cpp @@ -32,6 +32,7 @@ constexpr const char *HANDLE_MISC_LIB_PATH = "/system/lib64/libupdater_handle_mi static void PrintPrompts() { cout << "Please input correct command, examples :" << endl; + cout << "bin : write_updater bin /data/updater/update.bin" < Date: Mon, 24 Mar 2025 17:00:38 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- interfaces/kits/slot_info/slot_info.cpp | 6 +- services/include/package/pkg_manager.h | 3 - .../package/pkg_manager/pkg_managerImpl.cpp | 66 ------- .../package/pkg_manager/pkg_manager_impl.h | 1 - .../package/pkg_verify/pkcs7_signed_data.cpp | 2 +- services/stream_update/bin_chunk_update.h | 2 +- services/updater.cpp | 29 +--- services/updater_binary/BUILD.gn | 4 +- .../update_processor_stream.cpp | 53 +++--- .../updater_binary/update_processor_stream.h | 1 - services/updater_main.cpp | 164 ++++++++---------- 11 files changed, 109 insertions(+), 222 deletions(-) diff --git a/interfaces/kits/slot_info/slot_info.cpp b/interfaces/kits/slot_info/slot_info.cpp index 0d622352..e6f2787d 100644 --- a/interfaces/kits/slot_info/slot_info.cpp +++ b/interfaces/kits/slot_info/slot_info.cpp @@ -36,7 +36,7 @@ void SetActiveSlot() #else void GetPartitionSuffix(std::string &suffix) { - OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); @@ -56,7 +56,7 @@ void GetPartitionSuffix(std::string &suffix) void GetActivePartitionSuffix(std::string &suffix) { - OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); @@ -75,7 +75,7 @@ void GetActivePartitionSuffix(std::string &suffix) void SetActiveSlot() { - OHOS::HDI::Partitionslot::V1_1::PartitionSlotManager psMgr; + OHOS::HDI::Partitionslot::V1_0::PartitionSlotManager psMgr; int32_t curSlot = -1; int32_t numOfSlots = 0; int32_t ret = psMgr.GetCurrentSlot(curSlot, numOfSlots); diff --git a/services/include/package/pkg_manager.h b/services/include/package/pkg_manager.h index 7fbc7d5a..f4219215 100644 --- a/services/include/package/pkg_manager.h +++ b/services/include/package/pkg_manager.h @@ -152,7 +152,6 @@ public: virtual void ClearPkgStream() = 0; virtual int32_t ReadImgHashDataFile(const std::string &pkgType) = 0; - }; class PkgEntry { @@ -279,8 +278,6 @@ public: virtual int32_t LoadPackage(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) = 0; - virtual int32_t ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) = 0; - virtual int32_t VerifyAccPackage(const std::string &packagePath, const std::string &keyPath) = 0; virtual int32_t VerifyOtaPackage(const std::string &devPath, uint64_t offset, size_t size) = 0; diff --git a/services/package/pkg_manager/pkg_managerImpl.cpp b/services/package/pkg_manager/pkg_managerImpl.cpp index ad7b1ccb..29aa9649 100644 --- a/services/package/pkg_manager/pkg_managerImpl.cpp +++ b/services/package/pkg_manager/pkg_managerImpl.cpp @@ -276,69 +276,9 @@ int32_t PkgManagerImpl::ParsePackage(StreamPtr stream, std::vector return PKG_SUCCESS; } -int32_t PkgManagerImpl::ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) -{ - LOG(INFO) << "enter LoadPackage -1"; - UPDATER_INIT_RECORD; - if (access(packagePath.c_str(), 0) != 0) { - UPDATER_LAST_WORD(PKG_INVALID_FILE, "access pkgpath failed"); - return PKG_INVALID_FILE; - } - if (SetSignVerifyKeyName(keyPath) != PKG_SUCCESS) { - UPDATER_LAST_WORD(PKG_INVALID_FILE, "SetSignVerifyKeyName failed"); - return PKG_INVALID_FILE; - } - // Check if package already loaded - for (auto iter : pkgFiles_) { - if (iter != nullptr && iter->GetPkgStream()->GetFileName().compare(packagePath) == 0) { - return PKG_SUCCESS; - } - } - PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); - LOG(INFO) << "pkgType" << pkgType; - unzipToFile_ = ((pkgType == PkgFile::PKG_TYPE_GZIP) ? true : unzipToFile_); - if (pkgType == PkgFile::PKG_TYPE_UPGRADE) { - if (LoadPackage(packagePath, fileIds, pkgType) != PKG_SUCCESS) { - ClearPkgFile(); - UPDATER_LAST_WORD("LoadPackage failed", packagePath); - PKG_LOGE("Parse %s fail ", packagePath.c_str()); - return PKG_INVALID_FILE; - } - } else if (pkgType != PkgFile::PKG_TYPE_NONE) { - std::vector innerFileNames; - // 加载update_full.zip - int32_t ret = LoadPackage(packagePath, innerFileNames, pkgType); - if (ret != PKG_SUCCESS) { - ClearPkgFile(); - PKG_LOGE("Unzip %s fail ", packagePath.c_str()); - return ret; - } - for (auto name : innerFileNames) { - pkgType = GetPkgTypeByName(name); - if (pkgType == PkgFile::PKG_TYPE_NONE || (pkgType == PkgFile::PKG_TYPE_UPGRADE - && std::find(innerFileNames.begin(), innerFileNames.end(), "board_list") != innerFileNames.end())) { - fileIds.push_back(name); - continue; - } - LOG(INFO) << "name = " << name; - LOG(INFO) << "packagePath = " << packagePath; - LOG(INFO) << "pkgType = " << pkgType; - // LOG(INFO) << "filedIds = " << fileIds; - ret = ExtraAndLoadPackage(GetFilePath(packagePath), name, pkgType, fileIds); - if (ret != PKG_SUCCESS) { - ClearPkgFile(); - UPDATER_LAST_WORD(ret, "ExtraAndLoadPackage failed"); - PKG_LOGE("unpack %s fail in package %s ", name.c_str(), packagePath.c_str()); - return ret; - } - } - } - return PKG_SUCCESS; -} int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) { - LOG(INFO) << "enter LoadPackage -1"; UPDATER_INIT_RECORD; if (access(packagePath.c_str(), 0) != 0) { UPDATER_LAST_WORD(PKG_INVALID_FILE, "access pkgpath failed"); @@ -355,7 +295,6 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s } } PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); - LOG(INFO) << "pkgType" << pkgType; unzipToFile_ = ((pkgType == PkgFile::PKG_TYPE_GZIP) ? true : unzipToFile_); if (pkgType == PkgFile::PKG_TYPE_UPGRADE) { if (LoadPackage(packagePath, fileIds, pkgType) != PKG_SUCCESS) { @@ -366,7 +305,6 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s } } else if (pkgType != PkgFile::PKG_TYPE_NONE) { std::vector innerFileNames; - // 加载update_full.zip int32_t ret = LoadPackage(packagePath, innerFileNames, pkgType); if (ret != PKG_SUCCESS) { ClearPkgFile(); @@ -380,10 +318,6 @@ int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, const std::s fileIds.push_back(name); continue; } - LOG(INFO) << "name = " << name; - LOG(INFO) << "packagePath = " << packagePath; - LOG(INFO) << "pkgType = " << pkgType; - // LOG(INFO) << "filedIds = " << fileIds; ret = ExtraAndLoadPackage(GetFilePath(packagePath), name, pkgType, fileIds); if (ret != PKG_SUCCESS) { ClearPkgFile(); diff --git a/services/package/pkg_manager/pkg_manager_impl.h b/services/package/pkg_manager/pkg_manager_impl.h index cdbf848a..0be739db 100644 --- a/services/package/pkg_manager/pkg_manager_impl.h +++ b/services/package/pkg_manager/pkg_manager_impl.h @@ -102,7 +102,6 @@ public: int32_t LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) override; - int32_t ParaseUpdateStreamzip(const std::string &packagePath, const std::string &keyPath, std::vector &fileIds) override; private: PkgFilePtr CreatePackage(PkgStreamPtr stream, PkgFile::PkgType type, PkgInfoPtr header = nullptr); diff --git a/services/package/pkg_verify/pkcs7_signed_data.cpp b/services/package/pkg_verify/pkcs7_signed_data.cpp index b4b0abbe..fb38f77d 100644 --- a/services/package/pkg_verify/pkcs7_signed_data.cpp +++ b/services/package/pkg_verify/pkcs7_signed_data.cpp @@ -89,7 +89,7 @@ int32_t Pkcs7SignedData::ParsePkcs7Data(const uint8_t *srcData, const size_t dat } int32_t Pkcs7SignedData::Verify() const -{ +{ std::vector digestForEVP; for (unsigned int i = 0; i < signatureInfo.overall.length; i++) { digestForEVP.push_back(static_cast(signatureInfo.overall.buffer[i])); diff --git a/services/stream_update/bin_chunk_update.h b/services/stream_update/bin_chunk_update.h index 8b028e09..306326d6 100755 --- a/services/stream_update/bin_chunk_update.h +++ b/services/stream_update/bin_chunk_update.h @@ -47,7 +47,7 @@ using UpdateResultCode = enum { }; using BinUpdateTip = enum { - BIN_UPDATE_ZIP_TIP = 0x11, + BIN_UPDATE_ZIP_TIP = 0xaa, BIN_UPDATE_HEAD_TIP = 0x01, BIN_UPDATE_DATA_TIP = 0x12, BIN_UPDATE_HASH_TIP = 0x16 diff --git a/services/updater.cpp b/services/updater.cpp index 29ff9cd3..db09670e 100644 --- a/services/updater.cpp +++ b/services/updater.cpp @@ -113,7 +113,7 @@ int GetUpdateStreamzipInfo(PkgManager::PkgManagerPtr pkgManager, const std::stri LOG(ERROR) << "pkgManager is nullptr"; return UPDATE_CORRUPT; } - int32_t ret = pkgManager->ParaseUpdateStreamzip(path, Utils::GetCertName(), components);; + int32_t ret = pkgManager->LoadPackage(path, Utils::GetCertName(), components); if (ret != PKG_SUCCESS) { LOG(INFO) << "LoadPackage fail ret :"<< ret; return ret; @@ -489,33 +489,6 @@ void HandleChildOutput(const std::string &buffer, int32_t bufferLen, bool &retry } } -// void ExcuteSubProcFromBin(const UpdaterParams &upParams, const std::string &fullPath, int pipeWrite) -// { -// LOG(INFO) << "enter ExcuteSubProcFromBin"; -// UPDATER_INIT_RECORD; -// // Set process scheduler to normal if current scheduler is -// // SCHED_FIFO, which may cause bad performance. -// int policy = syscall(SYS_sched_getscheduler, getpid()); -// if (policy == -1) { -// LOG(INFO) << "Cannnot get current process scheduler"; -// } else if (policy == SCHED_FIFO) { -// LOG(DEBUG) << "Current process with scheduler SCHED_FIFO"; -// struct sched_param sp = { -// .sched_priority = 0, -// }; -// if (syscall(SYS_sched_setscheduler, getpid(), SCHED_OTHER, &sp) < 0) { -// LOG(WARNING) << "Cannot set current process schedule with SCHED_OTHER"; -// } -// } -// const std::string retryPara = upParams.retryCount > 0 ? "retry=1" : "retry=0"; -// execl(fullPath.c_str(), fullPath.c_str(), upParams.updateBin[upParams.pkgLocation].c_str(), -// std::to_string(pipeWrite).c_str(), retryPara.c_str(), nullptr); -// LOG(ERROR) << "Execute updater binary failed"; -// UPDATER_LAST_WORD(UPDATE_ERROR, "Execute updater binary failed"); -// exit(-1); -// } - - void ExcuteSubProc(const UpdaterParams &upParams, const std::string &fullPath, int pipeWrite) { LOG(INFO) << "enter ExcuteSubProc"; diff --git a/services/updater_binary/BUILD.gn b/services/updater_binary/BUILD.gn index a22162a0..3f79682c 100644 --- a/services/updater_binary/BUILD.gn +++ b/services/updater_binary/BUILD.gn @@ -46,11 +46,11 @@ updater_gen("updater_binary") { ohos_static_library("libupdater_binary") { sources = [ "${updater_path}/services/updater_binary/main.cpp", - "${updater_path}/services/updater_binary/update_processor_stream.cpp", "${updater_path}/services/updater_binary/update_image_block.cpp", "${updater_path}/services/updater_binary/update_image_patch.cpp", "${updater_path}/services/updater_binary/update_partitions.cpp", "${updater_path}/services/updater_binary/update_processor.cpp", + "${updater_path}/services/updater_binary/update_processor_stream.cpp", ] configs = [ ":updater_config" ] @@ -62,11 +62,11 @@ ohos_static_library("libupdater_binary") { "${updater_path}/services/applypatch:libapplypatch", "${updater_path}/services/diffpatch/patch:libpatch", "${updater_path}/services/flow_update/update_bin:libBinFlowUpdate", - "${updater_path}/services/stream_update:libbinchunkupdate", "${updater_path}/services/fs_manager:libfsmanager", "${updater_path}/services/log:libupdaterlog", "${updater_path}/services/package:libupdaterpackage", "${updater_path}/services/script:libupdaterscript", + "${updater_path}/services/stream_update:libbinchunkupdate", "${updater_path}/utils:libutils", ] diff --git a/services/updater_binary/update_processor_stream.cpp b/services/updater_binary/update_processor_stream.cpp index a9388da5..10ee6fe9 100755 --- a/services/updater_binary/update_processor_stream.cpp +++ b/services/updater_binary/update_processor_stream.cpp @@ -45,6 +45,11 @@ using namespace Updater; namespace Updater { constexpr uint32_t BUFFER_SIZE = 50 * 1024; constexpr uint32_t MAX_UPDATER_BUFFER_SIZE = 2 * BUFFER_SIZE; +constexpr uint32_t BYTE_SHIFT_8 = 8; +constexpr uint32_t BYTE_SHIFT_16 = 16; +constexpr uint32_t BYTE_SHIFT_24 = 24; +constexpr uint32_t SECOND_BUFFER = 2; +constexpr uint32_t THIRD_BUFFER = 3; enum UpdateStatus { UPDATE_STATE_INIT = 0, @@ -54,42 +59,46 @@ enum UpdateStatus { UPDATE_STATE_MAX }; - -bool ReadLE16(std::istream& is, uint16_t& value) { +bool ReadLE16(std::istream& is, uint16_t& value) +{ char buf[2]; - if (!is.read(buf, sizeof(buf))) return false; + if (!is.read(buf, sizeof(buf))) { + return false; + } value = static_cast(static_cast(buf[0])) | - (static_cast(static_cast(buf[1])) << 8); + (static_cast(static_cast(buf[1])) << BYTE_SHIFT_8); return true; } -bool ReadLE32(std::istream& is, uint32_t& value) { +bool ReadLE32(std::istream& is, uint32_t& value) +{ char buf[4]; - if (!is.read(buf, sizeof(buf))) return false; + if (!is.read(buf, sizeof(buf))) { + return false; + } value = static_cast(static_cast(buf[0])) | - (static_cast(static_cast(buf[1])) << 8) | - (static_cast(static_cast(buf[2])) << 16) | - (static_cast(static_cast(buf[3])) << 24); + (static_cast(static_cast(buf[1])) << BYTE_SHIFT_8) | + (static_cast(static_cast(buf[SECOND_BUFFER])) << BYTE_SHIFT_16) | + (static_cast(static_cast(buf[THIRD_BUFFER])) << BYTE_SHIFT_24); return true; } - static int ProcessUpdateFile(const std::string &packagePath, FILE* pipeWrite) { std::shared_ptr binChunkUpdate_ {}; - LOG(INFO) << "enter Doinstallbinfile"; // 打开输入文件 std::ifstream in_file(packagePath, std::ios::binary); if (!in_file) { LOG(ERROR) << "Error: Failed to open " << packagePath; return UPDATE_ERROR; } + uint16_t type = 0; if (!ReadLE16(in_file, type)) { LOG(ERROR) << "Failed to read type"; return UPDATE_ERROR; } - LOG(INFO) << "header.type = 0x" << std::hex << type;; - if (type != 0x11) { + + if (type != 0xaa) { LOG(ERROR) << "Unsupported header type: 0x" << std::hex << type; in_file.close(); return UPDATE_ERROR; @@ -99,28 +108,23 @@ static int ProcessUpdateFile(const std::string &packagePath, FILE* pipeWrite) LOG(ERROR) << "Failed to read length"; return UPDATE_ERROR; } - LOG(INFO) << "header.length = " << length; if (!in_file.seekg(length, std::ios::cur)) { in_file.close(); LOG(ERROR) << "Failed to seekg length"; return UPDATE_ERROR; } - - LOG(INFO) << "read file zip successful!"; // 读取剩余数据 - std::vector buffer_stream(BUFFER_SIZE); + std::vector buffer_stream(BUFFER_SIZE); binChunkUpdate_ = std::make_unique(MAX_UPDATER_BUFFER_SIZE); while (!in_file.eof()) { in_file.read(reinterpret_cast(buffer_stream.data()), buffer_stream.size()); - size_t read_bytes = in_file.gcount(); + size_t readBytes = in_file.gcount(); uint32_t dealLen = 0; - LOG(INFO) << "Read " << read_bytes << " bytes from new update.bin"; - if (read_bytes > 0) { - LOG(INFO) << "do libbinchunkupdate"; - UpdateResultCode ret = binChunkUpdate_->StartBinChunkUpdate(buffer_stream.data(), static_cast(read_bytes), dealLen); - LOG(INFO) << "StartBinChunkUpdate ret = " << ret; + if (readBytes > 0) { + UpdateResultCode ret = binChunkUpdate_->StartBinChunkUpdate( + buffer_stream.data(), static_cast(readBytes), dealLen); if (STREAM_UPDATE_SUCCESS == ret) { LOG(INFO) << "StreamInstallProcesser ThreadExecuteFunc STREM_UPDATE_SUCCESS"; } else if (STREAM_UPDATE_FAILURE == ret) { @@ -136,7 +140,8 @@ static int ProcessUpdateFile(const std::string &packagePath, FILE* pipeWrite) return UPDATE_SUCCESS; } -int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath) { +int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath) +{ UPDATER_INIT_RECORD; UpdaterInit::GetInstance().InvokeEvent(UPDATER_BINARY_INIT_EVENT); Dump::GetInstance().RegisterDump("DumpHelperLog", std::make_unique()); diff --git a/services/updater_binary/update_processor_stream.h b/services/updater_binary/update_processor_stream.h index e9407346..5eed42c1 100755 --- a/services/updater_binary/update_processor_stream.h +++ b/services/updater_binary/update_processor_stream.h @@ -32,6 +32,5 @@ using Uscript::UScriptInstructionPtr; namespace Updater { int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath); - } // Updater #endif /* UPDATE_PROCESSOR_H */ diff --git a/services/updater_main.cpp b/services/updater_main.cpp index b5d900ec..d899b011 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -51,7 +51,7 @@ #include "factory_reset/factory_reset.h" #include "write_state/write_state.h" -#define TYPE_ZIP_HEADER 0x11 +#define TYPE_ZIP_HEADER 0xaa namespace Updater { using Utils::String2Int; @@ -86,22 +86,32 @@ constexpr struct option OPTIONS[] = { }; constexpr float VERIFY_PERCENT = 0.05; constexpr double FULL_PERCENT = 100.00; - -bool ReadLE16(std::istream& is, uint16_t& value) { +constexpr uint32_t BYTE_SHIFT_8 = 8; +constexpr uint32_t BYTE_SHIFT_16 = 16; +constexpr uint32_t BYTE_SHIFT_24 = 24; +constexpr uint32_t SECOND_BUFFER = 2; +constexpr uint32_t THIRD_BUFFER = 3; +bool ReadLE16(std::istream& is, uint16_t& value) +{ char buf[2]; - if (!is.read(buf, sizeof(buf))) return false; + if (!is.read(buf, sizeof(buf))) { + return false; + } value = static_cast(static_cast(buf[0])) | - (static_cast(static_cast(buf[1])) << 8); + (static_cast(static_cast(buf[1])) << BYTE_SHIFT_8); return true; } -bool ReadLE32(std::istream& is, uint32_t& value) { +bool ReadLE32(std::istream& is, uint32_t& value) +{ char buf[4]; - if (!is.read(buf, sizeof(buf))) return false; + if (!is.read(buf, sizeof(buf))) { + return false; + } value = static_cast(static_cast(buf[0])) | - (static_cast(static_cast(buf[1])) << 8) | - (static_cast(static_cast(buf[2])) << 16) | - (static_cast(static_cast(buf[3])) << 24); + (static_cast(static_cast(buf[1])) << BYTE_SHIFT_8) | + (static_cast(static_cast(buf[SECOND_BUFFER])) << BYTE_SHIFT_16) | + (static_cast(static_cast(buf[THIRD_BUFFER])) << BYTE_SHIFT_24); return true; } @@ -134,7 +144,7 @@ static UpdaterStatus ReadUpdateStreamzip(const std::string &packagePath) return UPDATE_ERROR; } if (type != TYPE_ZIP_HEADER) { - LOG(ERROR) << "Invalid type, expected 0x11 but got " << type; + LOG(ERROR) << "Invalid type, expected 0xaa but got " << type; return UPDATE_ERROR; } @@ -159,7 +169,9 @@ static UpdaterStatus ReadUpdateStreamzip(const std::string &packagePath) LOG(INFO) << "Successfully restored build_tools.zip to " << outputPathStr; return UPDATE_SUCCESS; } -const char* getFileType(const char* path, struct stat* st) { + +const char* GetFileType(const char* path, struct stat* st) +{ if (lstat(path, st) != 0) { return "Unknown"; } @@ -175,7 +187,8 @@ const char* getFileType(const char* path, struct stat* st) { default: return "Unknown"; } } -static UpdaterStatus GetReadUpdateStreamzipFromBinfile(PkgManager::PkgManagerPtr pkgManager, const std::string &packagePath) +static UpdaterStatus GetReadUpdateStreamzipFromBinfile(PkgManager::PkgManagerPtr pkgManager, + const std::string &packagePath) { UPDATER_INIT_RECORD; if (pkgManager == nullptr) { @@ -183,18 +196,7 @@ static UpdaterStatus GetReadUpdateStreamzipFromBinfile(PkgManager::PkgManagerPtr UPDATER_LAST_WORD(PKG_INVALID_FILE, "pkgManager is nullptr"); return UPDATE_CORRUPT; } - char realPath[PATH_MAX + 1] = {0}; - if (realpath(packagePath.c_str(), realPath) == nullptr) { - LOG(ERROR) << "realpath error"; - UPDATER_LAST_WORD(PKG_INVALID_FILE, "realpath error"); - return UPDATE_CORRUPT; - } - if (access(realPath, F_OK) != 0) { - LOG(ERROR) << "binfile does not exist!"; - UPDATER_LAST_WORD(PKG_INVALID_FILE, "package does not exist!"); - return UPDATE_CORRUPT; - } - // 获取Build_tools_zip内容 + // 获取zip内容 int32_t status = ReadUpdateStreamzip(packagePath); if (status != UPDATE_SUCCESS) { LOG(ERROR) << "ReadUpdateStreamzip failed"; @@ -520,61 +522,30 @@ UpdaterStatus InstallUpdaterPackage(UpdaterParams &upParams, PkgManager::PkgMana return status; } -static UpdaterStatus CalcProgressFromBin(const UpdaterParams &upParams, +static UpdaterStatus CalcProgress(const UpdaterParams &upParams, std::vector &pkgStartPosition, double &updateStartPosition) { UPDATER_INIT_RECORD; int64_t allPkgSize = 0; std::vector everyPkgSize; - if (upParams.pkgLocation == upParams.updateBin.size()) { - updateStartPosition = VERIFY_PERCENT; - return UPDATE_SUCCESS; + std::vector updateFile {}; + if (upParams.pkgLocation == upParams.updateBin.size() || + upParams.pkgLocation == upParams.updatePackage.size()) { + updateStartPosition = VERIFY_PERCENT; + return UPDATE_SUCCESS; } - for (const auto &path : upParams.updateBin) { - char realPath[PATH_MAX + 1] = {0}; - if (realpath(path.c_str(), realPath) == nullptr) { - LOG(WARNING) << "Can not find updatePackage : " << path; - everyPkgSize.push_back(0); - continue; + if (upParams.updateBin.size() > 0) { + for (const auto& file : upParams.updateBin) { + updateFile.push_back(file); } - struct stat st {}; - if (stat(realPath, &st) == 0) { - everyPkgSize.push_back(st.st_size); - allPkgSize += st.st_size; - LOG(INFO) << "pkg " << path << " size is:" << st.st_size; + } else if (upParams.updatePackage.size() > 0) { + for (const auto& file : upParams.updatePackage) { + updateFile.push_back(file); } } - pkgStartPosition.push_back(VERIFY_PERCENT); - if (allPkgSize == 0) { - LOG(ERROR) << "All packages's size is 0."; - UPDATER_LAST_WORD(UPDATE_ERROR, "All packages's size is 0."); - return UPDATE_ERROR; - } - int64_t startSize = 0; - for (auto size : everyPkgSize) { - startSize += size; - float percent = static_cast(startSize) / static_cast(allPkgSize) + VERIFY_PERCENT; - percent = (percent > 1.0) ? 1.0 : percent; // 1.0 : 100% - LOG(INFO) << "percent is:" << percent; - pkgStartPosition.push_back(percent); - } - updateStartPosition = pkgStartPosition[upParams.pkgLocation]; - return UPDATE_SUCCESS; -} - -static UpdaterStatus CalcProgress(const UpdaterParams &upParams, - std::vector &pkgStartPosition, double &updateStartPosition) -{ - UPDATER_INIT_RECORD; - int64_t allPkgSize = 0; - std::vector everyPkgSize; - if (upParams.pkgLocation == upParams.updatePackage.size()) { - updateStartPosition = VERIFY_PERCENT; - return UPDATE_SUCCESS; - } - for (const auto &path : upParams.updatePackage) { - char realPath[PATH_MAX + 1] = {0}; + for (const auto &path : updateFile) { + char realPath[PATH_MAX] = {0}; if (realpath(path.c_str(), realPath) == nullptr) { LOG(WARNING) << "Can not find updatePackage : " << path; everyPkgSize.push_back(0); @@ -632,6 +603,31 @@ static UpdaterStatus CheckVerifyPackages(UpdaterParams &upParams) } return status; } +static UpdaterStatus VerifyCommonFiles(UpdaterParams &upParams) +{ + if (upParams.updateBin.size() > 0) { + if (upParams.pkgLocation == upParams.updateBin.size()) { + LOG(WARNING) << "all package has been upgraded, skip pre process"; + return UPDATE_SUCCESS; + } + // 从bin文件中提取zip文件 + if (VerifyBinfiles(upParams) != UPDATE_SUCCESS) { + LOG(ERROR) << "VerifyBinfiles failed"; + return UPDATE_CORRUPT; // verify binfiles failed must return UPDATE_CORRUPT, ux need it !!! + } + } else if (upParams.updatePackage.size() > 0) { + if (upParams.pkgLocation == upParams.updatePackage.size()) { + LOG(WARNING) << "all package has been upgraded, skip pre process"; + return UPDATE_SUCCESS; + } + // verify package first + if (VerifyPackages(upParams) != UPDATE_SUCCESS) { + LOG(ERROR) << "VerifyPackages failed"; + return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!! + } + } + return UPDATE_SUCCESS; +} static UpdaterStatus PreUpdatePackages(UpdaterParams &upParams) { @@ -656,24 +652,8 @@ static UpdaterStatus PreUpdatePackages(UpdaterParams &upParams) (void)DeleteFile(resultPath); LOG(INFO) << "delete last upgrade file"; } - if (upParams.updateBin.size() > 0) { - if (upParams.pkgLocation == upParams.updateBin.size()) { - LOG(WARNING) << "all package has been upgraded, skip pre process"; - return UPDATE_SUCCESS; - } - // 从bin文件中提取zip文件 - if (VerifyBinfiles(upParams) != UPDATE_SUCCESS) { - return UPDATE_CORRUPT; // verify binfiles failed must return UPDATE_CORRUPT, ux need it !!! - } - } else if (upParams.updatePackage.size() > 0) { - if (upParams.pkgLocation == upParams.updatePackage.size()) { - LOG(WARNING) << "all package has been upgraded, skip pre process"; - return UPDATE_SUCCESS; - } - // verify package first - if (VerifyPackages(upParams) != UPDATE_SUCCESS) { - return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!! - } + if (VerifyCommonFiles(upParams) == UPDATE_CORRUPT) { + return UPDATE_CORRUPT; } // Only handle UPATE_ERROR and UPDATE_SUCCESS here.Let package verify handle others. @@ -740,9 +720,9 @@ static UpdaterStatus DoInstallBinfiles(UpdaterParams &upParams, std::vector(upParams.initialProgress * FULL_PERCENT_PROGRESS + - upParams.currentPercentage * GetTmpProgressValue()), - static_cast(pkgStartPosition[upParams.pkgLocation + 1] * FULL_PERCENT_PROGRESS)); + static_cast(upParams.initialProgress * FULL_PERCENT_PROGRESS + + upParams.currentPercentage * GetTmpProgressValue()), + static_cast(pkgStartPosition[upParams.pkgLocation + 1] * FULL_PERCENT_PROGRESS)); SetMessageToMisc(upParams.miscCmd, upParams.pkgLocation + 1, "upgraded_pkg_num"); PkgManager::ReleasePackageInstance(manager); return status; @@ -798,7 +778,7 @@ UpdaterStatus DoUpdateBinfiles(UpdaterParams &upParams) UpdaterStatus status = UPDATE_UNKNOWN; std::vector pkgStartPosition {}; double updateStartPosition = 0.0; - status = CalcProgressFromBin(upParams, pkgStartPosition, updateStartPosition); + status = CalcProgress(upParams, pkgStartPosition, updateStartPosition); if (status != UPDATE_SUCCESS) { UPDATER_LAST_WORD(status, "CalcProgress failed"); return status; -- Gitee From 97ada273406ebcc3476b05796d5e4b10f1926b2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Tue, 25 Mar 2025 10:24:20 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=88=A0=E6=8E=89=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- interfaces/kits/packages/package.cpp | 2 -- services/include/updater/updater.h | 3 --- .../package/pkg_manager/pkg_managerImpl.cpp | 11 ---------- .../package/pkg_manager/pkg_manager_impl.h | 1 - .../package/pkg_verify/hash_data_verifier.cpp | 5 ----- .../package/pkg_verify/pkg_verify_util.cpp | 1 - services/stream_update/bin_chunk_update.cpp | 7 ++++--- services/updater.cpp | 21 +------------------ services/updater_binary/main.cpp | 1 - services/updater_binary/update_processor.cpp | 1 - .../update_processor_stream.cpp | 5 +++-- services/updater_main.cpp | 12 +++-------- 12 files changed, 11 insertions(+), 59 deletions(-) diff --git a/interfaces/kits/packages/package.cpp b/interfaces/kits/packages/package.cpp index cd1d173b..c61dd543 100755 --- a/interfaces/kits/packages/package.cpp +++ b/interfaces/kits/packages/package.cpp @@ -236,7 +236,6 @@ int32_t VerifyPackageWithCallback(const std::string &packagePath, int32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *keyPath, const char *dir, const char *outPath) { - LOG(INFO) << "enter ExtraPackageDir:" << outPath; if (packagePath == nullptr || outPath == nullptr) { LOG(ERROR) << "Check param fail "; return PKG_INVALID_PARAM; @@ -260,7 +259,6 @@ int32_t ExtraPackageDir(const char *packagePath, [[maybe_unused]] const char *ke continue; } PkgManager::StreamPtr outStream = nullptr; - LOG(INFO) << "components" << components[i]; manager->CreatePkgStream(outStream, std::string(outPath) + components[i], 0, PkgStream::PkgStreamType_Write); if (outStream == nullptr) { LOG(ERROR) << "CreatePkgStream fail"; diff --git a/services/include/updater/updater.h b/services/include/updater/updater.h index 596efcec..5c2a0358 100644 --- a/services/include/updater/updater.h +++ b/services/include/updater/updater.h @@ -96,9 +96,6 @@ UpdaterStatus DoInstallUpdaterBinfile(Hpackage::PkgManager::PkgManagerPtr pkgMan UpdaterStatus StartUpdaterProc(Hpackage::PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams); - -UpdaterStatus StartUpdaterProcFromBin(Hpackage::PkgManager::PkgManagerPtr pkgManager, - UpdaterParams &upParams); int GetUpdatePackageInfo(Hpackage::PkgManager::PkgManagerPtr pkgManager, const std::string& path); diff --git a/services/package/pkg_manager/pkg_managerImpl.cpp b/services/package/pkg_manager/pkg_managerImpl.cpp index 29aa9649..6886dfe4 100644 --- a/services/package/pkg_manager/pkg_managerImpl.cpp +++ b/services/package/pkg_manager/pkg_managerImpl.cpp @@ -239,7 +239,6 @@ PkgFilePtr PkgManagerImpl::CreatePackage(PkgStreamPtr stream, PkgFile::PkgType t int32_t PkgManagerImpl::LoadPackageWithoutUnPack(const std::string &packagePath, std::vector &fileIds) { - LOG(INFO) << "enter LoadPackageWithoutUnPack"; PkgFile::PkgType pkgType = GetPkgTypeByName(packagePath); int32_t ret = LoadPackage(packagePath, fileIds, pkgType); if (ret != PKG_SUCCESS) { @@ -344,7 +343,6 @@ const std::string PkgManagerImpl::GetExtraPath(const std::string &path) int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std::string &name, PkgFile::PkgType type, std::vector &fileIds) { - LOG(INFO) << "enter ExtraAndLoadPackage"; int32_t ret = PKG_SUCCESS; const FileInfo *info = GetFileInfo(name); if (info == nullptr) { @@ -360,15 +358,10 @@ int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std:: (void)mkdir(tempPath.c_str(), 0775); // 0775 : rwxrwxr-x #endif } - LOG(INFO) << "tempPath:" << tempPath; // Extract package to file or memory if (unzipToFile_ || type == PkgFile::PKG_TYPE_UPGRADE) { - LOG(INFO) << "PkgStreamType_Write"; - LOG(INFO) << "info->unpackedSize" << info->unpackedSize; ret = CreatePkgStream(stream, tempPath + name + ".tmp", info->unpackedSize, PkgStream::PkgStreamType_Write); } else { - LOG(INFO) << "PkgStreamType_MemoryMap"; - LOG(INFO) << "info->unpackedSize" << info->unpackedSize; ret = CreatePkgStream(stream, tempPath + name + ".tmp", info->unpackedSize, PkgStream::PkgStreamType_MemoryMap); } if (ret != PKG_SUCCESS) { @@ -388,7 +381,6 @@ int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std:: int32_t PkgManagerImpl::LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) { - LOG(INFO) << "enter LoadPackage -2"; UPDATER_INIT_RECORD; PkgStreamPtr stream = nullptr; int32_t ret = CreatePkgStream(stream, packagePath, 0, PkgStream::PKgStreamType_FileMap); @@ -455,7 +447,6 @@ int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, co int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type, PkgStreamPtr stream) { - LOG(INFO) << "enter LoadPackageWithStream"; UPDATER_INIT_RECORD; int32_t ret = PKG_SUCCESS; PkgFilePtr pkgFile = CreatePackage(stream, type, nullptr); @@ -482,7 +473,6 @@ int32_t PkgManagerImpl::LoadPackageWithStream(const std::string &packagePath, int32_t PkgManagerImpl::ExtractFile(const std::string &path, PkgManager::StreamPtr output) { - LOG(INFO) << "enter ExtractFile"; UPDATER_INIT_RECORD; if (output == nullptr) { PKG_LOGE("Invalid stream"); @@ -524,7 +514,6 @@ const PkgInfo *PkgManagerImpl::GetPackageInfo(const std::string &packagePath) const FileInfo *PkgManagerImpl::GetFileInfo(const std::string &path) { - LOG(INFO) << "enter GetFileInfo"; PkgEntryPtr pkgEntry = GetPkgEntry(path); if (pkgEntry != nullptr) { return pkgEntry->GetFileInfo(); diff --git a/services/package/pkg_manager/pkg_manager_impl.h b/services/package/pkg_manager/pkg_manager_impl.h index 0be739db..ba6a6604 100644 --- a/services/package/pkg_manager/pkg_manager_impl.h +++ b/services/package/pkg_manager/pkg_manager_impl.h @@ -101,7 +101,6 @@ public: int32_t LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) override; - private: PkgFilePtr CreatePackage(PkgStreamPtr stream, PkgFile::PkgType type, PkgInfoPtr header = nullptr); diff --git a/services/package/pkg_verify/hash_data_verifier.cpp b/services/package/pkg_verify/hash_data_verifier.cpp index 931bf0e1..2b4c2afc 100644 --- a/services/package/pkg_verify/hash_data_verifier.cpp +++ b/services/package/pkg_verify/hash_data_verifier.cpp @@ -37,7 +37,6 @@ HashDataVerifier::~HashDataVerifier() bool HashDataVerifier::LoadHashDataAndPkcs7(const std::string &pkgPath) { - LOG(INFO) << "enter LoadHashDataAndPkcs7"; Updater::UPDATER_INIT_RECORD; if (pkgPath == UPDATRE_SCRIPT_ZIP) { isNeedVerify_ = false; @@ -79,7 +78,6 @@ bool HashDataVerifier::LoadHashDataFromPackage(const std::string &buffer) bool HashDataVerifier::LoadHashDataFromPackage(void) { - LOG(INFO) << "enter LoadHashDataFromPackage"; Updater::UPDATER_INIT_RECORD; PkgManager::StreamPtr outStream = nullptr; auto info = manager_->GetFileInfo(UPDATER_HASH_SIGNED_DATA); @@ -115,7 +113,6 @@ bool HashDataVerifier::LoadHashDataFromPackage(void) bool HashDataVerifier::LoadPkcs7FromPackage(const std::string &pkgPath) { - LOG(INFO) << "enter LoadPkcs7FromPackage"; Updater::UPDATER_INIT_RECORD; PkgManager::StreamPtr pkgStream = nullptr; LOG(INFO) << "pkgPath:" << pkgPath; @@ -137,14 +134,12 @@ bool HashDataVerifier::LoadPkcs7FromPackage(const std::string &pkgPath) UPDATER_LAST_WORD(ret, "GetSignature failed"); return false; } - LOG(INFO) << "signature.data()" << signature.data() << "signature.size()" << signature.size(); return pkcs7_ != nullptr && pkcs7_->ParsePkcs7Data(signature.data(), signature.size()) == 0; } bool HashDataVerifier::VerifyHashData(const std::string &preName, const std::string &fileName, PkgManager::StreamPtr stream) const { - LOG(INFO) << "enter VerifyHashData"; if (!isNeedVerify_) { return true; } diff --git a/services/package/pkg_verify/pkg_verify_util.cpp b/services/package/pkg_verify/pkg_verify_util.cpp index 3993c06d..904c6f85 100644 --- a/services/package/pkg_verify/pkg_verify_util.cpp +++ b/services/package/pkg_verify/pkg_verify_util.cpp @@ -139,7 +139,6 @@ int32_t PkgVerifyUtil::VerifyPackageSign(const PkgStreamPtr pkgStream, const std int32_t PkgVerifyUtil::GetSignature(const PkgStreamPtr pkgStream, size_t &signatureSize, std::vector &signature, uint16_t &commentTotalLenAll) const { - PKG_LOGI("enter GetSignature"); Updater::UPDATER_INIT_RECORD; size_t signatureStart = 0; int32_t ret = ParsePackage(pkgStream, signatureStart, signatureSize, commentTotalLenAll); diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 7a15ec72..5a7736e9 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -93,6 +93,7 @@ UpdateResultCode BinChunkUpdate::StartBinChunkUpdate(const uint8_t *data, uint32 return STREAM_UPDATE_FAILURE; } } + dealLen = len + leftLen - curlen_; LOG(DEBUG) << "BinChunkUpdate StartBinChunkUpdate dealLen:" << dealLen << " len:" << len << " curlen_:" << curlen_ << " leftLen:" << leftLen; @@ -252,7 +253,7 @@ bool BinChunkUpdate::ProcessPartitionNum(uint8_t *data, uint32_t &len, uint32_t } updateInfo_.patitionNum = ReadLE16(data + offset); - LOG(DEBUG) << "BinChunkUpdate::UpdateBinHash patitionNum:" << updateInfo_.patitionNum; + LOG(INFO) << "BinChunkUpdate::UpdateBinHash patitionNum:" << updateInfo_.patitionNum; updateInfo_.algorithm->Update({data + offset, tlv.length}, tlv.length); offset += tlv.length; @@ -404,7 +405,7 @@ bool BinChunkUpdate::VerifySignature(std::vector &signData) return false; } - LOG(DEBUG) << "BinChunkUpdate VerifyDigest success"; + LOG(INFO) << "BinChunkUpdate VerifyDigest success"; return true; } @@ -705,7 +706,7 @@ bool BinChunkUpdate::ExecuteCmdLine() return false; } - LOG(DEBUG) << "cf->Execute SUCCESS"; + LOG(INFO) << "cf->Execute SUCCESS"; return true; } diff --git a/services/updater.cpp b/services/updater.cpp index db09670e..a4f9c494 100644 --- a/services/updater.cpp +++ b/services/updater.cpp @@ -66,7 +66,6 @@ int g_tmpValue; int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &packagePath, const std::string &updaterBinary) { - LOG(INFO) << "enter ExtractUpdaterBinary"; UPDATER_INIT_RECORD; PkgManager::StreamPtr outStream = nullptr; int32_t ret = manager->CreatePkgStream(outStream, GetWorkPath() + updaterBinary, @@ -90,22 +89,10 @@ int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &pac UPDATER_LAST_WORD(UPDATE_CORRUPT, "verify updater_binary failed"); return UPDATE_CORRUPT; } - manager->ClosePkgStream(outStream); return UPDATE_SUCCESS; } -const std::string GetExtraPath(const std::string &path) -{ - if (path.find(Updater::SDCARD_CARD_PATH) != std::string::npos) { - return path; - } else if (path == UPDATRE_SCRIPT_ZIP) { - return "/tmp/"; - } - - return std::string(Updater::UPDATER_PATH) + "/"; -} - int GetUpdateStreamzipInfo(PkgManager::PkgManagerPtr pkgManager, const std::string &path) { std::vector components; @@ -324,7 +311,6 @@ UpdaterStatus DoInstallUpdaterBinfile(PkgManager::PkgManagerPtr pkgManager, Upda if (upParams.retryCount > 0) { LOG(INFO) << "Retry for " << upParams.retryCount << " time(s)"; } - LOG(INFO) << "upParams.updateBin[upParams.pkgLocation]:" << upParams.updateBin[upParams.pkgLocation]; // 获取zip信息 int ret = GetUpdateStreamzipInfo(pkgManager, STREAM_ZIP_PATH); @@ -491,7 +477,6 @@ void HandleChildOutput(const std::string &buffer, int32_t bufferLen, bool &retry void ExcuteSubProc(const UpdaterParams &upParams, const std::string &fullPath, int pipeWrite) { - LOG(INFO) << "enter ExcuteSubProc"; UPDATER_INIT_RECORD; // Set process scheduler to normal if current scheduler is // SCHED_FIFO, which may cause bad performance. @@ -575,11 +560,9 @@ UpdaterStatus CheckProcStatus(pid_t pid, bool retryUpdate) static std::string GetBinaryPathFromBin(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams) { - LOG(INFO) << "enter GetBinaryPathFromBin"; std::string fullPath = GetWorkPath() + std::string(UPDATER_BINARY); (void)Utils::DeleteFile(fullPath); std::string toolPath = "/data/updater/update_stream.zip"; - LOG(INFO) << "GetBinaryPath:" << toolPath; if (ExtractUpdaterBinary(pkgManager, toolPath, UPDATER_BINARY) != 0) { LOG(INFO) << "There is no valid updater_binary in package, use updater_binary in device"; fullPath = "/bin/updater_binary"; @@ -593,10 +576,8 @@ static std::string GetBinaryPathFromBin(PkgManager::PkgManagerPtr pkgManager, Up static std::string GetBinaryPath(PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams) { - LOG(INFO) << "enter GetBinaryPath"; std::string fullPath = GetWorkPath() + std::string(UPDATER_BINARY); (void)Utils::DeleteFile(fullPath); - LOG(INFO) << "GetBinaryPath:" << upParams.updatePackage[upParams.pkgLocation]; if (ExtractUpdaterBinary(pkgManager, upParams.updatePackage[upParams.pkgLocation], UPDATER_BINARY) != 0) { LOG(INFO) << "There is no valid updater_binary in package, use updater_binary in device"; fullPath = "/bin/updater_binary"; @@ -631,7 +612,6 @@ UpdaterStatus StartUpdaterProc(PkgManager::PkgManagerPtr pkgManager, UpdaterPara } else if (upParams.updatePackage.size() > 0) { fullPath = GetBinaryPath(pkgManager, upParams); } - LOG(INFO) << "fullPath" << fullPath; if (chmod(fullPath.c_str(), S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) { LOG(ERROR) << "Failed to change mode"; } @@ -639,6 +619,7 @@ UpdaterStatus StartUpdaterProc(PkgManager::PkgManagerPtr pkgManager, UpdaterPara #ifdef WITH_SELINUX Restorecon(fullPath.c_str()); #endif // WITH_SELINUX + pid_t pid = fork(); if (pid < 0) { ERROR_CODE(CODE_FORK_FAIL); diff --git a/services/updater_binary/main.cpp b/services/updater_binary/main.cpp index 6ce4225e..1e922ee8 100644 --- a/services/updater_binary/main.cpp +++ b/services/updater_binary/main.cpp @@ -28,7 +28,6 @@ using namespace Updater; #ifndef UPDATER_UT int main(int argc, char **argv) { - LOG(INFO) << "enter updaterbinary"; InitLogger("UPDATER_BINARY"); if (argc < MINIMAL_ARGC_LIMIT || argc > MAXIMAL_ARGC_LIMIT) { LOG(ERROR) << "Invalid arguments:" << argc; diff --git a/services/updater_binary/update_processor.cpp b/services/updater_binary/update_processor.cpp index a2a07566..3241e550 100644 --- a/services/updater_binary/update_processor.cpp +++ b/services/updater_binary/update_processor.cpp @@ -471,7 +471,6 @@ int UScriptInstructionRawImageWrite::GetWritePathAndOffset(const std::string &pa int ProcessUpdater(bool retry, int pipeFd, const std::string &packagePath, const std::string &keyPath) { - LOG(INFO) << "enter ProcessUpdater"; UPDATER_INIT_RECORD; UpdaterInit::GetInstance().InvokeEvent(UPDATER_BINARY_INIT_EVENT); Dump::GetInstance().RegisterDump("DumpHelperLog", std::make_unique()); diff --git a/services/updater_binary/update_processor_stream.cpp b/services/updater_binary/update_processor_stream.cpp index 10ee6fe9..233b85cf 100755 --- a/services/updater_binary/update_processor_stream.cpp +++ b/services/updater_binary/update_processor_stream.cpp @@ -38,6 +38,8 @@ #include "scope_guard.h" #include "bin_chunk_update.h" +#define TYPE_ZIP_HEADER 0xaa + using namespace Uscript; using namespace Hpackage; using namespace Updater; @@ -98,7 +100,7 @@ static int ProcessUpdateFile(const std::string &packagePath, FILE* pipeWrite) return UPDATE_ERROR; } - if (type != 0xaa) { + if (type != TYPE_ZIP_HEADER) { LOG(ERROR) << "Unsupported header type: 0x" << std::hex << type; in_file.close(); return UPDATE_ERROR; @@ -194,7 +196,6 @@ int ProcessUpdaterStream(bool retry, int pipeFd, const std::string &packagePath, #endif // 调用核心函数并传递管道 - LOG(INFO) << "enter ProcessUpdater"; ret = ProcessUpdateFile(packagePath, pipeWrite.get()); if (ret != UPDATE_SUCCESS) { LOG(ERROR) << "ProcessUpdaterStream failed with code: " << ret; diff --git a/services/updater_main.cpp b/services/updater_main.cpp index d899b011..967786c7 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -187,6 +187,7 @@ const char* GetFileType(const char* path, struct stat* st) default: return "Unknown"; } } + static UpdaterStatus GetReadUpdateStreamzipFromBinfile(PkgManager::PkgManagerPtr pkgManager, const std::string &packagePath) { @@ -471,7 +472,7 @@ UpdaterStatus InstallUpdaterBinfile(UpdaterParams &upParams, PkgManager::PkgMana { UPDATER_INIT_RECORD; UpdaterStatus status = UPDATE_UNKNOWN; - STAGE(UPDATE_STAGE_BEGIN) << "enter InstallUpdaterBinfile"; + STAGE(UPDATE_STAGE_BEGIN) << "Install Binfile"; status = DoInstallUpdaterBinfile(manager, upParams, HOTA_UPDATE); if (status != UPDATE_SUCCESS) { UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION); @@ -603,6 +604,7 @@ static UpdaterStatus CheckVerifyPackages(UpdaterParams &upParams) } return status; } + static UpdaterStatus VerifyCommonFiles(UpdaterParams &upParams) { if (upParams.updateBin.size() > 0) { @@ -967,14 +969,6 @@ static void PostSdcardUpdatePackages(UpdaterParams &upParams, bool updateResult) } } -UpdaterStatus UpdaterFromBinfile(UpdaterParams &upParams) -{ - UPDATER_INIT_RECORD; - LOG(INFO) << "enter UPdaterFromBinfile"; - upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); }; - return UPDATE_SUCCESS; -} - UpdaterStatus UpdaterFromSdcard(UpdaterParams &upParams) { UPDATER_INIT_RECORD; -- Gitee From 37e56c33ad12628f1e2a6f86692ca1c279c86320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Wed, 26 Mar 2025 11:10:45 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- services/include/updater/updater.h | 2 +- .../package/pkg_manager/pkg_managerImpl.cpp | 1 + .../package/pkg_manager/pkg_manager_impl.h | 1 + .../package/pkg_verify/hash_data_verifier.cpp | 1 - services/updater.cpp | 22 +---------- services/updater_binary/main.cpp | 3 ++ services/updater_main.cpp | 37 +++++++++++++------ 7 files changed, 34 insertions(+), 33 deletions(-) diff --git a/services/include/updater/updater.h b/services/include/updater/updater.h index 5c2a0358..0851fb0d 100644 --- a/services/include/updater/updater.h +++ b/services/include/updater/updater.h @@ -96,7 +96,7 @@ UpdaterStatus DoInstallUpdaterBinfile(Hpackage::PkgManager::PkgManagerPtr pkgMan UpdaterStatus StartUpdaterProc(Hpackage::PkgManager::PkgManagerPtr pkgManager, UpdaterParams &upParams); - + int GetUpdatePackageInfo(Hpackage::PkgManager::PkgManagerPtr pkgManager, const std::string& path); int ExecUpdate(Hpackage::PkgManager::PkgManagerPtr pkgManager, int retry, const std::string &pkgPath, diff --git a/services/package/pkg_manager/pkg_managerImpl.cpp b/services/package/pkg_manager/pkg_managerImpl.cpp index 6886dfe4..702c288f 100644 --- a/services/package/pkg_manager/pkg_managerImpl.cpp +++ b/services/package/pkg_manager/pkg_managerImpl.cpp @@ -358,6 +358,7 @@ int32_t PkgManagerImpl::ExtraAndLoadPackage(const std::string &path, const std:: (void)mkdir(tempPath.c_str(), 0775); // 0775 : rwxrwxr-x #endif } + // Extract package to file or memory if (unzipToFile_ || type == PkgFile::PKG_TYPE_UPGRADE) { ret = CreatePkgStream(stream, tempPath + name + ".tmp", info->unpackedSize, PkgStream::PkgStreamType_Write); diff --git a/services/package/pkg_manager/pkg_manager_impl.h b/services/package/pkg_manager/pkg_manager_impl.h index ba6a6604..0be739db 100644 --- a/services/package/pkg_manager/pkg_manager_impl.h +++ b/services/package/pkg_manager/pkg_manager_impl.h @@ -101,6 +101,7 @@ public: int32_t LoadPackage(const std::string &packagePath, std::vector &fileIds, PkgFile::PkgType type) override; + private: PkgFilePtr CreatePackage(PkgStreamPtr stream, PkgFile::PkgType type, PkgInfoPtr header = nullptr); diff --git a/services/package/pkg_verify/hash_data_verifier.cpp b/services/package/pkg_verify/hash_data_verifier.cpp index 2b4c2afc..1fa79361 100644 --- a/services/package/pkg_verify/hash_data_verifier.cpp +++ b/services/package/pkg_verify/hash_data_verifier.cpp @@ -115,7 +115,6 @@ bool HashDataVerifier::LoadPkcs7FromPackage(const std::string &pkgPath) { Updater::UPDATER_INIT_RECORD; PkgManager::StreamPtr pkgStream = nullptr; - LOG(INFO) << "pkgPath:" << pkgPath; int32_t ret = manager_->CreatePkgStream(pkgStream, pkgPath, 0, PkgStream::PkgStreamType_Read); if (ret != PKG_SUCCESS) { PKG_LOGE("CreatePackage fail %s", pkgPath.c_str()); diff --git a/services/updater.cpp b/services/updater.cpp index a4f9c494..a5b2429e 100644 --- a/services/updater.cpp +++ b/services/updater.cpp @@ -36,7 +36,6 @@ #include "package/packages_info.h" #include "parameter.h" #include "misc_info/misc_info.h" -#include #ifdef WITH_SELINUX #include #include "selinux/selinux.h" @@ -52,8 +51,7 @@ #include "updater_ui_stub.h" #include "utils.h" #include "write_state/write_state.h" -#include -namespace fs = std::filesystem; + namespace Updater { using Updater::Utils::SplitString; using Updater::Utils::Trim; @@ -82,7 +80,6 @@ int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &pac return UPDATE_CORRUPT; } HashDataVerifier verifier {manager}; - LOG(INFO) << "ExtractUpdaterBinary Path:" << packagePath; if (!verifier.LoadHashDataAndPkcs7(packagePath) || !verifier.VerifyHashData("build_tools/", updaterBinary, outStream)) { LOG(ERROR) << "verify updater_binary failed"; @@ -93,21 +90,6 @@ int32_t ExtractUpdaterBinary(PkgManager::PkgManagerPtr manager, std::string &pac return UPDATE_SUCCESS; } -int GetUpdateStreamzipInfo(PkgManager::PkgManagerPtr pkgManager, const std::string &path) -{ - std::vector components; - if (pkgManager == nullptr) { - LOG(ERROR) << "pkgManager is nullptr"; - return UPDATE_CORRUPT; - } - int32_t ret = pkgManager->LoadPackage(path, Utils::GetCertName(), components); - if (ret != PKG_SUCCESS) { - LOG(INFO) << "LoadPackage fail ret :"<< ret; - return ret; - } - return PKG_SUCCESS; -} - int GetUpdatePackageInfo(PkgManager::PkgManagerPtr pkgManager, const std::string &path) { std::vector components; @@ -313,7 +295,7 @@ UpdaterStatus DoInstallUpdaterBinfile(PkgManager::PkgManagerPtr pkgManager, Upda } // 获取zip信息 - int ret = GetUpdateStreamzipInfo(pkgManager, STREAM_ZIP_PATH); + int ret = GetUpdatePackageInfo(pkgManager, STREAM_ZIP_PATH); if (ret != 0) { LOG(ERROR) << "get update package info fail"; UPDATER_LAST_WORD(UPDATE_CORRUPT, "GetUpdatePackageInfo failed"); diff --git a/services/updater_binary/main.cpp b/services/updater_binary/main.cpp index 1e922ee8..01188349 100644 --- a/services/updater_binary/main.cpp +++ b/services/updater_binary/main.cpp @@ -61,6 +61,9 @@ int main(int argc, char **argv) return ProcessUpdater(retry, pipeFd, packagePath, Utils::GetCertName()); } else if (fileExtension == "bin") { return ProcessUpdaterStream(retry, pipeFd, packagePath, Utils::GetCertName()); + } else { + LOG(ERROR) << "Invalid packagePath:" << packagePath; + return EXIT_INVALID_ARGS; } } #endif diff --git a/services/updater_main.cpp b/services/updater_main.cpp index 967786c7..3e68326c 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -51,7 +51,7 @@ #include "factory_reset/factory_reset.h" #include "write_state/write_state.h" -#define TYPE_ZIP_HEADER 0xaa +#define TYPE_ZIP_HEADER 0xaa //update.bin文件TYPE namespace Updater { using Utils::String2Int; @@ -523,28 +523,43 @@ UpdaterStatus InstallUpdaterPackage(UpdaterParams &upParams, PkgManager::PkgMana return status; } -static UpdaterStatus CalcProgress(const UpdaterParams &upParams, - std::vector &pkgStartPosition, double &updateStartPosition) +static UpdaterStatus UpdateUpdateFile(const UpdaterParams &upParams, + std::vector &pkgStartPosition, double &updateStartPosition, + std::vector &updateFile) { - UPDATER_INIT_RECORD; - int64_t allPkgSize = 0; - std::vector everyPkgSize; - std::vector updateFile {}; - if (upParams.pkgLocation == upParams.updateBin.size() || - upParams.pkgLocation == upParams.updatePackage.size()) { + updateFile.clear(); + if (upParams.updateBin.size() > 0) { + if (upParams.pkgLocation == upParams.updateBin.size()) { updateStartPosition = VERIFY_PERCENT; return UPDATE_SUCCESS; - } - if (upParams.updateBin.size() > 0) { + } for (const auto& file : upParams.updateBin) { updateFile.push_back(file); } } else if (upParams.updatePackage.size() > 0) { + if (upParams.pkgLocation == upParams.updatePackage.size()) { + updateStartPosition = VERIFY_PERCENT; + return UPDATE_SUCCESS; + } for (const auto& file : upParams.updatePackage) { updateFile.push_back(file); } } + return UPDATE_SKIP; +} + +static UpdaterStatus CalcProgress(const UpdaterParams &upParams, + std::vector &pkgStartPosition, double &updateStartPosition) +{ + UPDATER_INIT_RECORD; + int64_t allPkgSize = 0; + std::vector everyPkgSize; + std::vector updateFile; + UpdaterStatus status = UpdateUpdateFile(upParams, pkgStartPosition, updateStartPosition, updateFile); + if (status == UPDATE_SUCCESS) { + return UPDATE_SUCCESS; + } for (const auto &path : updateFile) { char realPath[PATH_MAX] = {0}; if (realpath(path.c_str(), realPath) == nullptr) { -- Gitee From 3982a384746d433891d6e564a81e910f6e4a1efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Fri, 28 Mar 2025 17:47:22 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- interfaces/kits/slot_info/BUILD.gn | 5 +- services/stream_update/bin_chunk_update.cpp | 4 +- services/updater_binary/main.cpp | 8 ++- .../update_processor_stream.cpp | 4 +- services/updater_main.cpp | 62 +++++-------------- 5 files changed, 31 insertions(+), 52 deletions(-) diff --git a/interfaces/kits/slot_info/BUILD.gn b/interfaces/kits/slot_info/BUILD.gn index f79e5b1d..32781f5b 100644 --- a/interfaces/kits/slot_info/BUILD.gn +++ b/interfaces/kits/slot_info/BUILD.gn @@ -27,8 +27,9 @@ ohos_static_library("libslotinfo") { deps = [ "${updater_path}/services/log:libupdaterlog" ] if (init_feature_ab_partition) { defines = [ "UPDATER_AB_SUPPORT" ] - external_deps = - [ "drivers_peripheral_partitionslot:libpartition_slot_manager" ] + external_deps = [ + "drivers_peripheral_partitionslot:libpartition_slot_manager", + ] } subsystem_name = "updater" diff --git a/services/stream_update/bin_chunk_update.cpp b/services/stream_update/bin_chunk_update.cpp index 5a7736e9..a9140fd9 100755 --- a/services/stream_update/bin_chunk_update.cpp +++ b/services/stream_update/bin_chunk_update.cpp @@ -800,10 +800,10 @@ std::string BinChunkUpdate::ComputeFileHash(const std::string &partitionName, bool BinChunkUpdate::VerifyPartitionHash(const std::string &partitionName, const std::string &expectedHash, const std::map &dataLenInfos) { - LOG(DEBUG) << "BinChunkUpdate::VerifyPartitionHash enter"; + LOG(INFO) << "BinChunkUpdate::VerifyPartitionHash enter"; std::string actualHash = ComputeFileHash(partitionName, dataLenInfos); - LOG(DEBUG) << "actualHash:" << actualHash << " expectedHash:" << expectedHash; + LOG(INFO) << "actualHash:" << actualHash << " expectedHash:" << expectedHash; if (actualHash != expectedHash) { LOG(ERROR) << "Error verifying hash for partition " << partitionName; diff --git a/services/updater_binary/main.cpp b/services/updater_binary/main.cpp index 01188349..133ecac4 100644 --- a/services/updater_binary/main.cpp +++ b/services/updater_binary/main.cpp @@ -55,7 +55,13 @@ int main(int argc, char **argv) LoadFstab(); // 根据 packagePath 的后缀选择执行不同的函数 - std::string fileExtension = packagePath.substr(packagePath.find_last_of(".") + 1); + std::string fileExtension; + size_t dotPosition = packagePath.find_last_of("."); + if (dotPosition == std::string::npos) { + LOG(ERROR) << "Invalid packagePath: No extension found in " << packagePath; + return EXIT_INVALID_ARGS; + } + fileExtension = packagePath.substr(dotPosition + 1); std::transform(fileExtension.begin(), fileExtension.end(), fileExtension.begin(), ::tolower); if (fileExtension == "zip") { return ProcessUpdater(retry, pipeFd, packagePath, Utils::GetCertName()); diff --git a/services/updater_binary/update_processor_stream.cpp b/services/updater_binary/update_processor_stream.cpp index 233b85cf..a6476729 100755 --- a/services/updater_binary/update_processor_stream.cpp +++ b/services/updater_binary/update_processor_stream.cpp @@ -63,7 +63,7 @@ enum UpdateStatus { bool ReadLE16(std::istream& is, uint16_t& value) { - char buf[2]; + char buf[2] = {0}; if (!is.read(buf, sizeof(buf))) { return false; } @@ -74,7 +74,7 @@ bool ReadLE16(std::istream& is, uint16_t& value) bool ReadLE32(std::istream& is, uint32_t& value) { - char buf[4]; + char buf[4] = {0}; if (!is.read(buf, sizeof(buf))) { return false; } diff --git a/services/updater_main.cpp b/services/updater_main.cpp index 3e68326c..efbdbfd6 100644 --- a/services/updater_main.cpp +++ b/services/updater_main.cpp @@ -51,8 +51,6 @@ #include "factory_reset/factory_reset.h" #include "write_state/write_state.h" -#define TYPE_ZIP_HEADER 0xaa //update.bin文件TYPE - namespace Updater { using Utils::String2Int; using namespace Hpackage; @@ -91,9 +89,11 @@ constexpr uint32_t BYTE_SHIFT_16 = 16; constexpr uint32_t BYTE_SHIFT_24 = 24; constexpr uint32_t SECOND_BUFFER = 2; constexpr uint32_t THIRD_BUFFER = 3; +constexpr uint8_t TYPE_ZIP_HEADER = 0xaa; + bool ReadLE16(std::istream& is, uint16_t& value) { - char buf[2]; + char buf[2] = {0}; if (!is.read(buf, sizeof(buf))) { return false; } @@ -104,7 +104,7 @@ bool ReadLE16(std::istream& is, uint16_t& value) bool ReadLE32(std::istream& is, uint32_t& value) { - char buf[4]; + char buf[4] = {0}; if (!is.read(buf, sizeof(buf))) { return false; } @@ -874,7 +874,8 @@ UpdaterStatus DoUpdatePackages(UpdaterParams &upParams) return status; } -static void PostUpdateBinfiles(UpdaterParams &upParams, bool updateResult) +static void PostUpdate(UpdaterParams &upParams, bool updateResult, + const std::vector& updateList, const std::string& type) { std::string writeBuffer; std::string buf; @@ -893,18 +894,17 @@ static void PostUpdateBinfiles(UpdaterParams &upParams, bool updateResult) for (unsigned int i = 0; i < upParams.pkgLocation; i++) { time = DurationToString(upParams.installTime, i); - writeBuffer += upParams.updateBin.size() < i + 1 ? "" : upParams.updateBin[i]; + writeBuffer += (i < updateList.size() ? updateList[i] : ""); writeBuffer += "|pass||install_time=" + time + "|\n"; } time = DurationToString(upParams.installTime, upParams.pkgLocation); - writeBuffer += upParams.updateBin.size() < upParams.pkgLocation + 1 ? "" : - upParams.updateBin[upParams.pkgLocation]; + writeBuffer += (upParams.pkgLocation < updateList.size() ? updateList[upParams.pkgLocation] : ""); writeBuffer += "|" + buf + "|install_time=" + time + "|\n"; - for (unsigned int i = upParams.pkgLocation + 1; i < upParams.updateBin.size(); i++) { - writeBuffer += upParams.updateBin[i] + "\n"; + for (unsigned int i = upParams.pkgLocation + 1; i < updateList.size(); i++) { + writeBuffer += updateList[i] + "\n"; } - if (writeBuffer != "") { + if (!writeBuffer.empty()) { writeBuffer.pop_back(); } LOG(INFO) << "post over, writeBuffer = " << writeBuffer; @@ -912,42 +912,14 @@ static void PostUpdateBinfiles(UpdaterParams &upParams, bool updateResult) DeleteInstallTimeFile(); } -static void PostUpdatePackages(UpdaterParams &upParams, bool updateResult) +static void PostUpdateBinfiles(UpdaterParams &upParams, bool updateResult) { - std::string writeBuffer; - std::string buf; - std::string time; - if (!updateResult) { - const std::string resultPath = std::string(UPDATER_PATH) + "/" + std::string(UPDATER_RESULT_FILE); - std::ifstream fin {resultPath}; - if (!fin.is_open() || !std::getline(fin, buf)) { - LOG(ERROR) << "read result file error " << resultPath; - buf = "fail|"; - } - } else { - buf = "pass|"; - upParams.pkgLocation = upParams.pkgLocation == 0 ? upParams.pkgLocation : (upParams.pkgLocation - 1); - } - - for (unsigned int i = 0; i < upParams.pkgLocation; i++) { - time = DurationToString(upParams.installTime, i); - writeBuffer += upParams.updatePackage.size() < i + 1 ? "" : upParams.updatePackage[i]; - writeBuffer += "|pass||install_time=" + time + "|\n"; - } - time = DurationToString(upParams.installTime, upParams.pkgLocation); + PostUpdate(upParams, updateResult, upParams.updateBin, "Binfiles"); +} - writeBuffer += upParams.updatePackage.size() < upParams.pkgLocation + 1 ? "" : - upParams.updatePackage[upParams.pkgLocation]; - writeBuffer += "|" + buf + "|install_time=" + time + "|\n"; - for (unsigned int i = upParams.pkgLocation + 1; i < upParams.updatePackage.size(); i++) { - writeBuffer += upParams.updatePackage[i] + "\n"; - } - if (writeBuffer != "") { - writeBuffer.pop_back(); - } - LOG(INFO) << "post over, writeBuffer = " << writeBuffer; - WriteDumpResult(writeBuffer, UPDATER_RESULT_FILE); - DeleteInstallTimeFile(); +static void PostUpdatePackages(UpdaterParams &upParams, bool updateResult) +{ + PostUpdate(upParams, updateResult, upParams.updatePackage, "Packages"); } static UpdaterStatus PreSdcardUpdatePackages(UpdaterParams &upParams) -- Gitee From 40647aad9a66de99f91837d113c96935d62590f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=98=E7=BD=97=E5=AE=87?= Date: Fri, 28 Mar 2025 17:52:45 +0800 Subject: [PATCH 6/6] =?UTF-8?q?fix:=E9=9D=99=E6=80=81=E5=BA=93=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 甘罗宇 --- interfaces/kits/slot_info/BUILD.gn | 3 +++ updater_default_cfg.gni | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/interfaces/kits/slot_info/BUILD.gn b/interfaces/kits/slot_info/BUILD.gn index 32781f5b..e513ffb5 100644 --- a/interfaces/kits/slot_info/BUILD.gn +++ b/interfaces/kits/slot_info/BUILD.gn @@ -28,7 +28,10 @@ ohos_static_library("libslotinfo") { if (init_feature_ab_partition) { defines = [ "UPDATER_AB_SUPPORT" ] external_deps = [ + "c_utils:utilsbase", "drivers_peripheral_partitionslot:libpartition_slot_manager", + "hilog:libhilog_base", + "init:libbegetutil_static", ] } diff --git a/updater_default_cfg.gni b/updater_default_cfg.gni index e2036f20..796286a3 100644 --- a/updater_default_cfg.gni +++ b/updater_default_cfg.gni @@ -45,7 +45,7 @@ template("updater_gen") { } else { ohos_executable(target_name) { if (!is_asan && !is_emulator && target_name == "updater_binary") { - static_link = false + static_link = true } forward_variables_from(invoker, "*") -- Gitee