From ed974bb87ab099e5168768b3381dcdf80d83f3c8 Mon Sep 17 00:00:00 2001 From: HashBang Date: Sat, 30 Jan 2016 14:20:09 -0500 Subject: allow flashing sparse images if the image has the right magic bytes to be a sparse image, use simg2img to flash the image create a rule to make a fully dynamic simg2img which results in a much smaller increase in gzip ramdisk size (2KB vs 40KB) Change-Id: I1b0f6bc127da46103888b1154a9bddd8ac02c01d --- Android.mk | 5 ++++- partition.cpp | 24 +++++++++++++++++++++--- prebuilt/Android.mk | 1 + simg2img/Android.mk | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 simg2img/Android.mk diff --git a/Android.mk b/Android.mk index 52c2907de..0a5692c85 100644 --- a/Android.mk +++ b/Android.mk @@ -99,6 +99,7 @@ LOCAL_C_INCLUDES += \ system/vold \ system/extras/ext4_utils \ system/core/adb \ + system/core/libsparse LOCAL_C_INCLUDES += bionic external/openssl/include $(LOCAL_PATH)/libmincrypt/includes ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) @@ -351,7 +352,8 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \ fsck.fat \ fatlabel \ mkfs.fat \ - permissive.sh + permissive.sh \ + simg2img_twrp ifneq ($(TARGET_ARCH), arm64) ifneq ($(TARGET_ARCH), x86_64) @@ -586,6 +588,7 @@ include $(commands_recovery_local_path)/injecttwrp/Android.mk \ $(commands_recovery_local_path)/dosfstools/Android.mk \ $(commands_recovery_local_path)/etc/Android.mk \ $(commands_recovery_local_path)/toybox/Android.mk \ + $(commands_recovery_local_path)/simg2img/Android.mk \ $(commands_recovery_local_path)/libpixelflinger/Android.mk ifeq ($(TW_INCLUDE_CRYPTO), true) diff --git a/partition.cpp b/partition.cpp index d038c38f1..c511298ec 100644 --- a/partition.cpp +++ b/partition.cpp @@ -68,6 +68,7 @@ extern "C" { #include #include #endif +#include using namespace std; @@ -407,12 +408,12 @@ bool TWPartition::Process_Fstab_Line(string Line, bool Display_Error) { } else if (Mount_Point == "/system_image") { Display_Name = "System Image"; Backup_Display_Name = Display_Name; - Can_Flash_Img = false; + Can_Flash_Img = true; Can_Be_Backed_Up = true; } else if (Mount_Point == "/vendor_image") { Display_Name = "Vendor Image"; Backup_Display_Name = Display_Name; - Can_Flash_Img = false; + Can_Flash_Img = true; Can_Be_Backed_Up = true; } } @@ -2375,7 +2376,24 @@ bool TWPartition::Flash_Image_DD(string Filename) { string Command; gui_msg(Msg("flashing=Flashing {1}...")(Display_Name)); - Command = "dd bs=8388608 if='" + Filename + "' of=" + Actual_Block_Device; + + uint32_t magic = 0; + int fd = open(Filename.c_str(), O_RDONLY); + if (fd < 0) { + gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Filename)(strerror(errno))); + return false; + } + if (read(fd, &magic, sizeof(magic)) != sizeof(magic)) { + gui_msg(Msg(msg::kError, "error_opening_strerr=Error opening: '{1}' ({2})")(Filename)(strerror(errno))); + close(fd); + return false; + } + close(fd); + if (magic == SPARSE_HEADER_MAGIC) { + Command = "simg2img '" + Filename + "' " + Actual_Block_Device; + } else { + Command = "dd bs=8388608 if='" + Filename + "' of=" + Actual_Block_Device; + } LOGINFO("Flash command: '%s'\n", Command.c_str()); TWFunc::Exec_Cmd(Command); return true; diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk index dba181003..a5deb9aba 100644 --- a/prebuilt/Android.mk +++ b/prebuilt/Android.mk @@ -36,6 +36,7 @@ RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mke2fs RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/tune2fs RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/resize2fs +RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/simg2img ifneq ($(TARGET_ARCH), x86_64) RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker endif diff --git a/simg2img/Android.mk b/simg2img/Android.mk new file mode 100644 index 000000000..74755e7db --- /dev/null +++ b/simg2img/Android.mk @@ -0,0 +1,14 @@ +LOCAL_PATH := system/core/libsparse + +include $(CLEAR_VARS) +LOCAL_SRC_FILES := simg2img.c \ + sparse_crc32.c +LOCAL_MODULE := simg2img_twrp +LOCAL_MODULE_STEM := simg2img +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin +LOCAL_MODULE_TAGS := optional +LOCAL_SHARED_LIBRARIES := \ + libsparse \ + libz +LOCAL_CFLAGS := -Werror +include $(BUILD_EXECUTABLE) -- cgit v1.2.3