diff options
37 files changed, 222 insertions, 89 deletions
diff --git a/Android.bp b/Android.bp index 52de77038..bd9570500 100644 --- a/Android.bp +++ b/Android.bp @@ -157,6 +157,7 @@ cc_binary { ], shared_libs: [ + "android.hardware.health-V1-ndk", // from librecovery_utils "librecovery_ui", ], diff --git a/Android.mk b/Android.mk index 96af417bf..8506040f7 100644 --- a/Android.mk +++ b/Android.mk @@ -45,8 +45,8 @@ LOCAL_WHOLE_STATIC_LIBRARIES := \ $(TARGET_RECOVERY_UI_LIB) LOCAL_SHARED_LIBRARIES := \ - libbase \ - liblog \ + libbase.recovery \ + liblog.recovery \ librecovery_ui.recovery include $(BUILD_SHARED_LIBRARY) @@ -64,9 +64,15 @@ LOCAL_NOTICE_FILE := $(LOCAL_PATH)/NOTICE ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) LOCAL_REQUIRED_MODULES += \ make_f2fs.recovery \ + fsck.f2fs.recovery \ sload_f2fs.recovery endif +LOCAL_REQUIRED_MODULES += \ + mkfs.erofs.recovery \ + dump.erofs.recovery \ + fsck.erofs.recovery + # On A/B devices recovery-persist reads the recovery related file from the persist storage and # copies them into /data/misc/recovery. Then, for both A/B and non-A/B devices, recovery-persist # parses the last_install file and reports the embedded update metrics. Also, the last_install file @@ -1,5 +1,4 @@ elsk@google.com -enh@google.com nhdo@google.com xunchang@google.com -zhaojiac@google.com +zhangkelvin@google.com diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg index 28aa06f45..023d48b93 100644 --- a/PREUPLOAD.cfg +++ b/PREUPLOAD.cfg @@ -6,5 +6,6 @@ clang_format = true clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc,cpp [Hook Scripts] +aosp_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "." checkstyle_hook = ${REPO_ROOT}/prebuilts/checkstyle/checkstyle.py --sha ${PREUPLOAD_COMMIT} --file_whitelist tools/ updater_sample/ diff --git a/etc/init.rc b/etc/init.rc index 5cacb8bdb..e4afecff6 100644 --- a/etc/init.rc +++ b/etc/init.rc @@ -38,12 +38,24 @@ on init write /proc/sys/kernel/panic_on_oops 1 write /proc/sys/vm/max_map_count 1000000 + # Mount binderfs + mkdir /dev/binderfs + mount binder binder /dev/binderfs stats=global + chmod 0755 /dev/binderfs + + symlink /dev/binderfs/binder /dev/binder + chmod 0666 /dev/binderfs/binder + + # Start essential services + start servicemanager + on boot ifup lo hostname localhost domainname localdomain class_start default + class_start hal on firmware_mounts_complete rm /dev/.booting diff --git a/fuse_sideload/fuse_sideload.cpp b/fuse_sideload/fuse_sideload.cpp index 3d9480309..07cbe96f3 100644 --- a/fuse_sideload/fuse_sideload.cpp +++ b/fuse_sideload/fuse_sideload.cpp @@ -225,7 +225,7 @@ static int handle_release(void* /* data */, fuse_data* /* fd */, const fuse_in_h // Fetch a block from the host into fd->curr_block and fd->block_data. // Returns 0 on successful fetch, negative otherwise. -static int fetch_block(fuse_data* fd, uint32_t block) { +static int fetch_block(fuse_data* fd, uint64_t block) { if (block == fd->curr_block) { return 0; } diff --git a/install/Android.bp b/install/Android.bp index e239ddc4e..c59171451 100644 --- a/install/Android.bp +++ b/install/Android.bp @@ -105,12 +105,9 @@ cc_library_static { srcs: [ "adb_install.cpp", - "asn1_decoder.cpp", "fuse_install.cpp", "install.cpp", - "package.cpp", "snapshot_utils.cpp", - "verifier.cpp", "wipe_data.cpp", "wipe_device.cpp", "spl_check.cpp", diff --git a/install/include/install/install.h b/install/include/install/install.h index bef23e9ca..704841f8e 100644 --- a/install/include/install/install.h +++ b/install/include/install/install.h @@ -24,7 +24,7 @@ #include <ziparchive/zip_archive.h> -#include "package.h" +#include "otautil/package.h" #include "recovery_ui/ui.h" enum InstallResult { diff --git a/install/include/install/wipe_device.h b/install/include/install/wipe_device.h index c60b99997..903ddfdcd 100644 --- a/install/include/install/wipe_device.h +++ b/install/include/install/wipe_device.h @@ -19,7 +19,7 @@ #include <string> #include <vector> -#include "install/package.h" +#include "otautil/package.h" #include "recovery_ui/device.h" // Wipes the current A/B device, with a secure wipe of all the partitions in RECOVERY_WIPE. diff --git a/install/install.cpp b/install/install.cpp index 6e74f80ab..bb8c3b825 100644 --- a/install/install.cpp +++ b/install/install.cpp @@ -46,13 +46,13 @@ #include <android-base/strings.h> #include <android-base/unique_fd.h> -#include "install/package.h" #include "install/spl_check.h" -#include "install/verifier.h" #include "install/wipe_data.h" #include "otautil/error_code.h" +#include "otautil/package.h" #include "otautil/paths.h" #include "otautil/sysutil.h" +#include "otautil/verifier.h" #include "private/setup_commands.h" #include "recovery_ui/ui.h" #include "recovery_utils/roots.h" diff --git a/install/wipe_device.cpp b/install/wipe_device.cpp index 915c87b45..0a525fa9b 100644 --- a/install/wipe_device.cpp +++ b/install/wipe_device.cpp @@ -35,7 +35,7 @@ #include "bootloader_message/bootloader_message.h" #include "install/install.h" -#include "install/package.h" +#include "otautil/package.h" #include "recovery_ui/device.h" #include "recovery_ui/ui.h" diff --git a/minadbd/Android.bp b/minadbd/Android.bp index 2bcfece40..9d3f7334a 100644 --- a/minadbd/Android.bp +++ b/minadbd/Android.bp @@ -97,6 +97,7 @@ cc_binary { ], shared_libs: [ + "android.hardware.health-V1-ndk", // from librecovery_utils "libbase", "libcrypto", ], @@ -128,6 +129,7 @@ cc_test { ], static_libs: [ + "android.hardware.health-V1-ndk", // from librecovery_utils "libminadbd_services", "libfusesideload", "librecovery_utils", diff --git a/minui/Android.bp b/minui/Android.bp index f68f6c81d..02fb3638f 100644 --- a/minui/Android.bp +++ b/minui/Android.bp @@ -24,6 +24,7 @@ package { cc_library { name: "libminui", recovery_available: true, + vendor_available: true, defaults: [ "recovery_defaults", @@ -51,4 +52,15 @@ cc_library { "libpng", "libz", ], + + target: { + vendor: { + exclude_static_libs: [ + "libsync", + ], + shared_libs: [ + "libsync", + ], + }, + }, } diff --git a/minui/graphics.cpp b/minui/graphics.cpp index dce1e619a..f25694ab5 100644 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -42,6 +42,9 @@ static constexpr uint32_t alpha_mask = 0xff000000; static GRSurface* gr_draw = nullptr; static GRRotation rotation = GRRotation::NONE; static PixelFormat pixel_format = PixelFormat::UNKNOWN; +// The graphics backend list that provides fallback options for the default backend selection. +// For example, it will fist try DRM, then try FBDEV if DRM is unavailable. +constexpr auto default_backends = { GraphicsBackend::DRM, GraphicsBackend::FBDEV }; static bool outside(int x, int y) { auto swapped = (rotation == GRRotation::LEFT || rotation == GRRotation::RIGHT); @@ -340,7 +343,22 @@ void gr_flip() { gr_draw = gr_backend->Flip(); } +std::unique_ptr<MinuiBackend> create_backend(GraphicsBackend backend) { + switch (backend) { + case GraphicsBackend::DRM: + return std::make_unique<MinuiBackendDrm>(); + case GraphicsBackend::FBDEV: + return std::make_unique<MinuiBackendFbdev>(); + default: + return nullptr; + } +} + int gr_init() { + return gr_init(default_backends); +} + +int gr_init(std::initializer_list<GraphicsBackend> backends) { // pixel_format needs to be set before loading any resources or initializing backends. std::string format = android::base::GetProperty("ro.minui.pixel_format", ""); if (format == "ABGR_8888") { @@ -361,19 +379,22 @@ int gr_init() { ret); } - auto backend = std::unique_ptr<MinuiBackend>{ std::make_unique<MinuiBackendDrm>() }; - gr_draw = backend->Init(); - - if (!gr_draw) { - backend = std::make_unique<MinuiBackendFbdev>(); - gr_draw = backend->Init(); + std::unique_ptr<MinuiBackend> minui_backend; + for (GraphicsBackend backend : backends) { + minui_backend = create_backend(backend); + if (!minui_backend) { + printf("gr_init: minui_backend %d is a nullptr\n", backend); + continue; + } + gr_draw = minui_backend->Init(); + if (gr_draw) break; } if (!gr_draw) { return -1; } - gr_backend = backend.release(); + gr_backend = minui_backend.release(); int overscan_percent = android::base::GetIntProperty("ro.minui.overscan_percent", 0); overscan_offset_x = gr_draw->width * overscan_percent / 100; diff --git a/minui/graphics_drm.cpp b/minui/graphics_drm.cpp index 95759e382..9d31ff7a9 100644 --- a/minui/graphics_drm.cpp +++ b/minui/graphics_drm.cpp @@ -105,6 +105,8 @@ std::unique_ptr<GRSurfaceDrm> GRSurfaceDrm::Create(int drm_fd, int width, int he perror("Failed to DRM_IOCTL_MODE_CREATE_DUMB"); return nullptr; } + printf("Allocating buffer with resolution %d x %d pitch: %d bpp: %d, size: %llu\n", width, height, + create_dumb.pitch, create_dumb.bpp, create_dumb.size); // Cannot use std::make_unique to access non-public ctor. auto surface = std::unique_ptr<GRSurfaceDrm>(new GRSurfaceDrm( @@ -128,13 +130,14 @@ std::unique_ptr<GRSurfaceDrm> GRSurfaceDrm::Create(int drm_fd, int width, int he return nullptr; } - auto mmapped = mmap(nullptr, surface->height * surface->row_bytes, PROT_READ | PROT_WRITE, - MAP_SHARED, drm_fd, map_dumb.offset); + auto mmapped = + mmap(nullptr, create_dumb.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_fd, map_dumb.offset); if (mmapped == MAP_FAILED) { perror("Failed to mmap()"); return nullptr; } surface->mmapped_buffer_ = static_cast<uint8_t*>(mmapped); + printf("Framebuffer of size %llu allocated @ %p\n", create_dumb.size, surface->mmapped_buffer_); return surface; } @@ -260,9 +263,16 @@ drmModeConnector* MinuiBackendDrm::FindMainMonitor(int fd, drmModeRes* resources /* If we still didn't find a connector, give up and return. */ if (!main_monitor_connector) return nullptr; + for (int modes = 0; modes < main_monitor_connector->count_modes; modes++) { + printf("Display Mode %d resolution: %d x %d @ %d FPS\n", modes, + main_monitor_connector->modes[modes].hdisplay, + main_monitor_connector->modes[modes].vdisplay, + main_monitor_connector->modes[modes].vrefresh); + } *mode_index = 0; for (int modes = 0; modes < main_monitor_connector->count_modes; modes++) { if (main_monitor_connector->modes[modes].type & DRM_MODE_TYPE_PREFERRED) { + printf("Choosing display mode #%d\n", modes); *mode_index = modes; break; } diff --git a/minui/graphics_fbdev.cpp b/minui/graphics_fbdev.cpp index 2584017d6..0d0fabce6 100644 --- a/minui/graphics_fbdev.cpp +++ b/minui/graphics_fbdev.cpp @@ -131,8 +131,6 @@ GRSurface* MinuiBackendFbdev::Init() { SetDisplayedFramebuffer(0); printf("framebuffer: %d (%zu x %zu)\n", fb_fd.get(), gr_draw->width, gr_draw->height); - - Blank(true); Blank(false); return gr_draw; diff --git a/minui/include/minui/minui.h b/minui/include/minui/minui.h index 163e41dc6..5470457e7 100644 --- a/minui/include/minui/minui.h +++ b/minui/include/minui/minui.h @@ -104,10 +104,19 @@ enum class PixelFormat : int { ARGB = 4, }; -// Initializes the graphics backend and loads font file. Returns 0 on success, or -1 on error. Note -// that the font initialization failure would be non-fatal, as caller may not need to draw any text -// at all. Caller can check the font initialization result via gr_sys_font() as needed. +enum class GraphicsBackend : int { + UNKNOWN = 0, + DRM = 1, + FBDEV = 2, +}; + +// Initializes the default graphics backend and loads font file. Returns 0 on success, or -1 on +// error. Note that the font initialization failure would be non-fatal, as caller may not need to +// draw any text at all. Caller can check the font initialization result via gr_sys_font() as +// needed. int gr_init(); +// Supports backend selection for minui client. +int gr_init(std::initializer_list<GraphicsBackend> backends); // Frees the allocated resources. The function is idempotent, and safe to be called if gr_init() // didn't finish successfully. diff --git a/otautil/Android.bp b/otautil/Android.bp index 557b8a313..4b043adf1 100644 --- a/otautil/Android.bp +++ b/otautil/Android.bp @@ -34,16 +34,21 @@ cc_library_static { // Minimal set of files to support host build. srcs: [ + "asn1_decoder.cpp", "dirutil.cpp", + "package.cpp", "paths.cpp", "rangeset.cpp", "sysutil.cpp", + "verifier.cpp", ], shared_libs: [ "libbase", + "libcrypto", "libcutils", "libselinux", + "libziparchive", ], export_include_dirs: [ diff --git a/install/asn1_decoder.cpp b/otautil/asn1_decoder.cpp index 2d81a6e13..2d81a6e13 100644 --- a/install/asn1_decoder.cpp +++ b/otautil/asn1_decoder.cpp diff --git a/install/include/install/package.h b/otautil/include/otautil/package.h index 0b4233238..f4f4d348b 100644 --- a/install/include/install/package.h +++ b/otautil/include/otautil/package.h @@ -26,7 +26,7 @@ #include <ziparchive/zip_archive.h> -#include "verifier.h" +#include "otautil/verifier.h" enum class PackageType { kMemory, diff --git a/install/include/install/verifier.h b/otautil/include/otautil/verifier.h index f9e947580..f9e947580 100644 --- a/install/include/install/verifier.h +++ b/otautil/include/otautil/verifier.h diff --git a/install/include/private/asn1_decoder.h b/otautil/include/private/asn1_decoder.h index e5337d9c4..e5337d9c4 100644 --- a/install/include/private/asn1_decoder.h +++ b/otautil/include/private/asn1_decoder.h diff --git a/install/package.cpp b/otautil/package.cpp index 86fc0647d..242204ee6 100644 --- a/install/package.cpp +++ b/otautil/package.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "install/package.h" +#include "otautil/package.h" #include <string.h> #include <unistd.h> diff --git a/install/verifier.cpp b/otautil/verifier.cpp index 3f0260138..8a65566ec 100644 --- a/install/verifier.cpp +++ b/otautil/verifier.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#include "install/verifier.h" +#include "otautil/verifier.h" #include <errno.h> #include <stdio.h> @@ -257,8 +257,8 @@ int verify_file(VerifierInterface* package, const std::vector<Certificate>& keys // Check to make sure at least one of the keys matches the signature. Since any key can match, // we need to try each before determining a verification failure has happened. - size_t i = 0; - for (const auto& key : keys) { + for (size_t i = 0; i < keys.size(); i++) { + const auto& key = keys[i]; const uint8_t* hash; int hash_nid; switch (key.hash_len) { @@ -296,7 +296,6 @@ int verify_file(VerifierInterface* package, const std::vector<Certificate>& keys } else { LOG(INFO) << "Unknown key type " << key.key_type; } - i++; } if (need_sha1) { diff --git a/recovery.cpp b/recovery.cpp index 36924fbdf..641fe4788 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -48,12 +48,12 @@ #include "install/adb_install.h" #include "install/fuse_install.h" #include "install/install.h" -#include "install/package.h" #include "install/snapshot_utils.h" #include "install/wipe_data.h" #include "install/wipe_device.h" #include "otautil/boot_state.h" #include "otautil/error_code.h" +#include "otautil/package.h" #include "otautil/paths.h" #include "otautil/sysutil.h" #include "recovery_ui/screen_ui.h" diff --git a/recovery_utils/Android.bp b/recovery_utils/Android.bp index e0e9ec058..9bd66c5d9 100644 --- a/recovery_utils/Android.bp +++ b/recovery_utils/Android.bp @@ -31,6 +31,7 @@ cc_defaults { shared_libs: [ "android.hardware.health@2.0", "libbase", + "libbinder_ndk", "libext4_utils", "libfs_mgr", "libhidlbase", @@ -42,8 +43,10 @@ cc_defaults { "libotautil", // External dependencies. + "android.hardware.health-translate-ndk", "libfstab", "libhealthhalutils", + "libhealthshim", ], } @@ -70,6 +73,15 @@ cc_library_static { "libvold_headers", ], + shared_libs: [ + // The following cannot be placed in librecovery_utils_defaults, + // because at the time of writing, android.hardware.health-V1-ndk.so + // is not installed to the system image yet. (It is installed + // to the recovery ramdisk.) Hence, minadbd_test must link to it + // statically. + "android.hardware.health-V1-ndk", + ], + export_include_dirs: [ "include", ], diff --git a/recovery_utils/battery_utils.cpp b/recovery_utils/battery_utils.cpp index 323f52537..6b126bdf3 100644 --- a/recovery_utils/battery_utils.cpp +++ b/recovery_utils/battery_utils.cpp @@ -20,59 +20,74 @@ #include <unistd.h> #include <android-base/logging.h> +#include <android/binder_manager.h> +#include <health-shim/shim.h> #include <healthhalutils/HealthHalUtils.h> BatteryInfo GetBatteryInfo() { - using android::hardware::health::V1_0::BatteryStatus; using android::hardware::health::V2_0::get_health_service; - using android::hardware::health::V2_0::IHealth; - using android::hardware::health::V2_0::Result; - using android::hardware::health::V2_0::toString; + using HidlHealth = android::hardware::health::V2_0::IHealth; + using aidl::android::hardware::health::BatteryStatus; + using aidl::android::hardware::health::HealthShim; + using aidl::android::hardware::health::IHealth; + using aidl::android::hardware::health::toString; + using std::string_literals::operator""s; - android::sp<IHealth> health = get_health_service(); + auto service_name = IHealth::descriptor + "/default"s; + std::shared_ptr<IHealth> health; + if (AServiceManager_isDeclared(service_name.c_str())) { + ndk::SpAIBinder binder(AServiceManager_waitForService(service_name.c_str())); + health = IHealth::fromBinder(binder); + } + if (health == nullptr) { + LOG(INFO) << "Unable to get AIDL health service, trying HIDL..."; + android::sp<HidlHealth> hidl_health = get_health_service(); + if (hidl_health != nullptr) { + health = ndk::SharedRefBase::make<HealthShim>(hidl_health); + } + } + if (health == nullptr) { + LOG(WARNING) << "No health implementation is found; assuming defaults"; + } int wait_second = 0; while (true) { auto charge_status = BatteryStatus::UNKNOWN; - - if (health == nullptr) { - LOG(WARNING) << "No health implementation is found; assuming defaults"; - } else { - health - ->getChargeStatus([&charge_status](auto res, auto out_status) { - if (res == Result::SUCCESS) { - charge_status = out_status; - } - }) - .isOk(); // should not have transport error + if (health != nullptr) { + auto res = health->getChargeStatus(&charge_status); + if (!res.isOk()) { + LOG(WARNING) << "Unable to call getChargeStatus: " << res.getDescription(); + charge_status = BatteryStatus::UNKNOWN; + } } - // Treat unknown status as on charger. See hardware/interfaces/health/1.0/types.hal for the - // meaning of the return values. + // Treat unknown status as on charger. See hardware/interfaces/health/aidl/BatteryStatus.aidl + // for the meaning of the return values. bool charging = (charge_status != BatteryStatus::DISCHARGING && charge_status != BatteryStatus::NOT_CHARGING); - Result res = Result::UNKNOWN; int32_t capacity = INT32_MIN; if (health != nullptr) { - health - ->getCapacity([&res, &capacity](auto out_res, auto out_capacity) { - res = out_res; - capacity = out_capacity; - }) - .isOk(); // should not have transport error + auto res = health->getCapacity(&capacity); + if (!res.isOk()) { + LOG(WARNING) << "Unable to call getCapacity: " << res.getDescription(); + capacity = INT32_MIN; + } } LOG(INFO) << "charge_status " << toString(charge_status) << ", charging " << charging - << ", status " << toString(res) << ", capacity " << capacity; + << ", capacity " << capacity; constexpr int BATTERY_READ_TIMEOUT_IN_SEC = 10; // At startup, the battery drivers in devices like N5X/N6P take some time to load // the battery profile. Before the load finishes, it reports value 50 as a fake // capacity. BATTERY_READ_TIMEOUT_IN_SEC is set that the battery drivers are expected // to finish loading the battery profile earlier than 10 seconds after kernel startup. - if (res == Result::SUCCESS && capacity == 50) { + if (capacity == 50) { if (wait_second < BATTERY_READ_TIMEOUT_IN_SEC) { + LOG(INFO) << "Battery capacity == 50, waiting " + << (BATTERY_READ_TIMEOUT_IN_SEC - wait_second) + << " seconds to ensure this is not a fake value..."; sleep(1); wait_second++; continue; @@ -80,10 +95,12 @@ BatteryInfo GetBatteryInfo() { } // If we can't read battery percentage, it may be a device without battery. In this // situation, use 100 as a fake battery percentage. - if (res != Result::SUCCESS) { + if (capacity == INT32_MIN) { + LOG(WARNING) << "Using fake battery capacity 100."; capacity = 100; } + LOG(INFO) << "GetBatteryInfo() reporting charging " << charging << ", capacity " << capacity; return BatteryInfo{ charging, capacity }; } } diff --git a/recovery_utils/roots.cpp b/recovery_utils/roots.cpp index 19484478c..7fe385b5e 100644 --- a/recovery_utils/roots.cpp +++ b/recovery_utils/roots.cpp @@ -33,7 +33,7 @@ #include <android-base/properties.h> #include <android-base/stringprintf.h> #include <android-base/unique_fd.h> -#include <cryptfs.h> +#include <ext4_utils/ext4_utils.h> #include <ext4_utils/wipe.h> #include <fs_mgr.h> #include <fs_mgr/roots.h> @@ -161,35 +161,41 @@ int format_volume(const std::string& volume, const std::string& directory) { needs_projid = android::base::GetBoolProperty("external_storage.projid.enabled", false); } - // If there's a key_loc that looks like a path, it should be a block device for storing encryption - // metadata. Wipe it too. - if (!v->key_loc.empty() && v->key_loc[0] == '/') { - LOG(INFO) << "Wiping " << v->key_loc; - int fd = open(v->key_loc.c_str(), O_WRONLY | O_CREAT, 0644); - if (fd == -1) { - PLOG(ERROR) << "format_volume: Failed to open " << v->key_loc; - return -1; - } - wipe_block_device(fd, get_file_size(fd)); - close(fd); - } - int64_t length = 0; if (v->length > 0) { length = v->length; - } else if (v->length < 0 || v->key_loc == "footer") { + } else if (v->length < 0) { android::base::unique_fd fd(open(v->blk_device.c_str(), O_RDONLY)); if (fd == -1) { PLOG(ERROR) << "format_volume: failed to open " << v->blk_device; return -1; } - length = get_file_size(fd.get(), v->length ? -v->length : CRYPT_FOOTER_OFFSET); + length = get_file_size(fd.get(), -v->length); if (length <= 0) { LOG(ERROR) << "get_file_size: invalid size " << length << " for " << v->blk_device; return -1; } } + // If the raw disk will be used as a metadata encrypted device mapper target, + // next boot will do encrypt_in_place the raw disk which gives a subtle duration + // to get any failure in the process. In order to avoid it, let's simply wipe + // the raw disk if we don't reserve any space, which behaves exactly same as booting + // after "fastboot -w". + if (!v->metadata_key_dir.empty() && length == 0) { + android::base::unique_fd fd(open(v->blk_device.c_str(), O_RDWR)); + if (fd == -1) { + PLOG(ERROR) << "format_volume: failed to open " << v->blk_device; + return -1; + } + int64_t device_size = get_file_size(fd.get(), 0); + if (device_size > 0 && !wipe_block_device(fd.get(), device_size)) { + LOG(INFO) << "format_volume: wipe metadata encrypted " << v->blk_device << " with size " + << device_size; + return 0; + } + } + if (v->fs_type == "ext4") { static constexpr int kBlockSize = 4096; std::vector<std::string> mke2fs_args = { diff --git a/tests/Android.bp b/tests/Android.bp index 5ef4d58c0..7f00adcd4 100644 --- a/tests/Android.bp +++ b/tests/Android.bp @@ -138,7 +138,14 @@ cc_test { "unit/*.cpp", ], + shared_libs: [ + "libbinder_ndk", + ], + static_libs: libapplypatch_static_libs + librecovery_static_libs + [ + "android.hardware.health-translate-ndk", + "android.hardware.health-V1-ndk", + "libhealthshim", "librecovery_ui", "libfusesideload", "libminui", diff --git a/tests/fuzz/verify_package_fuzzer.cpp b/tests/fuzz/verify_package_fuzzer.cpp index baa44e070..36c853465 100644 --- a/tests/fuzz/verify_package_fuzzer.cpp +++ b/tests/fuzz/verify_package_fuzzer.cpp @@ -17,7 +17,7 @@ #include "fuzzer/FuzzedDataProvider.h" #include "install/install.h" -#include "install/package.h" +#include "otautil/package.h" #include "recovery_ui/stub_ui.h" std::unique_ptr<Package> CreatePackage(std::vector<uint8_t>& content) { diff --git a/tests/unit/package_test.cpp b/tests/unit/package_test.cpp index 164a93d57..66882bb40 100644 --- a/tests/unit/package_test.cpp +++ b/tests/unit/package_test.cpp @@ -26,7 +26,7 @@ #include <ziparchive/zip_writer.h> #include "common/test_constants.h" -#include "install/package.h" +#include "otautil/package.h" class PackageTest : public ::testing::Test { protected: diff --git a/tests/unit/verifier_test.cpp b/tests/unit/verifier_test.cpp index ded23c52f..08a3ddfc4 100644 --- a/tests/unit/verifier_test.cpp +++ b/tests/unit/verifier_test.cpp @@ -35,8 +35,8 @@ #include <ziparchive/zip_writer.h> #include "common/test_constants.h" -#include "install/package.h" -#include "install/verifier.h" +#include "otautil/package.h" +#include "otautil/verifier.h" #include "otautil/sysutil.h" using namespace std::string_literals; diff --git a/tools/recovery_l10n/res/values-kn/strings.xml b/tools/recovery_l10n/res/values-kn/strings.xml index eafd831e7..a98f4692a 100644 --- a/tools/recovery_l10n/res/values-kn/strings.xml +++ b/tools/recovery_l10n/res/values-kn/strings.xml @@ -8,7 +8,7 @@ <string name="recovery_installing_security" msgid="9184031299717114342">"ಭದ್ರತೆಯ ಅಪ್ಡೇಟ್ ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="recovery_wipe_data_menu_header" msgid="550255032058254478">"Android ಸಿಸ್ಟಂ ಅನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ನಿಮ್ಮ ಡೇಟಾ ದೋಷಪೂರಿತವಾಗಿರಬಹುದು. ನೀವು ಈ ಸಂದೇಶ ಪಡೆಯುವುದು ಮುಂದುವರಿದರೆ, ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾ ರಿಸೆಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ ಮತ್ತು ಈ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಡೇಟಾವನ್ನು ಅಳಿಸಬೇಕಾಗುತ್ತದೆ."</string> <string name="recovery_try_again" msgid="7168248750158873496">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ"</string> - <string name="recovery_factory_data_reset" msgid="7321351565602894783">"ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾ ರೀಸೆಟ್"</string> + <string name="recovery_factory_data_reset" msgid="7321351565602894783">"ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾ ರಿಸೆಟ್"</string> <string name="recovery_wipe_data_confirmation" msgid="5439823343348043954">"ಎಲ್ಲಾ ಬಳಕೆದಾರರ ಡೇಟಾವನ್ನು ಅಳಿಸುವುದೇ?\n\n ಇದನ್ನು ರದ್ದುಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ!"</string> <string name="recovery_cancel_wipe_data" msgid="66987687653647384">"ರದ್ದುಮಾಡಿ"</string> </resources> diff --git a/tools/recovery_l10n/res/values-sv/strings.xml b/tools/recovery_l10n/res/values-sv/strings.xml index baf8e1830..cf43b2511 100644 --- a/tools/recovery_l10n/res/values-sv/strings.xml +++ b/tools/recovery_l10n/res/values-sv/strings.xml @@ -2,7 +2,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recovery_installing" msgid="2013591905463558223">"Systemuppdatering installeras"</string> - <string name="recovery_erasing" msgid="7334826894904037088">"Raderar"</string> + <string name="recovery_erasing" msgid="7334826894904037088">"Rensar"</string> <string name="recovery_no_command" msgid="4465476568623024327">"Inget kommando"</string> <string name="recovery_error" msgid="5748178989622716736">"Fel!"</string> <string name="recovery_installing_security" msgid="9184031299717114342">"Säkerhetsuppdatering installeras"</string> diff --git a/tools/recovery_l10n/res/values-te/strings.xml b/tools/recovery_l10n/res/values-te/strings.xml index 32a9c6417..4d521143f 100644 --- a/tools/recovery_l10n/res/values-te/strings.xml +++ b/tools/recovery_l10n/res/values-te/strings.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recovery_installing" msgid="2013591905463558223">"సిస్టమ్ అప్డేట్ను ఇన్స్టాల్ చేస్తోంది"</string> + <string name="recovery_installing" msgid="2013591905463558223">"సిస్టమ్ నవీకరణను ఇన్స్టాల్ చేస్తోంది"</string> <string name="recovery_erasing" msgid="7334826894904037088">"డేటాను తొలగిస్తోంది"</string> <string name="recovery_no_command" msgid="4465476568623024327">"ఆదేశం లేదు"</string> <string name="recovery_error" msgid="5748178989622716736">"ఎర్రర్ సంభవించింది!"</string> - <string name="recovery_installing_security" msgid="9184031299717114342">"భద్రతా అప్డేట్ను ఇన్స్టాల్ చేస్తోంది"</string> - <string name="recovery_wipe_data_menu_header" msgid="550255032058254478">"Android సిస్టమ్ని లోడ్ చేయడం సాధ్యం కాదు. మీ డేటా పాడై ఉండవచ్చు. మీకు ఈ మెసేజ్ వస్తూనే ఉంటే, మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసి, పరికరంలో నిల్వ అయిన వినియోగదారు డేటా మొత్తాన్ని తొలగించాల్సి రావచ్చు."</string> + <string name="recovery_installing_security" msgid="9184031299717114342">"భద్రతా నవీకరణను ఇన్స్టాల్ చేస్తోంది"</string> + <string name="recovery_wipe_data_menu_header" msgid="550255032058254478">"Android సిస్టమ్ని లోడ్ చేయడం సాధ్యం కాదు. మీ డేటా పాడై ఉండవచ్చు. మీకు ఈ సందేశం వస్తూనే ఉంటే, మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసి, పరికరంలో నిల్వ అయిన వినియోగదారు డేటా మొత్తాన్ని తొలగించాల్సి రావచ్చు."</string> <string name="recovery_try_again" msgid="7168248750158873496">"మళ్లీ ప్రయత్నించు"</string> <string name="recovery_factory_data_reset" msgid="7321351565602894783">"ఫ్యాక్టరీ డేటా రీసెట్"</string> <string name="recovery_wipe_data_confirmation" msgid="5439823343348043954">"వినియోగదారు డేటా మొత్తాన్ని తొలగించాలా?\n\n ఈ చర్యను రద్దు చేయలేరు!"</string> diff --git a/update_verifier/Android.bp b/update_verifier/Android.bp index ff2eff903..220b007f5 100644 --- a/update_verifier/Android.bp +++ b/update_verifier/Android.bp @@ -33,6 +33,25 @@ cc_defaults { ], } +python_library_host { + name: "care_map_proto_py", + srcs: [ + "care_map.proto", + ], + proto: {type: "lite", canonical_path_from_root: false}, + version: { + py2: { + enabled: true, + }, + py3: { + enabled: true, + }, + }, + visibility: [ + "//build/make/tools/releasetools:__subpackages__", + ], +} + cc_library_static { name: "libupdate_verifier", diff --git a/update_verifier/care_map_generator.py b/update_verifier/care_map_generator.py index c6f2dad24..b1396a43c 100644 --- a/update_verifier/care_map_generator.py +++ b/update_verifier/care_map_generator.py @@ -111,14 +111,14 @@ def main(argv): logging.basicConfig(level=logging.INFO if args.verbose else logging.WARNING, format=logging_format) - with open(args.input_care_map, 'r') as input_care_map: + with open(args.input_care_map, 'rb') as input_care_map: content = input_care_map.read() if args.parse_proto: result = ParseProtoMessage(content, args.fingerprint_enabled).encode() else: care_map_proto = GenerateCareMapProtoFromLegacyFormat( - content.rstrip().splitlines(), args.fingerprint_enabled) + content.decode().rstrip().splitlines(), args.fingerprint_enabled) result = care_map_proto.SerializeToString() with open(args.output_file, 'wb') as output: |