From d58ba1827226c0cbe1072dd2c9d3b1fa81d6afea Mon Sep 17 00:00:00 2001 From: bigbiff Date: Mon, 23 Mar 2020 10:02:29 -0400 Subject: [PATCH] AOSP10 TWRP Merge: fix conflicts and update libraries needed This allows flame to boot TWRP. Still will need to work on super partition for vendor and system access. The plan will be to cherry-pick any updates to android-9.0 through gerrit.twrp.me to this branch as a WIP. --- .gitignore | 1 + Android.bp | 187 +-- Android.mk | 350 ++--- README.md | 133 -- adbbu/Android.mk | 2 +- applypatch/Android.mk | 2 +- applypatch/applypatch.cpp | 387 ----- attr/Android.mk | 2 +- bmlutils/Android.mk | 4 +- bootloader_message/Android.mk | 29 - bootloader_message/bootloader_message.cpp | 42 +- .../bootloader_message/bootloader_message.h | 15 +- common.h | 34 +- crypto/ext4crypt/Android.mk | 14 +- crypto/ext4crypt/Decrypt.cpp | 12 +- crypto/ext4crypt/Keymaster.cpp | 24 +- crypto/ext4crypt/Keymaster3.cpp | 50 +- crypto/ext4crypt/ext4_crypt.h | 39 + crypto/fde/Android.mk | 2 +- crypto/fde/cryptfs.cpp | 85 +- crypto/vold_decrypt/Android.mk | 6 +- etc/Android.mk | 14 +- etc/init.rc | 43 +- etc/init.recovery.service22.rc | 3 + etc/init28.rc | 225 +++ fb2png/Android.mk | 2 +- flashutils/Android.mk | 8 +- fuse_sideload/fuse_sideload.cpp | 99 +- fuse_sideload/include/fuse_sideload.h | 19 - fuse_sideload28/fuse_sideload.cpp | 525 +++++++ fuse_sideload28/fuse_sideload.h | 55 + gui/Android.mk | 23 +- gui/action.cpp | 15 +- gui/gui.cpp | 2 +- gui/input.cpp | 9 +- gui/keyboard.cpp | 7 +- gui/pages.cpp | 6 +- gui/pages.hpp | 2 +- gui/resources.cpp | 22 +- gui/resources.hpp | 7 +- gui/scrolllist.cpp | 5 +- gui/slidervalue.cpp | 5 +- gui/terminal.cpp | 8 +- gui/text.cpp | 5 +- gui/theme/common/languages/tr.xml | 75 +- htcdumlock/Android.mk | 4 +- injecttwrp/Android.mk | 2 +- {otautil => install}/ZipUtil.cpp | 2 +- {otautil => install}/ZipUtil.h | 0 install/adb_install.cpp | 59 +- install/fuse_sdcard_install.cpp | 2 +- install/include/install/adb_install.h | 2 +- install/include/install/fuse_sdcard_install.h | 10 - install/include/install/install.h | 4 +- install/include/install/package.h | 4 +- install/include/install/wipe_data.h | 2 +- .../include/installcommand.h | 0 .../include/legacy_property_service.h | 0 .../include/set_metadata.h | 0 .../include/tw_atomic.hpp | 0 zipwrap.hpp => install/include/zipwrap.hpp | 4 +- install/install.cpp | 67 +- .../installcommand.cpp | 20 +- .../legacy_property_service.cpp | 0 install/package.cpp | 21 +- set_metadata.cpp => install/set_metadata.cpp | 0 tw_atomic.cpp => install/tw_atomic.cpp | 0 install/wipe_data.cpp | 30 +- zipwrap.cpp => install/zipwrap.cpp | 6 +- adb_install.cpp => install28/adb_install.cpp | 12 +- install28/adb_install.h | 28 + libcrecovery/Android.mk | 4 +- libpixelflinger/Android.mk | 11 +- libtar/Android.mk | 4 +- minadbd/Android.mk | 53 +- minadbd/fuse_adb_provider.h | 0 minadbd/minadbd.cpp | 5 - minadbd/minadbd_services.cpp | 104 -- minadbd21/Android.mk | 2 +- minui/Android.mk | 246 ++-- minui/events.cpp | 52 - minui/graphics.cpp | 178 --- minui/graphics_adf.cpp | 20 - minui/graphics_drm.cpp | 14 - minui/include/minui/minui.h | 18 - minui/resources.cpp | 13 - minuitwrp/Android.mk | 2 +- minuitwrp/graphics.cpp | 15 +- minuitwrp/truetype.cpp | 1239 +++++++---------- minuitwrp/truetype.hpp | 121 ++ minzip/Zip.c | 0 mmcutils/Android.mk | 4 +- mtdutils/Android.mk | 4 +- mtp/ffs/Android.mk | 20 +- mtp/ffs/MtpStorage.h | 2 +- openaes/Android.mk | 6 +- openrecoveryscript.cpp | 19 +- orscmd/Android.mk | 2 +- otafault/Android.mk | 2 +- otautil/Android.bp | 9 +- otautil/Android.mk | 41 - otautil/include/otautil/logging.h | 5 - otautil/include/otautil/roots.h | 2 - partition.cpp | 4 +- partitionmanager.cpp | 5 +- partitions.hpp | 0 pigz/Android.mk | 2 +- prebuilt/Android.mk | 138 +- prebuilt/permissive.sh | 8 - prebuilt/relink | 0 prebuilt/relink.sh | 6 +- prebuilt/relink_init | 0 recovery_ui/include/recovery_ui/device.h | 4 +- rotate_logs.cpp | 107 -- sepolicy/twrp.te | 2 +- simg2img/Android.mk | 4 +- tests/Android.mk | 364 ++--- tests/unit/zip_test.cpp | 5 - toolbox/Android.mk | 6 +- toybox/Android.mk | 8 +- twinstall.cpp | 6 +- twinstall.h | 0 twrp.cpp | 27 +- updater/Android.mk | 34 - updater/blockimg.cpp | 6 - updater/install.cpp | 46 - updater/updater.cpp | 8 - updater_sample/proguard.flags | 14 - verifier28/asn1_decoder.cpp | 158 +++ verifier28/asn1_decoder.h | 55 + verifier28/verifier.cpp | 553 ++++++++ verifier.h => verifier28/verifier.h | 0 132 files changed, 3361 insertions(+), 3309 deletions(-) mode change 100644 => 100755 Android.bp mode change 100644 => 100755 README.md mode change 100644 => 100755 applypatch/applypatch.cpp delete mode 100644 bootloader_message/Android.mk mode change 100644 => 100755 common.h mode change 100644 => 100755 crypto/ext4crypt/Android.mk mode change 100644 => 100755 crypto/ext4crypt/Decrypt.cpp create mode 100644 crypto/ext4crypt/ext4_crypt.h mode change 100644 => 100755 etc/init.rc mode change 100644 => 100755 etc/init.recovery.service22.rc create mode 100755 etc/init28.rc create mode 100644 fuse_sideload28/fuse_sideload.cpp create mode 100644 fuse_sideload28/fuse_sideload.h mode change 100644 => 100755 gui/Android.mk mode change 100644 => 100755 gui/gui.cpp mode change 100644 => 100755 gui/input.cpp mode change 100644 => 100755 gui/pages.cpp mode change 100644 => 100755 gui/pages.hpp mode change 100644 => 100755 gui/resources.cpp mode change 100644 => 100755 gui/resources.hpp mode change 100644 => 100755 gui/slidervalue.cpp mode change 100644 => 100755 gui/text.cpp rename {otautil => install}/ZipUtil.cpp (99%) mode change 100644 => 100755 rename {otautil => install}/ZipUtil.h (100%) mode change 100644 => 100755 install/adb_install.cpp mode change 100644 => 100755 install/fuse_sdcard_install.cpp mode change 100644 => 100755 install/include/install/adb_install.h mode change 100644 => 100755 install/include/install/fuse_sdcard_install.h mode change 100644 => 100755 install/include/install/install.h mode change 100644 => 100755 install/include/install/package.h mode change 100644 => 100755 install/include/install/wipe_data.h rename installcommand.h => install/include/installcommand.h (100%) rename legacy_property_service.h => install/include/legacy_property_service.h (100%) rename set_metadata.h => install/include/set_metadata.h (100%) rename tw_atomic.hpp => install/include/tw_atomic.hpp (100%) rename zipwrap.hpp => install/include/zipwrap.hpp (95%) mode change 100644 => 100755 mode change 100644 => 100755 install/install.cpp rename installcommand.cpp => install/installcommand.cpp (96%) mode change 100644 => 100755 rename legacy_property_service.cpp => install/legacy_property_service.cpp (100%) mode change 100644 => 100755 install/package.cpp rename set_metadata.cpp => install/set_metadata.cpp (100%) rename tw_atomic.cpp => install/tw_atomic.cpp (100%) mode change 100644 => 100755 install/wipe_data.cpp rename zipwrap.cpp => install/zipwrap.cpp (98%) mode change 100644 => 100755 rename adb_install.cpp => install28/adb_install.cpp (97%) mode change 100644 => 100755 create mode 100644 install28/adb_install.h mode change 100644 => 100755 minadbd/Android.mk mode change 100644 => 100755 minadbd/fuse_adb_provider.h mode change 100644 => 100755 minadbd/minadbd.cpp mode change 100644 => 100755 minadbd/minadbd_services.cpp mode change 100644 => 100755 minui/Android.mk mode change 100644 => 100755 minui/events.cpp mode change 100644 => 100755 minui/graphics.cpp mode change 100644 => 100755 minui/graphics_adf.cpp mode change 100644 => 100755 minui/graphics_drm.cpp mode change 100644 => 100755 minui/include/minui/minui.h mode change 100644 => 100755 minui/resources.cpp mode change 100644 => 100755 minuitwrp/graphics.cpp mode change 100644 => 100755 minuitwrp/truetype.cpp create mode 100755 minuitwrp/truetype.hpp mode change 100644 => 100755 minzip/Zip.c mode change 100644 => 100755 mtp/ffs/Android.mk mode change 100644 => 100755 otautil/Android.bp delete mode 100644 otautil/Android.mk mode change 100644 => 100755 otautil/include/otautil/logging.h mode change 100644 => 100755 partitions.hpp mode change 100644 => 100755 prebuilt/Android.mk delete mode 100755 prebuilt/permissive.sh create mode 100644 prebuilt/relink create mode 100644 prebuilt/relink_init mode change 100644 => 100755 recovery_ui/include/recovery_ui/device.h delete mode 100644 rotate_logs.cpp mode change 100644 => 100755 sepolicy/twrp.te mode change 100644 => 100755 tests/Android.mk mode change 100644 => 100755 tests/unit/zip_test.cpp mode change 100644 => 100755 toolbox/Android.mk mode change 100644 => 100755 toybox/Android.mk mode change 100644 => 100755 twinstall.h mode change 100644 => 100755 updater/Android.mk mode change 100644 => 100755 updater/blockimg.cpp mode change 100644 => 100755 updater/install.cpp mode change 100644 => 100755 updater/updater.cpp mode change 100644 => 100755 updater_sample/proguard.flags create mode 100644 verifier28/asn1_decoder.cpp create mode 100644 verifier28/asn1_decoder.h create mode 100644 verifier28/verifier.cpp rename verifier.h => verifier28/verifier.h (100%) diff --git a/.gitignore b/.gitignore index e03babb1..480f5478 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .*.swp *~ tags +.vscode diff --git a/Android.bp b/Android.bp old mode 100644 new mode 100755 index c98d1946..c9f92b6b --- a/Android.bp +++ b/Android.bp @@ -1,4 +1,3 @@ -<<<<<<< HEAD subdirs = [ // "applypatch", "bootloader_message", @@ -7,199 +6,15 @@ subdirs = [ // "otautil", // "uncrypt", ] -======= -// Copyright (C) 2018 The Android Open Source Project -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. cc_defaults { name: "recovery_defaults", - cflags: [ "-D_FILE_OFFSET_BITS=64", - // Must be the same as RECOVERY_API_VERSION. "-DRECOVERY_API_VERSION=3", - "-Wall", "-Werror", ], + cpp_std: "c++17", } - -cc_library_static { - name: "librecovery_fastboot", - recovery_available: true, - defaults: [ - "recovery_defaults", - ], - - srcs: [ - "fastboot/fastboot.cpp", - ], - - shared_libs: [ - "libbase", - "libbootloader_message", - "libcutils", - "liblog", - "librecovery_ui", - ], - - static_libs: [ - "librecovery_ui_default", - ], -} - -cc_defaults { - name: "librecovery_defaults", - - defaults: [ - "recovery_defaults", - ], - - shared_libs: [ - "android.hardware.health@2.0", - "libbase", - "libbootloader_message", - "libcrypto", - "libcutils", - "libfs_mgr", - "liblog", - "libziparchive", - ], - - static_libs: [ - "libinstall", - "librecovery_fastboot", - "libminui", - "libotautil", - - // external dependencies - "libhealthhalutils", - "libfstab", - ], -} - -cc_library_static { - name: "librecovery", - recovery_available: true, - - defaults: [ - "librecovery_defaults", - ], - - srcs: [ - "fsck_unshare_blocks.cpp", - "recovery.cpp", - ], - - shared_libs: [ - "librecovery_ui", - ], -} - -cc_binary { - name: "recovery", - recovery: true, - - defaults: [ - "libinstall_defaults", - "librecovery_defaults", - ], - - srcs: [ - "recovery_main.cpp", - ], - - shared_libs: [ - "librecovery_ui", - ], - - static_libs: [ - "librecovery", - "librecovery_ui_default", - ], - - required: [ - "e2fsdroid.recovery", - "librecovery_ui_ext", - "minadbd", - "mke2fs.conf.recovery", - "mke2fs.recovery", - "recovery_deps", - ], -} - -// The dynamic executable that runs after /data mounts. -cc_binary { - name: "recovery-persist", - - defaults: [ - "recovery_defaults", - ], - - srcs: [ - "recovery-persist.cpp", - ], - - shared_libs: [ - "libbase", - "liblog", - "libmetricslogger", - ], - - static_libs: [ - "libotautil", - "libfstab", - ], - - init_rc: [ - "recovery-persist.rc", - ], -} - -// The dynamic executable that runs at init. -cc_binary { - name: "recovery-refresh", - - defaults: [ - "recovery_defaults", - ], - - srcs: [ - "recovery-refresh.cpp", - ], - - shared_libs: [ - "libbase", - "liblog", - ], - - static_libs: [ - "libotautil", - "libfstab", - ], - - init_rc: [ - "recovery-refresh.rc", - ], -} - -filegroup { - name: "res-testdata", - - srcs: [ - "res-*/images/*_text.png", - ], -} ->>>>>>> android-10.0.0_r25 diff --git a/Android.mk b/Android.mk index 4e7d7cce..30d59812 100755 --- a/Android.mk +++ b/Android.mk @@ -15,7 +15,6 @@ LOCAL_PATH := $(call my-dir) commands_TWRP_local_path := $(LOCAL_PATH) -<<<<<<< HEAD ifneq ($(project-path-for),) ifeq ($(LOCAL_PATH),$(call project-path-for,recovery)) PROJECT_PATH_AGREES := true @@ -123,13 +122,25 @@ LOCAL_C_INCLUDES += \ system/core/adb \ system/core/libsparse \ external/zlib \ - $(LOCAL_PATH)/bootloader_message_twrp/include + system/core/libpixelflinger/include \ + external/freetype/include \ + $(LOCAL_PATH)/bootloader_message_twrp/include \ + $(LOCAL_PATH)/recovery_ui/include \ + $(LOCAL_PATH)/otautil/include \ + $(LOCAL_PATH)/install/include LOCAL_C_INCLUDES += bionic ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_C_INCLUDES += external/stlport/stlport external/openssl/include LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 else + ifeq ($shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_C_INCLUDES += $(LOCAL_PATH)/fuse_sideload28/ + else + LOCAL_C_FLAGS += -DUSE_OLD_LOAD_KEYS + LOCAL_C_INCLUDES += $(LOCAL_PATH)/fuse_sideload/include \ + $(LOCAL_PATH)/install/include + endif LOCAL_C_INCLUDES += external/boringssl/include external/libcxx/include endif @@ -137,8 +148,8 @@ LOCAL_STATIC_LIBRARIES := LOCAL_SHARED_LIBRARIES := LOCAL_STATIC_LIBRARIES += libguitwrp -LOCAL_SHARED_LIBRARIES += libaosprecovery libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libtwadbbu libbootloader_message_twrp -LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest libc++ +LOCAL_SHARED_LIBRARIES += libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libtwadbbu libbootloader_message_twrp +LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest libc++ libaosprecovery ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_SHARED_LIBRARIES += libstlport @@ -149,6 +160,12 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes LOCAL_CFLAGS += -DUSE_OLD_VERIFIER else + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 29; echo $$?),0) + LOCAL_C_INCLUDES += $(LOCAL_PATH)/verifier28/ + LOCAL_CFLAGS += -DUSE_28_VERIFIER + else + LOCAL_C_INCLUDES += $(LOCAL_PATH)/install/include + endif LOCAL_SHARED_LIBRARIES += libcrypto endif @@ -157,8 +174,14 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0) endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - LOCAL_SHARED_LIBRARIES += libziparchive - LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_SHARED_LIBRARIES += libziparchive + LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include system/core/libziparchive/include + else + LOCAL_SHARED_LIBRARIES += libziparchive + LOCAL_C_INCLUDES += system/core/libziparchive/include + LOCAL_C_FLAGS += -DUSE_ + endif else LOCAL_SHARED_LIBRARIES += libminzip LOCAL_CFLAGS += -DUSE_MINZIP @@ -212,34 +235,9 @@ LOCAL_C_INCLUDES += system/extras/ext4_utils tw_git_revision := $(shell git -C $(LOCAL_PATH) rev-parse --short=8 HEAD 2>/dev/null) ifeq ($(shell git -C $(LOCAL_PATH) diff --quiet; echo $$?),1) tw_git_revision := $(tw_git_revision)-dirty -======= -# Needed by build/make/core/Makefile. Must be consistent with the value in Android.bp. -RECOVERY_API_VERSION := 3 -RECOVERY_FSTAB_VERSION := 2 - -# TARGET_RECOVERY_UI_LIB should be one of librecovery_ui_{default,wear,vr} or a device-specific -# module that defines make_device() and the exact RecoveryUI class for the target. It defaults to -# librecovery_ui_default, which uses ScreenRecoveryUI. -TARGET_RECOVERY_UI_LIB ?= librecovery_ui_default - -# librecovery_ui_ext (shared library) -# =================================== -include $(CLEAR_VARS) - -LOCAL_MODULE := librecovery_ui_ext - -# LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds. -LOCAL_MULTILIB := first - -ifeq ($(TARGET_IS_64_BIT),true) -LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib64 -else -LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib ->>>>>>> android-10.0.0_r25 endif LOCAL_CFLAGS += -DTW_GIT_REVISION='"$(tw_git_revision)"' -<<<<<<< HEAD ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) ifeq ($(TW_EXCLUDE_MTP),) LOCAL_SHARED_LIBRARIES += libtwrpmtp-ffs @@ -425,13 +423,14 @@ ifneq ($(TW_CLOCK_OFFSET),) LOCAL_CFLAGS += -DTW_CLOCK_OFFSET=$(TW_CLOCK_OFFSET) endif TWRP_REQUIRED_MODULES += \ + relink \ + relink_init \ dump_image \ erase_image \ flash_image \ mke2fs.conf \ pigz \ teamwin \ - toolbox_symlinks \ twrp \ fsck.fat \ fatlabel \ @@ -537,16 +536,30 @@ ifeq ($(shell test $(CM_PLATFORM_SDK_VERSION) -ge 3; echo $$?),0) mkfs.f2fs endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) - TWRP_REQUIRED_MODULES += sload.f2fs + TWRP_REQUIRED_MODULES += sload.f2fs \ + libfs_mgr \ + fs_mgr \ + libinit endif endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) TWRP_REQUIRED_MODULES += ld.config.txt - TWRP_REQUIRED_MODULES += init.recovery.ldconfig.rc - LOCAL_POST_INSTALL_CMD += \ - sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths = \/sbin\n\1 +=/' \ - $(TARGET_OUT_ETC)/ld.config*.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt; + ifeq ($(BOARD_VNDK_RUNTIME_DISABLE),true) + LOCAL_POST_INSTALL_CMD += \ + sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths = \/sbin\n\1 +=/' \ + $(TARGET_OUT_ETC)/ld.config.vndk_lite.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt; + else + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) + LOCAL_POST_INSTALL_CMD += \ + sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths = \/sbin\n\1 +=/' \ + $(TARGET_RECOVERY_ROOT_OUT)/system/etc/ld.config.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt; + else + LOCAL_POST_INSTALL_CMD += \ + sed 's/\(namespace.default.search.paths\)\s\{1,\}=/namespace.default.search.paths = \/sbin\n\1 +=/' \ + $(TARGET_OUT_ETC)/ld.config.txt > $(TARGET_RECOVERY_ROOT_OUT)/sbin/ld.config.txt; + endif + endif endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 25; echo $$?),0) @@ -580,7 +593,7 @@ endif LOCAL_POST_INSTALL_CMD := \ $(hide) cp -f $(PRODUCT_OUT)/obj/ETC/file_contexts.bin_intermediates/file_contexts.concat.tmp $(TARGET_RECOVERY_ROOT_OUT)/file_contexts -include $(BUILD_PHONY_PACKAGE) +#include $(BUILD_PHONY_PACKAGE) ifneq ($(TW_USE_TOOLBOX), true) include $(CLEAR_VARS) @@ -620,7 +633,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(RECOVERY_BUSYBOX_SYMLINKS) ifneq (,$(filter $(PLATFORM_SDK_VERSION),16 17 18)) ALL_DEFAULT_INSTALLED_MODULES += $(RECOVERY_BUSYBOX_SYMLINKS) endif -include $(BUILD_PHONY_PACKAGE) +#include $(BUILD_PHONY_PACKAGE) RECOVERY_BUSYBOX_SYMLINKS := endif # !TW_USE_TOOLBOX @@ -629,10 +642,15 @@ endif # !TW_USE_TOOLBOX ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ - recovery-persist.cpp \ - rotate_logs.cpp + recovery-persist.cpp LOCAL_MODULE := recovery-persist - LOCAL_SHARED_LIBRARIES := liblog libbase + LOCAL_SHARED_LIBRARIES := liblog libbase libmetricslogger + LOCAL_STATIC_LIBRARIES := libotautil + LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + LOCAL_C_INCLUDES += system/core/libmetricslogger/include \ + system/core/libstats/include + endif LOCAL_CFLAGS := -Werror LOCAL_INIT_RC := recovery-persist.rc include $(BUILD_EXECUTABLE) @@ -643,10 +661,11 @@ endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ - recovery-refresh.cpp \ - rotate_logs.cpp + recovery-refresh.cpp LOCAL_MODULE := recovery-refresh LOCAL_SHARED_LIBRARIES := liblog libbase + LOCAL_STATIC_LIBRARIES := libotautil + LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include LOCAL_CFLAGS := -Werror LOCAL_INIT_RC := recovery-refresh.rc include $(BUILD_EXECUTABLE) @@ -654,90 +673,61 @@ endif # shared libfusesideload # =============================== -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter -LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + include $(CLEAR_VARS) + LOCAL_CLANG := true + LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter + LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libfusesideload -LOCAL_SHARED_LIBRARIES := libcutils libc -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) - LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes - LOCAL_SHARED_LIBRARIES += libmincrypttwrp - LOCAL_CFLAGS += -DUSE_MINCRYPT -else - LOCAL_SHARED_LIBRARIES += libcrypto + LOCAL_MODULE_TAGS := optional + LOCAL_MODULE := libfusesideload + LOCAL_SHARED_LIBRARIES := libcutils libc + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) + LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes + LOCAL_SHARED_LIBRARIES += libmincrypttwrp + LOCAL_CFLAGS += -DUSE_MINCRYPT + else + LOCAL_SHARED_LIBRARIES += libcrypto libbase + endif + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) + LOCAL_SRC_FILES := fuse_sideload22.cpp + LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 + else + # ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_SRC_FILES := fuse_sideload28/fuse_sideload.cpp + # else + # LOCAL_SRC_FILES := fuse_sideload/fuse_sideload.cpp \ + fuse_sideload/fuse_provider.cpp + # endif + endif + include $(BUILD_SHARED_LIBRARY) endif -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) - LOCAL_SRC_FILES := fuse_sideload22.cpp - LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 -else - LOCAL_SRC_FILES := fuse_sideload.cpp -======= -LOCAL_WHOLE_STATIC_LIBRARIES := \ - $(TARGET_RECOVERY_UI_LIB) -LOCAL_SHARED_LIBRARIES := \ - libbase \ - liblog \ - librecovery_ui.recovery +# # static libfusesideload +# # =============================== (required to fix build errors in 8.1 due to use by tests) +# include $(CLEAR_VARS) +# LOCAL_CLANG := true +# LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter +# LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -include $(BUILD_SHARED_LIBRARY) +# LOCAL_MODULE_TAGS := optional +# LOCAL_MODULE := libfusesideload +# LOCAL_SHARED_LIBRARIES := libcutils libc +# ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) +# LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes +# LOCAL_STATIC_LIBRARIES += libmincrypttwrp +# LOCAL_CFLAGS += -DUSE_MINCRYPT +# else +# LOCAL_STATIC_LIBRARIES += libcrypto_static +# endif +# ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) +# LOCAL_SRC_FILES := fuse_sideload22.cpp +# LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 +# else +# LOCAL_SRC_FILES := fuse_sideload.cpp +# endif +# include $(BUILD_STATIC_LIBRARY) -# recovery_deps: A phony target that's depended on by `recovery`, which -# builds additional modules conditionally based on Makefile variables. -# ====================================================================== -include $(CLEAR_VARS) - -LOCAL_MODULE := recovery_deps - -ifeq ($(TARGET_USERIMAGES_USE_F2FS),true) -ifeq ($(HOST_OS),linux) -LOCAL_REQUIRED_MODULES += \ - make_f2fs.recovery \ - sload_f2fs.recovery -endif ->>>>>>> android-10.0.0_r25 -endif -include $(BUILD_SHARED_LIBRARY) - -# static libfusesideload -# =============================== (required to fix build errors in 8.1 due to use by tests) -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_CFLAGS := -Wall -Werror -Wno-unused-parameter -LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE - -<<<<<<< HEAD -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libfusesideload -LOCAL_SHARED_LIBRARIES := libcutils libc -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) - LOCAL_C_INCLUDES := $(LOCAL_PATH)/libmincrypt/includes - LOCAL_STATIC_LIBRARIES += libmincrypttwrp - LOCAL_CFLAGS += -DUSE_MINCRYPT -else - LOCAL_STATIC_LIBRARIES += libcrypto_static -======= -# 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 -# will be deteleted after the report. -LOCAL_REQUIRED_MODULES += recovery-persist -ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),) -LOCAL_REQUIRED_MODULES += recovery-refresh ->>>>>>> android-10.0.0_r25 -endif -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) - LOCAL_SRC_FILES := fuse_sideload22.cpp - LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 -else - LOCAL_SRC_FILES := fuse_sideload.cpp -endif -include $(BUILD_STATIC_LIBRARY) - -<<<<<<< HEAD # libmounts (static library) # =============================== include $(CLEAR_VARS) @@ -779,10 +769,19 @@ include $(CLEAR_VARS) LOCAL_MODULE := libaosprecovery -LOCAL_MODULE_TAGS := eng optional -LOCAL_CFLAGS := -std=gnu++0x -LOCAL_SRC_FILES := adb_install.cpp legacy_property_service.cpp set_metadata.cpp tw_atomic.cpp installcommand.cpp zipwrap.cpp -LOCAL_SHARED_LIBRARIES += libc liblog libcutils libmtdutils libfusesideload libselinux libminzip +LOCAL_MODULE_TAGS := optional +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_SRC_FILES := install28/adb_install.cpp legacy_property_service.cpp set_metadata.cpp tw_atomic.cpp \ + installcommand.cpp zipwrap.cpp +else + LOCAL_SRC_FILES := install/adb_install.cpp install/asn1_decoder.cpp install/fuse_sdcard_install.cpp\ + install/install.cpp install/installcommand.cpp install/legacy_property_service.cpp \ + install/package.cpp install/verifier.cpp install/wipe_data.cpp install/tw_atomic.cpp \ + install/set_metadata.cpp verifier28/verifier.cpp install/zipwrap.cpp install/ZipUtil.cpp +endif +LOCAL_SHARED_LIBRARIES += libbase libbootloader_message libcrypto libext4_utils \ + libfs_mgr libfusesideload libhidl-gen-utils libhidlbase libhidltransport \ + liblog libselinux libtinyxml2 libutils libz libziparchive libcutils LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_SHARED_LIBRARIES += libstdc++ libstlport @@ -797,30 +796,51 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) LOCAL_SRC_FILES += verifier24/verifier.cpp verifier24/asn1_decoder.cpp LOCAL_CFLAGS += -DUSE_OLD_VERIFIER else - LOCAL_SHARED_LIBRARIES += libcrypto libbase - LOCAL_SRC_FILES += verifier.cpp asn1_decoder.cpp - LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 24; echo $$?),0) + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28; echo $$?),0) + LOCAL_CFLAGS := -std=gnu++2a + LOCAL_C_INCLUDES += $(commands_TWRP_local_path)/install/include \ + $(commands_TWRP_local_path)/recovery_ui/include \ + $(commands_TWRP_local_path)/otautil/include \ + $(commands_TWRP_local_path)/minadbd \ + $(commands_TWRP_local_path)/minzip \ + system/libvintf/include + LOCAL_STATIC_LIBRARIES += libotautil libvintf_recovery libvintf + else + LOCAL_C_INCLUDES += $(commands_TWRP_local_path)/install28/ + LOCAL_CFLAGS += -DUSE_28_INSTALL + endif + LOCAL_CFLAGS += -DRECOVERY_API_VERSION=$(RECOVERY_API_VERSION) + else + LOCAL_SHARED_LIBRARIES += libcrypto libbase + LOCAL_SRC_FILES += verifier28/verifier.cpp verifier28/asn1_decoder.cpp + LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include $(LOCAL_PATH)/verifier28 \ + system/libvintf/include + LOCAL_CFLAGS += -DUSE_28_VERIFIER + endif endif ifeq ($(AB_OTA_UPDATER),true) LOCAL_CFLAGS += -DAB_OTA_UPDATER=1 endif + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - LOCAL_SRC_FILES += otautil/ZipUtil.cpp otautil/SysUtil.cpp otautil/DirUtil.cpp - LOCAL_SHARED_LIBRARIES += libziparchive libext4_utils libcrypto libcrypto_utils - LOCAL_STATIC_LIBRARIES += libvintf_recovery libfs_mgr liblogwrap libavb libvintf libtinyxml2 libz - LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include - ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0) - # Android 9.0 needs c++17 for libvintf - LOCAL_CPPFLAGS += -std=c++17 - # Android 9.0's libvintf also needs this library - LOCAL_STATIC_LIBRARIES += libhidl-gen-utils + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + # LOCAL_SRC_FILES += otautil/ZipUtil.cpp otautil/SysUtil.cpp otautil/DirUtil.cpp + LOCAL_SHARED_LIBRARIES += libziparchive libext4_utils libcrypto libcrypto_utils libfs_mgr + LOCAL_STATIC_LIBRARIES += libvintf_recovery liblogwrap libavb libvintf libtinyxml2 libz + LOCAL_C_INCLUDES += $(LOCAL_PATH)/otautil/include + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0) + # Android 9.0's libvintf also needs this library + LOCAL_STATIC_LIBRARIES += libhidl-gen-utils + endif endif else LOCAL_CFLAGS += -DUSE_MINZIP endif include $(BUILD_SHARED_LIBRARY) + # libverifier (static library) # =============================== include $(CLEAR_VARS) @@ -837,44 +857,41 @@ LOCAL_STATIC_LIBRARIES := \ LOCAL_CFLAGS := -Wall -Werror include $(BUILD_STATIC_LIBRARY) -# Wear default device -# =============================== -include $(CLEAR_VARS) -LOCAL_SRC_FILES := wear_device.cpp -LOCAL_CFLAGS := -Wall -Werror +# # Wear default device +# # =============================== +# include $(CLEAR_VARS) +# LOCAL_SRC_FILES := wear_device.cpp +# LOCAL_CFLAGS := -Wall -Werror -# Should match TARGET_RECOVERY_UI_LIB in BoardConfig.mk. -LOCAL_MODULE := librecovery_ui_wear +# # Should match TARGET_RECOVERY_UI_LIB in BoardConfig.mk. +# LOCAL_MODULE := librecovery_ui_wear -include $(BUILD_STATIC_LIBRARY) +# include $(BUILD_STATIC_LIBRARY) -# vr headset default device -# =============================== -include $(CLEAR_VARS) +# # vr headset default device +# # =============================== +# include $(CLEAR_VARS) -LOCAL_SRC_FILES := vr_device.cpp -LOCAL_CFLAGS := -Wall -Werror +# LOCAL_SRC_FILES := vr_device.cpp +# LOCAL_CFLAGS := -Wall -Werror -# should match TARGET_RECOVERY_UI_LIB set in BoardConfig.mk -LOCAL_MODULE := librecovery_ui_vr +# # should match TARGET_RECOVERY_UI_LIB set in BoardConfig.mk +# LOCAL_MODULE := librecovery_ui_vr -include $(BUILD_STATIC_LIBRARY) -======= -include $(BUILD_PHONY_PACKAGE) ->>>>>>> android-10.0.0_r25 +# include $(BUILD_STATIC_LIBRARY) commands_recovery_local_path := $(LOCAL_PATH) # $(LOCAL_PATH)/edify/Android.mk # $(LOCAL_PATH)/otafault/Android.mk # $(LOCAL_PATH)/bootloader_message/Android.mk + + # $(commands_TWRP_local_path)/boot_control/Android.bp + # $(commands_TWRP_local_path)/tests/Android.mk + # $(commands_TWRP_local_path)/tools/Android.mk + # $(commands_TWRP_local_path)/update_verifier/Android.mk include \ -<<<<<<< HEAD - $(commands_TWRP_local_path)/boot_control/Android.mk \ - $(commands_TWRP_local_path)/tests/Android.mk \ - $(commands_TWRP_local_path)/tools/Android.mk \ $(commands_TWRP_local_path)/updater/Android.mk \ - $(commands_TWRP_local_path)/update_verifier/Android.mk \ $(commands_TWRP_local_path)/bootloader_message_twrp/Android.mk ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 25; echo $$?),0) @@ -904,7 +921,8 @@ else $(commands_TWRP_local_path)/minui21/Android.mk endif -#$(commands_TWRP_local_path)/otautil/Android.mk + # $(commands_TWRP_local_path)/otautil/Android.mk \ + #includes for TWRP include $(commands_TWRP_local_path)/injecttwrp/Android.mk \ $(commands_TWRP_local_path)/htcdumlock/Android.mk \ @@ -920,7 +938,6 @@ include $(commands_TWRP_local_path)/injecttwrp/Android.mk \ $(commands_TWRP_local_path)/libblkid/Android.mk \ $(commands_TWRP_local_path)/minuitwrp/Android.mk \ $(commands_TWRP_local_path)/openaes/Android.mk \ - $(commands_TWRP_local_path)/toolbox/Android.mk \ $(commands_TWRP_local_path)/twrpTarMain/Android.mk \ $(commands_TWRP_local_path)/minzip/Android.mk \ $(commands_TWRP_local_path)/dosfstools/Android.mk \ @@ -973,6 +990,3 @@ endif endif commands_TWRP_local_path := -======= - $(LOCAL_PATH)/updater/Android.mk \ ->>>>>>> android-10.0.0_r25 diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 2bdff2ba..820a8b77 --- a/README.md +++ b/README.md @@ -1,136 +1,3 @@ **Team Win Recovery Project (TWRP)** -<<<<<<< HEAD You can find a compiling guide [here](http://forum.xda-developers.com/showthread.php?t=1943625 "Guide"). -======= -Quick turn-around testing -------------------------- - - mm -j && m ramdisk-nodeps && m recoveryimage-nodeps - - # To boot into the new recovery image - # without flashing the recovery partition: - adb reboot bootloader - fastboot boot $ANDROID_PRODUCT_OUT/recovery.img - -Running the tests ------------------ - # After setting up environment and lunch. - mmma -j bootable/recovery - - # Running the tests on device. - adb root - adb sync data - - # 32-bit device - adb shell /data/nativetest/recovery_unit_test/recovery_unit_test - adb shell /data/nativetest/recovery_component_test/recovery_component_test - - # Or 64-bit device - adb shell /data/nativetest64/recovery_unit_test/recovery_unit_test - adb shell /data/nativetest64/recovery_component_test/recovery_component_test - -Running the manual tests ------------------------- - -`recovery-refresh` and `recovery-persist` executables exist only on systems without -/cache partition. And we need to follow special steps to run tests for them. - -- Execute the test on an A/B device first. The test should fail but it will log - some contents to pmsg. - -- Reboot the device immediately and run the test again. The test should save the - contents of pmsg buffer into /data/misc/recovery/inject.txt. Test will pass if - this file has expected contents. - -Using `adb` under recovery --------------------------- - -When running recovery image from debuggable builds (i.e. `-eng` or `-userdebug` build variants, or -`ro.debuggable=1` in `/prop.default`), `adbd` service is enabled and started by default, which -allows `adb` communication. A device should be listed under `adb devices`, either in `recovery` or -`sideload` state. - - $ adb devices - List of devices attached - 1234567890abcdef recovery - -Although `/system/bin/adbd` is built from the same code base as the one in the normal boot, only a -subset of `adb` commands are meaningful under recovery, such as `adb root`, `adb shell`, `adb push`, -`adb pull` etc. Since Android Q, `adb shell` no longer requires manually mounting `/system` from -recovery menu. - -## Troubleshooting - -### `adb devices` doesn't show the device. - - $ adb devices - List of devices attached - - * Ensure `adbd` is built and running. - -By default, `adbd` is always included into recovery image, as `/system/bin/adbd`. `init` starts -`adbd` service automatically only in debuggable builds. This behavior is controlled by the recovery -specific `/init.rc`, whose source code is at `bootable/recovery/etc/init.rc`. - -The best way to confirm a running `adbd` is by checking the serial output, which shows a service -start log as below. - - [ 18.961986] c1 1 init: starting service 'adbd'... - - * Ensure USB gadget has been enabled. - -If `adbd` service has been started but device not shown under `adb devices`, use `lsusb(8)` (on -host) to check if the device is visible to the host. - -`bootable/recovery/etc/init.rc` disables Android USB gadget (via sysfs) as part of the `fs` action -trigger, and will only re-enable it in debuggable builds (the `on property` rule will always run -_after_ `on fs`). - - on fs - write /sys/class/android_usb/android0/enable 0 - - # Always start adbd on userdebug and eng builds - on property:ro.debuggable=1 - write /sys/class/android_usb/android0/enable 1 - start adbd - -If device is using [configfs](https://www.kernel.org/doc/Documentation/usb/gadget_configfs.txt), -check if configfs has been properly set up in init rc scripts. See the [example -configuration](https://android.googlesource.com/device/google/wahoo/+/master/init.recovery.hardware.rc) -for Pixel 2 devices. Note that the flag set via sysfs (i.e. the one above) is no-op when using -configfs. - -### `adb devices` shows the device, but in `unauthorized` state. - - $ adb devices - List of devices attached - 1234567890abcdef unauthorized - -recovery image doesn't honor the USB debugging toggle and the authorizations added under normal boot -(because such authorization data stays in /data, which recovery doesn't mount), nor does it support -authorizing a host device under recovery. We can use one of the following options instead. - - * **Option 1 (Recommended):** Authorize a host device with adb vendor keys. - -For debuggable builds, an RSA keypair can be used to authorize a host device that has the private -key. The public key, defined via `PRODUCT_ADB_KEYS`, will be copied to `/adb_keys`. When starting -the host-side `adbd`, make sure the filename (or the directory) of the matching private key has been -added to `$ADB_VENDOR_KEYS`. - - $ export ADB_VENDOR_KEYS=/path/to/adb/private/key - $ adb kill-server - $ adb devices - -`-user` builds filter out `PRODUCT_ADB_KEYS`, so no `/adb_keys` will be included there. - -Note that this mechanism applies to both of normal boot and recovery modes. - - * **Option 2:** Allow `adbd` to connect without authentication. - * `adbd` is compiled with `ALLOW_ADBD_NO_AUTH` (only on debuggable builds). - * `ro.adb.secure` has a value of `0`. - -Both of the two conditions need to be satisfied. Although `ro.adb.secure` is a runtime property, its -value is set at build time (written into `/prop.default`). It defaults to `1` on `-user` builds, and -`0` for other build variants. The value is overridable via `PRODUCT_DEFAULT_PROPERTY_OVERRIDES`. ->>>>>>> android-10.0.0_r25 diff --git a/adbbu/Android.mk b/adbbu/Android.mk index 8f8dbd0f..e2719389 100644 --- a/adbbu/Android.mk +++ b/adbbu/Android.mk @@ -41,7 +41,7 @@ LOCAL_C_INCLUDES += bionic external/zlib LOCAL_CFLAGS:= -c -W LOCAL_MODULE:= twrpbu LOCAL_MODULE_STEM := bu -LOCAL_MODULE_TAGS:= eng +LOCAL_MODULE_TAGS:= optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin include $(BUILD_EXECUTABLE) diff --git a/applypatch/Android.mk b/applypatch/Android.mk index 1f71c446..44112fde 100644 --- a/applypatch/Android.mk +++ b/applypatch/Android.mk @@ -23,7 +23,7 @@ LOCAL_SRC_FILES := \ freecache.cpp \ imgpatch.cpp LOCAL_MODULE := libapplypatch -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ $(commands_recovery_local_path) diff --git a/applypatch/applypatch.cpp b/applypatch/applypatch.cpp old mode 100644 new mode 100755 index a2d38f15..0106582f --- a/applypatch/applypatch.cpp +++ b/applypatch/applypatch.cpp @@ -49,23 +49,8 @@ using namespace std::string_literals; -<<<<<<< HEAD -static bool mtd_partitions_scanned = false; - -// Read a file into memory; store the file contents and associated metadata in *file. -// Return 0 on success. -int LoadFileContents(const char* filename, FileContents* file) { - // A special 'filename' beginning with "MTD:" or "EMMC:" means to - // load the contents of a partition. - if (strncmp(filename, "MTD:", 4) == 0 || - strncmp(filename, "EMMC:", 5) == 0 || - strncmp(filename, "BML:", 4) == 0) { - return LoadPartitionContents(filename, file); - } -======= static bool GenerateTarget(const Partition& target, const FileContents& source_file, const Value& patch, const Value* bonus_data); ->>>>>>> android-10.0.0_r25 bool LoadFileContents(const std::string& filename, FileContents* file) { // No longer allow loading contents from eMMC partitions. @@ -84,62 +69,6 @@ bool LoadFileContents(const std::string& filename, FileContents* file) { return true; } -<<<<<<< HEAD -// Load the contents of an EMMC partition into the provided -// FileContents. filename should be a string of the form -// "EMMC::...". The smallest size_n bytes for -// which that prefix of the partition contents has the corresponding -// sha1 hash will be loaded. It is acceptable for a size value to be -// repeated with different sha1s. Will return 0 on success. -// -// This complexity is needed because if an OTA installation is -// interrupted, the partition might contain either the source or the -// target data, which might be of different lengths. We need to know -// the length in order to read from a partition (there is no -// "end-of-file" marker), so the caller must specify the possible -// lengths and the hash of the data, and we'll do the load expecting -// to find one of those hashes. -enum PartitionType { MTD, EMMC }; - -static int LoadPartitionContents(const std::string& filename, FileContents* file) { - std::vector pieces = android::base::Split(filename, ":"); - if (pieces.size() < 4 || pieces.size() % 2 != 0) { - printf("LoadPartitionContents called with bad filename \"%s\"\n", filename.c_str()); - return -1; - } - - enum PartitionType type; - if (pieces[0] == "MTD") { - type = MTD; - } else if (pieces[0] == "EMMC") { - type = EMMC; - } else if (pieces[0] == "BML") { - type = EMMC; - } else { - printf("LoadPartitionContents called with bad filename (%s)\n", filename.c_str()); - return -1; - } - - size_t pair_count = (pieces.size() - 2) / 2; // # of (size, sha1) pairs in filename - std::vector> pairs; - for (size_t i = 0; i < pair_count; ++i) { - size_t size; - if (!android::base::ParseUint(pieces[i * 2 + 2], &size) || size == 0) { - printf("LoadPartitionContents called with bad size \"%s\"\n", pieces[i * 2 + 2].c_str()); - return -1; - } - pairs.push_back({ size, pieces[i * 2 + 3] }); - } - - // Sort the pairs array so that they are in order of increasing size. - std::sort(pairs.begin(), pairs.end()); - - const char* partition = pieces[1].c_str(); - unique_file dev(ota_fopen(partition, "rb")); - if (!dev) { - printf("failed to open emmc partition \"%s\": %s\n", partition, strerror(errno)); - return -1; -======= // Reads the contents of a Partition to the given FileContents buffer. static bool ReadPartitionToBuffer(const Partition& partition, FileContents* out, bool check_backup) { @@ -147,7 +76,6 @@ static bool ReadPartitionToBuffer(const Partition& partition, FileContents* out, if (ParseSha1(partition.hash, expected_sha1) != 0) { LOG(ERROR) << "Failed to parse target hash \"" << partition.hash << "\""; return false; ->>>>>>> android-10.0.0_r25 } android::base::unique_fd dev(open(partition.name.c_str(), O_RDONLY)); @@ -164,40 +92,6 @@ static bool ReadPartitionToBuffer(const Partition& partition, FileContents* out, out->data = std::move(buffer); return true; } -<<<<<<< HEAD - SHA1_Update(&sha_ctx, buffer_ptr, read); - buffer_size += read; - buffer_ptr += read; - } - - if (pieces[0] == "BML") { - if (strcmp(partition, "boot") == 0) { - partition = BOARD_BML_BOOT; - } else if (strcmp(partition, "recovery") == 0) { - partition = BOARD_BML_RECOVERY; - } - } - - // Duplicate the SHA context and finalize the duplicate so we can - // check it against this pair's expected hash. - SHA_CTX temp_ctx; - memcpy(&temp_ctx, &sha_ctx, sizeof(SHA_CTX)); - uint8_t sha_so_far[SHA_DIGEST_LENGTH]; - SHA1_Final(sha_so_far, &temp_ctx); - - uint8_t parsed_sha[SHA_DIGEST_LENGTH]; - if (ParseSha1(current_sha1.c_str(), parsed_sha) != 0) { - printf("failed to parse SHA-1 %s in %s\n", current_sha1.c_str(), filename.c_str()); - return -1; - } - - if (memcmp(sha_so_far, parsed_sha, SHA_DIGEST_LENGTH) == 0) { - // We have a match. Stop reading the partition; we'll return the data we've read so far. - printf("partition read matched size %zu SHA-1 %s\n", current_size, current_sha1.c_str()); - found = true; - break; -======= ->>>>>>> android-10.0.0_r25 } } @@ -228,34 +122,6 @@ bool SaveFileContents(const std::string& filename, const FileContents* file) { return false; } -<<<<<<< HEAD - return 0; -} - -// Write a memory buffer to 'target' partition, a string of the form -// "EMMC:[:...]". The target name -// might contain multiple colons, but WriteToPartition() only uses the first -// two and ignores the rest. Return 0 on success. -int WriteToPartition(const unsigned char* data, size_t len, const std::string& target) { - std::string copy(target); - std::vector pieces = android::base::Split(copy, ":"); - - if (pieces.size() < 2) { - printf("WriteToPartition called with bad target (%s)\n", target.c_str()); - return -1; - } - - enum PartitionType type; - if (pieces[0] == "MTD") { - type = MTD; - } else if (pieces[0] == "EMMC") { - type = EMMC; - } else if (pieces[0] == "BML") { - type = EMMC; - } else { - printf("WriteToPartition called with bad target (%s)\n", target.c_str()); - return -1; -======= if (fsync(fd) != 0) { PLOG(ERROR) << "Failed to fsync \"" << filename << "\""; return false; @@ -321,228 +187,10 @@ static bool WriteBufferToPartition(const FileContents& file_contents, const Part if (TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_SET)) == -1) { PLOG(ERROR) << "Failed to seek to 0 on " << partition; return false; ->>>>>>> android-10.0.0_r25 } const char* partition = pieces[1].c_str(); -<<<<<<< HEAD - if (pieces[0] == "BML") { - if (strcmp(partition, "boot") == 0) { - partition = BOARD_BML_BOOT; - } else if (strcmp(partition, "recovery") == 0) { - partition = BOARD_BML_RECOVERY; - } - - int bmlpartition = open(partition, O_RDWR | O_LARGEFILE); - if (bmlpartition < 0) - return -1; - if (ioctl(bmlpartition, BML_UNLOCK_ALL, 0)) { - printf("failed to unlock BML partition: (%s)\n", partition); - return -1; - } - close(bmlpartition); - } - - if (partition == NULL) { - printf("bad partition target name \"%s\"\n", target.c_str()); - return -1; - } - - switch (type) { - case MTD: { - if (!mtd_partitions_scanned) { - mtd_scan_partitions(); - mtd_partitions_scanned = true; - } - - const MtdPartition* mtd = mtd_find_partition_by_name(partition); - if (mtd == NULL) { - printf("mtd partition \"%s\" not found for writing\n", partition); - return -1; - } - - MtdWriteContext* ctx = mtd_write_partition(mtd); - if (ctx == NULL) { - printf("failed to init mtd partition \"%s\" for writing\n", partition); - return -1; - } - - size_t written = mtd_write_data(ctx, reinterpret_cast(data), len); - if (written != len) { - printf("only wrote %zu of %zu bytes to MTD %s\n", written, len, partition); - mtd_write_close(ctx); - return -1; - } - - if (mtd_erase_blocks(ctx, -1) < 0) { - printf("error finishing mtd write of %s\n", partition); - mtd_write_close(ctx); - return -1; - } - - if (mtd_write_close(ctx)) { - printf("error closing mtd write of %s\n", partition); - return -1; - } - break; - } - - case EMMC: { - size_t start = 0; - bool success = false; - unique_fd fd(ota_open(partition, O_RDWR | O_SYNC)); - if (fd < 0) { - printf("failed to open %s: %s\n", partition, strerror(errno)); - return -1; - } - - for (size_t attempt = 0; attempt < 2; ++attempt) { - if (TEMP_FAILURE_RETRY(lseek(fd, start, SEEK_SET)) == -1) { - printf("failed seek on %s: %s\n", partition, strerror(errno)); - return -1; - } - while (start < len) { - size_t to_write = len - start; - if (to_write > 1<<20) to_write = 1<<20; - - ssize_t written = TEMP_FAILURE_RETRY(ota_write(fd, data+start, to_write)); - if (written == -1) { - printf("failed write writing to %s: %s\n", partition, strerror(errno)); - return -1; - } - start += written; - } - if (ota_fsync(fd) != 0) { - printf("failed to sync to %s (%s)\n", partition, strerror(errno)); - return -1; - } - if (ota_close(fd) != 0) { - printf("failed to close %s (%s)\n", partition, strerror(errno)); - return -1; - } - unique_fd fd(ota_open(partition, O_RDONLY)); - if (fd < 0) { - printf("failed to reopen %s for verify (%s)\n", partition, strerror(errno)); - return -1; - } - - // Drop caches so our subsequent verification read - // won't just be reading the cache. - sync(); - unique_fd dc(ota_open("/proc/sys/vm/drop_caches", O_WRONLY)); - if (TEMP_FAILURE_RETRY(ota_write(dc, "3\n", 2)) == -1) { - printf("write to /proc/sys/vm/drop_caches failed: %s\n", strerror(errno)); - } else { - printf(" caches dropped\n"); - } - ota_close(dc); - sleep(1); - - // verify - if (TEMP_FAILURE_RETRY(lseek(fd, 0, SEEK_SET)) == -1) { - printf("failed to seek back to beginning of %s: %s\n", - partition, strerror(errno)); - return -1; - } - unsigned char buffer[4096]; - start = len; - for (size_t p = 0; p < len; p += sizeof(buffer)) { - size_t to_read = len - p; - if (to_read > sizeof(buffer)) { - to_read = sizeof(buffer); - } - - size_t so_far = 0; - while (so_far < to_read) { - ssize_t read_count = - TEMP_FAILURE_RETRY(ota_read(fd, buffer+so_far, to_read-so_far)); - if (read_count == -1) { - printf("verify read error %s at %zu: %s\n", - partition, p, strerror(errno)); - return -1; - } - if (static_cast(read_count) < to_read) { - printf("short verify read %s at %zu: %zd %zu %s\n", - partition, p, read_count, to_read, strerror(errno)); - } - so_far += read_count; - } - - if (memcmp(buffer, data+p, to_read) != 0) { - printf("verification failed starting at %zu\n", p); - start = p; - break; - } - } - - if (start == len) { - printf("verification read succeeded (attempt %zu)\n", attempt+1); - success = true; - break; - } - } - - if (!success) { - printf("failed to verify after all attempts\n"); - return -1; - } - - if (ota_close(fd) != 0) { - printf("error closing %s (%s)\n", partition, strerror(errno)); - return -1; - } - sync(); - break; - } - } - - return 0; -} - -// Take a string 'str' of 40 hex digits and parse it into the 20 -// byte array 'digest'. 'str' may contain only the digest or be of -// the form ":". Return 0 on success, -1 on any -// error. -int ParseSha1(const char* str, uint8_t* digest) { - const char* ps = str; - uint8_t* pd = digest; - for (int i = 0; i < SHA_DIGEST_LENGTH * 2; ++i, ++ps) { - int digit; - if (*ps >= '0' && *ps <= '9') { - digit = *ps - '0'; - } else if (*ps >= 'a' && *ps <= 'f') { - digit = *ps - 'a' + 10; - } else if (*ps >= 'A' && *ps <= 'F') { - digit = *ps - 'A' + 10; - } else { - return -1; - } - if (i % 2 == 0) { - *pd = digit << 4; - } else { - *pd |= digit; - ++pd; - } - } - if (*ps != '\0') return -1; - return 0; -} - -// Search an array of sha1 strings for one matching the given sha1. -// Return the index of the match on success, or -1 if no match is -// found. -static int FindMatchingPatch(uint8_t* sha1, const std::vector& patch_sha1_str) { - for (size_t i = 0; i < patch_sha1_str.size(); ++i) { - uint8_t patch_sha1[SHA_DIGEST_LENGTH]; - if (ParseSha1(patch_sha1_str[i].c_str(), patch_sha1) == 0 && - memcmp(patch_sha1, sha1, SHA_DIGEST_LENGTH) == 0) { - return i; - } - } - return -1; -======= - if (!android::base::ReadFully(fd, buffer, to_read)) { PLOG(ERROR) << "Failed to verify-read " << partition << " at " << p; return false; } @@ -574,7 +222,6 @@ static int FindMatchingPatch(uint8_t* sha1, const std::vector& patc sync(); return true; ->>>>>>> android-10.0.0_r25 } int ParseSha1(const std::string& str, uint8_t* digest) { @@ -758,40 +405,6 @@ static bool GenerateTarget(const Partition& target, const FileContents& source_f LOG(INFO) << " now " << short_sha1(expected_sha1); // Write back the temp file to the partition. - if (!WriteBufferToPartition(patched, target)) { - LOG(ERROR) << "Failed to write patched data to " << target.name; - return false; - } - - // Delete the backup copy of the source. - unlink(Paths::Get().cache_temp_source().c_str()); - - // Success! - return true; -} - -bool CheckPartition(const Partition& partition) { - FileContents target_file; - return ReadPartitionToBuffer(partition, &target_file, false); -} - -Partition Partition::Parse(const std::string& input_str, std::string* err) { - std::vector pieces = android::base::Split(input_str, ":"); - if (pieces.size() != 4 || pieces[0] != "EMMC") { - *err = "Invalid number of tokens or non-eMMC target"; - return {}; - } - - size_t size; - if (!android::base::ParseUint(pieces[2], &size) || size == 0) { - *err = "Failed to parse \"" + pieces[2] + "\" as byte count"; - return {}; - } - - return Partition(pieces[1], size, pieces[3]); -} - -std::string Partition::ToString() const { if (*this) { return "EMMC:"s + name + ":" + std::to_string(size) + ":" + hash; } diff --git a/attr/Android.mk b/attr/Android.mk index 2986ab50..ab1d892e 100644 --- a/attr/Android.mk +++ b/attr/Android.mk @@ -4,7 +4,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := listxattr.c LOCAL_CFLAGS := -c -W LOCAL_MODULE := listxattr -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_PACK_MODULE_RELOCATIONS := false diff --git a/bmlutils/Android.mk b/bmlutils/Android.mk index 7216775d..9cbada02 100644 --- a/bmlutils/Android.mk +++ b/bmlutils/Android.mk @@ -13,7 +13,7 @@ $(foreach board_define,$(BOARD_RECOVERY_DEFINES), \ LOCAL_SRC_FILES := bmlutils.c LOCAL_MODULE := libbmlutils -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_STATIC_LIBRARY) #Added for building TWRP dynamic: @@ -30,5 +30,5 @@ $(foreach board_define,$(BOARD_RECOVERY_DEFINES), \ LOCAL_SRC_FILES := bmlutils.c LOCAL_MODULE := libbmlutils -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) diff --git a/bootloader_message/Android.mk b/bootloader_message/Android.mk deleted file mode 100644 index 0d84713c..00000000 --- a/bootloader_message/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_SRC_FILES := bootloader_message.cpp -LOCAL_MODULE := libbootloader_message -LOCAL_STATIC_LIBRARIES := libbase libfs_mgr -LOCAL_CFLAGS := -Werror -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 26; echo $$?),0) - TARGET_GLOBAL_CFLAGS += -DUSE_OLD_BOOTLOADER_MESSAGE - CLANG_TARGET_GLOBAL_CFLAGS += -DUSE_OLD_BOOTLOADER_MESSAGE -endif -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -include $(BUILD_STATIC_LIBRARY) diff --git a/bootloader_message/bootloader_message.cpp b/bootloader_message/bootloader_message.cpp index 9fad7ff4..c1ebeaa8 100644 --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -39,47 +40,7 @@ void SetMiscBlockDeviceForTest(std::string_view misc_device) { g_misc_device_for_test = misc_device; } -#ifdef USE_OLD_BOOTLOADER_MESSAGE -#include - -static struct fstab* read_fstab(std::string* err) { - // The fstab path is always "/fstab.${ro.hardware}". - std::string fstab_path = "/fstab."; - char value[PROP_VALUE_MAX]; - if (__system_property_get("ro.hardware", value) == 0) { - *err = "failed to get ro.hardware"; - return nullptr; - } - fstab_path += value; - struct fstab* fstab = fs_mgr_read_fstab(fstab_path.c_str()); - if (fstab == nullptr) { - *err = "failed to read " + fstab_path; - } - return fstab; -} -#endif - static std::string get_misc_blk_device(std::string* err) { -<<<<<<< HEAD -#ifdef USE_OLD_BOOTLOADER_MESSAGE - struct fstab* fstab = read_fstab(err); -#else - std::unique_ptr fstab(fs_mgr_read_fstab_default(), - fs_mgr_free_fstab); -#endif - if (!fstab) { - *err = "failed to read default fstab"; - return ""; - } -#ifdef USE_OLD_BOOTLOADER_MESSAGE - fstab_rec* record = fs_mgr_get_entry_for_mount_point(fstab, "/misc"); -#else - fstab_rec* record = fs_mgr_get_entry_for_mount_point(fstab.get(), "/misc"); -#endif - if (record == nullptr) { - *err = "failed to find /misc partition"; - return ""; -======= if (!g_misc_device_for_test.empty()) { return g_misc_device_for_test; } @@ -92,7 +53,6 @@ static std::string get_misc_blk_device(std::string* err) { if (entry.mount_point == "/misc") { return entry.blk_device; } ->>>>>>> android-10.0.0_r25 } *err = "failed to find /misc partition"; diff --git a/bootloader_message/include/bootloader_message/bootloader_message.h b/bootloader_message/include/bootloader_message/bootloader_message.h index d03d2970..95dd8f4c 100644 --- a/bootloader_message/include/bootloader_message/bootloader_message.h +++ b/bootloader_message/include/bootloader_message/bootloader_message.h @@ -66,16 +66,6 @@ struct bootloader_message { char status[32]; char recovery[768]; -#ifdef USE_OLD_BOOTLOADER_MESSAGE - // The 'recovery' field used to be 1024 bytes. It has only ever - // been used to store the recovery command line, so 768 bytes - // should be plenty. We carve off the last 256 bytes to store the - // stage string (for multistage packages) and possible future - // expansion. - char stage[32]; - char slot_suffix[32]; - char reserved[192]; -#else // The 'recovery' field used to be 1024 bytes. It has only ever // been used to store the recovery command line, so 768 bytes // should be plenty. We carve off the last 256 bytes to store the @@ -88,14 +78,13 @@ struct bootloader_message { // 1184-byte so that the entire bootloader_message struct rounds up // to 2048-byte. char reserved[1184]; -#endif }; /** * We must be cautious when changing the bootloader_message struct size, * because A/B-specific fields may end up with different offsets. */ -#if !defined(USE_OLD_BOOTLOADER_MESSAGE) && ((__STDC_VERSION__ >= 201112L) || defined(__cplusplus)) +#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct bootloader_message) == 2048, "struct bootloader_message size changes, which may break A/B devices"); #endif @@ -132,7 +121,7 @@ struct bootloader_message_ab { * Be cautious about the struct size change, in case we put anything post * bootloader_message_ab struct (b/29159185). */ -#if !defined(USE_OLD_BOOTLOADER_MESSAGE) && ((__STDC_VERSION__ >= 201112L) || defined(__cplusplus)) +#if (__STDC_VERSION__ >= 201112L) || defined(__cplusplus) static_assert(sizeof(struct bootloader_message_ab) == 4096, "struct bootloader_message_ab size changes"); #endif diff --git a/common.h b/common.h old mode 100644 new mode 100755 index 6215b1d9..e82bec39 --- a/common.h +++ b/common.h @@ -14,19 +14,11 @@ * limitations under the License. */ -<<<<<<< HEAD -#ifndef RECOVERY_COMMON_H -#define RECOVERY_COMMON_H - -#include -#include -======= #pragma once ->>>>>>> android-10.0.0_r25 #include -#ifdef __cplusplus +#ifndef __cplusplus extern "C" { #endif @@ -54,12 +46,7 @@ struct selabel_handle; extern struct selabel_handle* sehandle; extern RecoveryUI* ui; -<<<<<<< HEAD -extern bool modified_flash; -//typedef struct fstab_rec Volume; -======= extern bool has_cache; ->>>>>>> android-10.0.0_r25 // The current stage, e.g. "1/2". extern std::string stage; @@ -67,21 +54,4 @@ extern std::string stage; // The reason argument provided in "--reason=". extern const char* reason; -<<<<<<< HEAD -// fopen a file, mounting volumes and making parent dirs as necessary. -FILE* fopen_path(const char *path, const char *mode); - -void ui_print(const char* format, ...); - -//static bool is_ro_debuggable(); - -#ifdef __cplusplus -} -#endif - -bool reboot(const std::string& command); - -#endif // RECOVERY_COMMON_H -======= -bool is_ro_debuggable(); ->>>>>>> android-10.0.0_r25 +// static bool is_ro_debuggable(); diff --git a/crypto/ext4crypt/Android.mk b/crypto/ext4crypt/Android.mk old mode 100644 new mode 100755 index 0c6ef5b5..c8283dd8 --- a/crypto/ext4crypt/Android.mk +++ b/crypto/ext4crypt/Android.mk @@ -3,12 +3,18 @@ ifeq ($(TW_INCLUDE_CRYPTO), true) include $(CLEAR_VARS) LOCAL_MODULE := libe4crypt -LOCAL_MODULE_TAGS := eng optional +LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS := LOCAL_SRC_FILES := Decrypt.cpp ScryptParameters.cpp Utils.cpp HashPassword.cpp ext4_crypt.cpp LOCAL_SHARED_LIBRARIES := libselinux libc libc++ libext4_utils libbase libcrypto libcutils libkeymaster_messages libhardware libprotobuf-cpp-lite LOCAL_STATIC_LIBRARIES := libscrypt_static -LOCAL_C_INCLUDES := system/extras/ext4_utils system/extras/ext4_utils/include/ext4_utils external/scrypt/lib/crypto system/security/keystore hardware/libhardware/include/hardware system/security/softkeymaster/include/keymaster system/keymaster/include +LOCAL_C_INCLUDES := system/extras/ext4_utils \ + system/extras/ext4_utils/include/ext4_utils \ + external/scrypt/lib/crypto \ + system/security/keystore/include \ + hardware/libhardware/include/hardware \ + system/security/softkeymaster/include/keymaster \ + system/keymaster/include ifneq ($(wildcard hardware/libhardware/include/hardware/keymaster0.h),) LOCAL_CFLAGS += -DTW_CRYPTO_HAVE_KEYMASTERX @@ -17,6 +23,10 @@ endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) #8.0 or higher LOCAL_CFLAGS += -DHAVE_GATEKEEPER1 + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + LOCAL_SHARED_LIBRARIES += android.hardware.confirmationui@1.0 + # LOCAL_CFLAGS += -DUSE_ + endif LOCAL_SHARED_LIBRARIES += android.hardware.keymaster@3.0 libkeystore_binder libhidlbase libutils libbinder android.hardware.gatekeeper@1.0 ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) #9.0 rules diff --git a/crypto/ext4crypt/Decrypt.cpp b/crypto/ext4crypt/Decrypt.cpp old mode 100644 new mode 100755 index d8542dca..dcd390f1 --- a/crypto/ext4crypt/Decrypt.cpp +++ b/crypto/ext4crypt/Decrypt.cpp @@ -52,10 +52,12 @@ #include #include -#include +#include "ext4_crypt.h" #ifdef USE_KEYSTORAGE_4 -#include +#include +#include +#include #else #include #include @@ -82,6 +84,10 @@ extern "C" { #include +#ifdef USE_KEYSTORAGE_4 +using android::security::keystore::IKeystoreService; +#endif + // Store main DE raw ref / policy extern std::string de_raw_ref; extern std::map s_de_key_raw_refs; @@ -551,7 +557,7 @@ std::string unwrapSyntheticPasswordBlob(const std::string& spblob_path, const st // First get the keystore service sp binder = getKeystoreBinderRetry(); #ifdef USE_KEYSTORAGE_4 - sp service = interface_cast(binder); + sp service = interface_cast(binder); #else sp service = interface_cast(binder); #endif diff --git a/crypto/ext4crypt/Keymaster.cpp b/crypto/ext4crypt/Keymaster.cpp index ec80ab58..3c21aa26 100644 --- a/crypto/ext4crypt/Keymaster.cpp +++ b/crypto/ext4crypt/Keymaster.cpp @@ -130,14 +130,14 @@ bool KeymasterOperation::updateCompletely(const std::string& input, std::string* auto error = mDevice->update(mOpHandle, nullptr, &inputBlob, &inputConsumed, nullptr, &outputBlob); if (error != KM_ERROR_OK) { - LOG(ERROR) << "update failed, code " << error << "\n"; + LOG(ERROR) << "update failed, code " << error; mDevice = nullptr; return false; } output->append(reinterpret_cast(outputBlob.data), outputBlob.data_length); free(const_cast(outputBlob.data)); if (inputConsumed > toRead) { - LOG(ERROR) << "update reported too much input consumed\n"; + LOG(ERROR) << "update reported too much input consumed"; mDevice = nullptr; return false; } @@ -150,7 +150,7 @@ bool KeymasterOperation::finish() { auto error = mDevice->finish(mOpHandle, nullptr, nullptr, nullptr, nullptr); mDevice = nullptr; if (error != KM_ERROR_OK) { - LOG(ERROR) << "finish failed, code " << error << "\n"; + LOG(ERROR) << "finish failed, code " << error; return false; } return true; @@ -161,7 +161,7 @@ bool KeymasterOperation::finishWithOutput(std::string* output) { auto error = mDevice->finish(mOpHandle, nullptr, nullptr, nullptr, &outputBlob); mDevice = nullptr; if (error != KM_ERROR_OK) { - LOG(ERROR) << "finish failed, code " << error << "\n"; + LOG(ERROR) << "finish failed, code " << error; return false; } output->assign(reinterpret_cast(outputBlob.data), outputBlob.data_length); @@ -174,14 +174,14 @@ Keymaster::Keymaster() { const hw_module_t* module; int ret = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &module); if (ret != 0) { - LOG(ERROR) << "hw_get_module_by_class returned " << ret << "\n"; + LOG(ERROR) << "hw_get_module_by_class returned " << ret; return; } if (module->module_api_version == KEYMASTER_MODULE_API_VERSION_1_0) { keymaster1_device_t* device; ret = keymaster1_open(module, &device); if (ret != 0) { - LOG(ERROR) << "keymaster1_open returned " << ret << "\n"; + LOG(ERROR) << "keymaster1_open returned " << ret; return; } mDevice = std::make_shared(device); @@ -189,12 +189,12 @@ Keymaster::Keymaster() { keymaster2_device_t* device; ret = keymaster2_open(module, &device); if (ret != 0) { - LOG(ERROR) << "keymaster2_open returned " << ret << "\n"; + LOG(ERROR) << "keymaster2_open returned " << ret; return; } mDevice = std::make_shared(device); } else { - LOG(ERROR) << "module_api_version is " << module->module_api_version << "\n"; + LOG(ERROR) << "module_api_version is " << module->module_api_version; return; } } @@ -203,7 +203,7 @@ Keymaster::Keymaster() { keymaster_key_blob_t keyBlob; auto error = mDevice->generate_key(&inParams, &keyBlob); if (error != KM_ERROR_OK) { - LOG(ERROR) << "generate_key failed, code " << error << "\n"; + LOG(ERROR) << "generate_key failed, code " << error; return false; } key->assign(reinterpret_cast(keyBlob.key_material), keyBlob.key_material_size); @@ -215,7 +215,7 @@ bool Keymaster::deleteKey(const std::string& key) { keymaster_key_blob_t keyBlob{reinterpret_cast(key.data()), key.size()}; auto error = mDevice->delete_key(&keyBlob); if (error != KM_ERROR_OK) { - LOG(ERROR) << "delete_key failed, code " << error << "\n"; + LOG(ERROR) << "delete_key failed, code " << error; return false; } return true; @@ -229,7 +229,7 @@ KeymasterOperation Keymaster::begin(keymaster_purpose_t purpose, const std::stri keymaster_key_param_set_t outParams_set; auto error = mDevice->begin(purpose, &keyBlob, &inParams, &outParams_set, &mOpHandle); if (error != KM_ERROR_OK) { - LOG(ERROR) << "begin failed, code " << error << "\n"; + LOG(ERROR) << "begin failed, code " << error; return KeymasterOperation(nullptr, mOpHandle); } outParams->Clear(); @@ -244,7 +244,7 @@ KeymasterOperation Keymaster::begin(keymaster_purpose_t purpose, const std::stri keymaster_operation_handle_t mOpHandle; auto error = mDevice->begin(purpose, &keyBlob, &inParams, nullptr, &mOpHandle); if (error != KM_ERROR_OK) { - LOG(ERROR) << "begin failed, code " << error << "\n"; + LOG(ERROR) << "begin failed, code " << error; return KeymasterOperation(nullptr, mOpHandle); } return KeymasterOperation(mDevice, mOpHandle); diff --git a/crypto/ext4crypt/Keymaster3.cpp b/crypto/ext4crypt/Keymaster3.cpp index f8774f24..7862044e 100644 --- a/crypto/ext4crypt/Keymaster3.cpp +++ b/crypto/ext4crypt/Keymaster3.cpp @@ -56,17 +56,17 @@ bool KeymasterOperation::updateCompletely(const std::string& input, std::string* auto inputBlob = blob2hidlVec(reinterpret_cast(&*it), toRead); auto error = mDevice->update(mOpHandle, hidl_vec(), inputBlob, hidlCB); if (!error.isOk()) { - LOG(ERROR) << "update failed: " << error.description() << "\n"; + LOG(ERROR) << "update failed: " << error.description(); mDevice = nullptr; return false; } if (km_error != ErrorCode::OK) { - LOG(ERROR) << "update failed, code " << int32_t(km_error) << "\n"; + LOG(ERROR) << "update failed, code " << int32_t(km_error); mDevice = nullptr; return false; } if (inputConsumed > toRead) { - LOG(ERROR) << "update reported too much input consumed\n"; + LOG(ERROR) << "update reported too much input consumed"; mDevice = nullptr; return false; } @@ -88,11 +88,11 @@ bool KeymasterOperation::finish(std::string* output) { hidl_vec(), hidlCb); mDevice = nullptr; if (!error.isOk()) { - LOG(ERROR) << "finish failed: " << error.description() << "\n"; + LOG(ERROR) << "finish failed: " << error.description(); return false; } if (km_error != ErrorCode::OK) { - LOG(ERROR) << "finish failed, code " << int32_t(km_error) << "\n"; + LOG(ERROR) << "finish failed, code " << int32_t(km_error); return false; } return true; @@ -114,27 +114,27 @@ Keymaster::Keymaster() { auto error = mDevice->generateKey(inParams.hidl_data(), hidlCb); if (!error.isOk()) { - LOG(ERROR) << "generate_key failed: " << error.description() << "\n"; + LOG(ERROR) << "generate_key failed: " << error.description(); return false; } if (km_error != ErrorCode::OK) { - LOG(ERROR) << "generate_key failed, code " << int32_t(km_error) << "\n"; + LOG(ERROR) << "generate_key failed, code " << int32_t(km_error); return false; } return true; }*/ bool Keymaster::deleteKey(const std::string& key) { - LOG(ERROR) << "NOT deleting key in TWRP\n"; + LOG(ERROR) << "NOT deleting key in TWRP"; return false; /*auto keyBlob = blob2hidlVec(key); auto error = mDevice->deleteKey(keyBlob); if (!error.isOk()) { - LOG(ERROR) << "delete_key failed: " << error.description() << "\n"; + LOG(ERROR) << "delete_key failed: " << error.description(); return false; } if (ErrorCode(error) != ErrorCode::OK) { - LOG(ERROR) << "delete_key failed, code " << uint32_t(ErrorCode(error)) << "\n"; + LOG(ERROR) << "delete_key failed, code " << uint32_t(ErrorCode(error)); return false; } return true;*/ @@ -153,11 +153,11 @@ bool Keymaster::upgradeKey(const std::string& oldKey, const AuthorizationSet& in }; auto error = mDevice->upgradeKey(oldKeyBlob, inParams.hidl_data(), hidlCb); if (!error.isOk()) { - LOG(ERROR) << "upgrade_key failed: " << error.description() << "\n"; + LOG(ERROR) << "upgrade_key failed: " << error.description(); return false; } if (km_error != ErrorCode::OK) { - LOG(ERROR) << "upgrade_key failed, code " << int32_t(km_error) << "\n"; + LOG(ERROR) << "upgrade_key failed, code " << int32_t(km_error); return false; } return true; @@ -181,11 +181,11 @@ KeymasterOperation Keymaster::begin(KeyPurpose purpose, const std::string& key, auto error = mDevice->begin(purpose, keyBlob, inParams.hidl_data(), hidlCb); if (!error.isOk()) { - LOG(ERROR) << "begin failed: " << error.description() << "\n"; + LOG(ERROR) << "begin failed: " << error.description(); return KeymasterOperation(ErrorCode::UNKNOWN_ERROR); } if (km_error != ErrorCode::OK) { - LOG(ERROR) << "begin failed, code " << int32_t(km_error) << "\n"; + LOG(ERROR) << "begin failed, code " << int32_t(km_error); return KeymasterOperation(km_error); } return KeymasterOperation(mDevice, mOpHandle); @@ -207,7 +207,7 @@ using namespace ::android::vold; int keymaster_compatibility_cryptfs_scrypt() { Keymaster dev; if (!dev) { - LOG(ERROR) << "Failed to initiate keymaster session\n"; + LOG(ERROR) << "Failed to initiate keymaster session"; return -1; } return dev.isSecure(); @@ -224,11 +224,11 @@ int keymaster_compatibility_cryptfs_scrypt() { Keymaster dev; std::string key; if (!dev) { - LOG(ERROR) << "Failed to initiate keymaster session\n"; + LOG(ERROR) << "Failed to initiate keymaster session"; return -1; } if (!key_buffer || !key_out_size) { - LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument\n"; + LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument"; return -1; } if (key_out_size) { @@ -276,11 +276,11 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob, { Keymaster dev; if (!dev) { - LOG(ERROR) << "Failed to initiate keymaster session\n"; + LOG(ERROR) << "Failed to initiate keymaster session"; return -1; } if (!key_blob || !object || !signature_buffer || !signature_buffer_size) { - LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument\n"; + LOG(ERROR) << __FILE__ << ":" << __LINE__ << ":Invalid argument"; return -1; } @@ -303,7 +303,7 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob, std::string newKey; bool ret = dev.upgradeKey(key, paramBuilder, &newKey); if(ret == false) { - LOG(ERROR) << "Error upgradeKey: \n"; + LOG(ERROR) << "Error upgradeKey: "; return -1; } @@ -312,7 +312,7 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob, } if (key_buffer_size < newKey.size()) { - LOG(ERROR) << "key buffer size is too small\n"; + LOG(ERROR) << "key buffer size is too small"; return -1; } @@ -322,24 +322,24 @@ int keymaster_sign_object_for_cryptfs_scrypt(const uint8_t* key_blob, } if (op.errorCode() != ErrorCode::OK) { - LOG(ERROR) << "Error starting keymaster signature transaction: " << int32_t(op.errorCode()) << "\n"; + LOG(ERROR) << "Error starting keymaster signature transaction: " << int32_t(op.errorCode()); return -1; } if (!op.updateCompletely(input, &output)) { LOG(ERROR) << "Error sending data to keymaster signature transaction: " - << uint32_t(op.errorCode()) << "\n"; + << uint32_t(op.errorCode()); return -1; } if (!op.finish(&output)) { - LOG(ERROR) << "Error finalizing keymaster signature transaction: " << int32_t(op.errorCode()) << "\n"; + LOG(ERROR) << "Error finalizing keymaster signature transaction: " << int32_t(op.errorCode()); return -1; } *signature_buffer = reinterpret_cast(malloc(output.size())); if (*signature_buffer == nullptr) { - LOG(ERROR) << "Error allocation buffer for keymaster signature\n"; + LOG(ERROR) << "Error allocation buffer for keymaster signature"; return -1; } *signature_buffer_size = output.size(); diff --git a/crypto/ext4crypt/ext4_crypt.h b/crypto/ext4crypt/ext4_crypt.h new file mode 100644 index 00000000..d410ccfd --- /dev/null +++ b/crypto/ext4crypt/ext4_crypt.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _EXT4_CRYPT_H_ +#define _EXT4_CRYPT_H_ + +#include +#include +#include + +__BEGIN_DECLS + +bool e4crypt_is_native(); + +int e4crypt_policy_ensure(const char *directory, const char *policy, + size_t policy_length, + const char *contents_encryption_mode, + const char *filenames_encryption_mode); + +static const char* e4crypt_unencrypted_folder = "/unencrypted"; +static const char* e4crypt_key_ref = "/unencrypted/ref"; +static const char* e4crypt_key_mode = "/unencrypted/mode"; + +__END_DECLS + +#endif // _EXT4_CRYPT_H_ diff --git a/crypto/fde/Android.mk b/crypto/fde/Android.mk index aafd7a0b..fcdd5643 100644 --- a/crypto/fde/Android.mk +++ b/crypto/fde/Android.mk @@ -3,7 +3,7 @@ ifeq ($(TW_INCLUDE_CRYPTO), true) include $(CLEAR_VARS) LOCAL_MODULE := libcryptfsfde -LOCAL_MODULE_TAGS := eng optional +LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := cryptfs.cpp LOCAL_SHARED_LIBRARIES := libcrypto libhardware libcutils libstdc++ LOCAL_STATIC_LIBRARIES := libscrypttwrp_static diff --git a/crypto/fde/cryptfs.cpp b/crypto/fde/cryptfs.cpp index 5b8757c5..83522968 100644 --- a/crypto/fde/cryptfs.cpp +++ b/crypto/fde/cryptfs.cpp @@ -256,7 +256,7 @@ static int get_keymaster_hw_fde_passwd(const char* passwd, unsigned char* newpw, if (should_use_keymaster()) { if (scrypt_keymaster(passwd, salt, newpw, (void*)ftr)) { - SLOGE("scrypt failed\n"); + SLOGE("scrypt failed"); } else { rc = 0; } @@ -293,7 +293,7 @@ static int verify_and_update_hw_fde_passwd(const char *passwd, ++crypt_ftr->failed_decrypt_count; if (ascii_passwd_updated) { - SLOGI("Ascii password was updated\n"); + SLOGI("Ascii password was updated"); } else { /* Code in else part would execute only once: * When device is upgraded from L->M release. @@ -305,14 +305,14 @@ static int verify_and_update_hw_fde_passwd(const char *passwd, if (crypt_ftr->crypt_type == CRYPT_TYPE_DEFAULT) { new_passwd = (char*)malloc(strlen(DEFAULT_HEX_PASSWORD) + 1); if (new_passwd == NULL) { - SLOGE("System out of memory. Password verification incomplete\n"); + SLOGE("System out of memory. Password verification incomplete"); goto out; } strlcpy(new_passwd, DEFAULT_HEX_PASSWORD, strlen(DEFAULT_HEX_PASSWORD) + 1); } else { new_passwd = (char*)malloc(strlen(passwd) * 2 + 1); if (new_passwd == NULL) { - SLOGE("System out of memory. Password verification incomplete\n"); + SLOGE("System out of memory. Password verification incomplete"); goto out; } convert_key_to_hex_ascii_for_upgrade((const unsigned char*)passwd, @@ -322,7 +322,7 @@ static int verify_and_update_hw_fde_passwd(const char *passwd, (char*) crypt_ftr->crypto_type_name); if (key_index >=0) { crypt_ftr->failed_decrypt_count = 0; - SLOGI("Hex password verified...will try to update with Ascii value\n"); + SLOGI("Hex password verified...will try to update with Ascii value"); /* Before updating password, tie that with keymaster to tie with ROT */ if (get_keymaster_hw_fde_passwd(passwd, newpw, @@ -336,9 +336,9 @@ static int verify_and_update_hw_fde_passwd(const char *passwd, if (passwd_updated >= 0) { crypt_ftr->flags |= CRYPT_ASCII_PASSWORD_UPDATED; - SLOGI("Ascii password recorded and updated\n"); + SLOGI("Ascii password recorded and updated"); } else { - SLOGI("Passwd verified, could not update...Will try next time\n"); + SLOGI("Passwd verified, could not update...Will try next time"); } } else { ++crypt_ftr->failed_decrypt_count; @@ -412,10 +412,10 @@ static int keymaster_sign_object(struct crypt_mnt_ftr *ftr, // so) because we really should be using a proper deterministic // RSA padding function, such as PKCS1. memcpy(to_sign + 1, object, min((size_t)RSA_KEY_SIZE_BYTES - 1, object_size)); - SLOGI("Signing safely-padded object\n"); + SLOGI("Signing safely-padded object"); break; default: - SLOGE("Unknown KDF type %d\n", ftr->kdf_type); + SLOGE("Unknown KDF type %d", ftr->kdf_type); return -1; } @@ -549,7 +549,7 @@ initfail: return -1; } /*if (put_crypt_ftr_and_key(ftr) != 0) { - SLOGE("Failed to write upgraded key to disk\n"); + SLOGE("Failed to write upgraded key to disk"); }*/ SLOGD("Key upgraded successfully\n"); return 0; @@ -930,8 +930,8 @@ static int load_crypto_mapping_table(struct crypt_mnt_ftr *crypt_ftr, crypt_ftr->crypto_type_name, master_key_ascii, real_blk_name, extra_params); - SLOGI("target_type = %s\n", tgt->target_type); - SLOGI("real_blk_name = %s, extra_params = %s\n", real_blk_name, extra_params); + SLOGI("target_type = %s", tgt->target_type); + SLOGI("real_blk_name = %s, extra_params = %s", real_blk_name, extra_params); #else convert_key_to_hex_ascii(master_key, crypt_ftr->keysize, master_key_ascii); strlcpy(tgt->target_type, "crypt", DM_MAX_TYPE_NAME); @@ -1205,13 +1205,13 @@ static int scrypt_keymaster(const char *passwd, const unsigned char *salt, INTERMEDIATE_BUF_SIZE); if (rc) { - SLOGE("scrypt failed\n"); + SLOGE("scrypt failed"); return -1; } if (keymaster_sign_object(ftr, ikey, INTERMEDIATE_BUF_SIZE, &signature, &signature_size)) { - SLOGE("Keymaster signing failed\n"); + SLOGE("Keymaster signing failed"); return -1; } @@ -1220,7 +1220,7 @@ static int scrypt_keymaster(const char *passwd, const unsigned char *salt, free(signature); if (rc) { - SLOGE("scrypt failed\n"); + SLOGE("scrypt failed"); return -1; } @@ -1242,7 +1242,7 @@ static int decrypt_master_key_aux(const char *passwd, unsigned char *salt, /* Turn the password into an intermediate key and IV that can decrypt the master key */ if (kdf(passwd, salt, ikey, kdf_params)) { - SLOGE("kdf failed\n"); + SLOGE("kdf failed"); return -1; } @@ -1308,7 +1308,7 @@ static int decrypt_master_key(const char *passwd, unsigned char *decrypted_maste decrypted_master_key, kdf, kdf_params, intermediate_key, intermediate_key_size); if (ret != 0) { - SLOGW("failure decrypting master key\n"); + SLOGW("failure decrypting master key"); } return ret; @@ -1332,13 +1332,6 @@ static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, int key_index = 0; if(is_hw_disk_encryption((char*)crypt_ftr->crypto_type_name)) { - if (crypt_ftr->flags & CRYPT_FORCE_COMPLETE) { - if (decrypt_master_key(passwd, decrypted_master_key, crypt_ftr, 0, 0)) { - printf("Failed to decrypt master key\n"); - rc = -1; - goto errout; - } - } key_index = verify_and_update_hw_fde_passwd(passwd, crypt_ftr); if (key_index < 0) { rc = -1; @@ -1349,7 +1342,7 @@ static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, #ifndef CONFIG_HW_DISK_ENCRYPT_PERF if (create_crypto_blk_dev(crypt_ftr, (unsigned char*)&key_index, real_blkdev, crypto_blkdev, label, 0)) { - SLOGE("Error creating decrypted block device\n"); + SLOGE("Error creating decrypted block device"); rc = -1; goto errout; } @@ -1357,7 +1350,7 @@ static int test_mount_hw_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, } else { if (create_crypto_blk_dev(crypt_ftr, decrypted_master_key, real_blkdev, crypto_blkdev, label, 0)) { - SLOGE("Error creating decrypted block device\n"); + SLOGE("Error creating decrypted block device"); rc = -1; goto errout; } @@ -1403,7 +1396,7 @@ static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, //char real_blkdev[MAXPATHLEN]; char tmp_mount_point[64]; unsigned int orig_failed_decrypt_count; - int rc = 0; + int rc; int use_keymaster = 0; unsigned char* intermediate_key = 0; size_t intermediate_key_size = 0; @@ -1446,7 +1439,7 @@ static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, if (rc == 0 && memcmp(scrypted_intermediate_key, crypt_ftr->scrypted_intermediate_key, sizeof(scrypted_intermediate_key)) == 0) { - SLOGI("Password matches\n"); + SLOGI("Password matches"); rc = 0; } else { /* Try mounting the file system anyway, just in case the problem's with @@ -1461,7 +1454,7 @@ static int test_mount_encrypted_fs(struct crypt_mnt_ftr* crypt_ftr, rc = -1; } else { /* Success! */ - SLOGI("Password did not match but decrypted drive mounted - continue\n"); + SLOGI("Password did not match but decrypted drive mounted - continue"); umount(tmp_mount_point); rc = 0; } @@ -1501,7 +1494,7 @@ int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, const unsigned char* key, int keysize, char* out_crypto_blkdev) { int fd = open(real_blkdev, O_RDONLY|O_CLOEXEC); if (fd == -1) { - SLOGE("Failed to open %s: %s\n", real_blkdev, strerror(errno)); + SLOGE("Failed to open %s: %s", real_blkdev, strerror(errno)); return -1; } @@ -1510,7 +1503,7 @@ int cryptfs_setup_ext_volume(const char* label, const char* real_blkdev, close(fd); if (nr_sec == 0) { - SLOGE("Failed to get size of %s: %s\n", real_blkdev, strerror(errno)); + SLOGE("Failed to get size of %s: %s", real_blkdev, strerror(errno)); return -1; } @@ -1542,12 +1535,12 @@ int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) property_get("ro.crypto.state", encrypted_state, ""); if ( master_key_saved || strcmp(encrypted_state, "encrypted") ) { SLOGE("encrypted fs already validated or not running with encryption," - " aborting\n"); + " aborting"); return -1; } if (get_crypt_ftr_and_key(crypt_ftr)) { - SLOGE("Error getting crypt footer and key\n"); + SLOGE("Error getting crypt footer and key"); return -1; } @@ -1558,11 +1551,11 @@ int check_unmounted_and_get_ftr(struct crypt_mnt_ftr* crypt_ftr) int cryptfs_check_passwd_hw(const char* passwd) { struct crypt_mnt_ftr crypt_ftr; - int rc = 0; + int rc; unsigned char master_key[KEY_LEN_BYTES]; /* get key */ if (get_crypt_ftr_and_key(&crypt_ftr)) { - SLOGE("Error getting crypt footer and key\n"); + SLOGE("Error getting crypt footer and key"); return -1; } @@ -1576,7 +1569,7 @@ int cryptfs_check_passwd_hw(const char* passwd) */ rc = cryptfs_get_master_key(&crypt_ftr, passwd, master_key); if (rc) { - SLOGE("password doesn't match\n"); + SLOGE("password doesn't match"); return rc; } @@ -1584,7 +1577,7 @@ int cryptfs_check_passwd_hw(const char* passwd) DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE); if (rc) { - SLOGE("Default password did not match on reboot encryption\n"); + SLOGE("Default password did not match on reboot encryption"); return rc; } } else { @@ -1600,7 +1593,7 @@ int cryptfs_check_passwd_hw(const char* passwd) int cryptfs_check_passwd(const char *passwd) { /*if (e4crypt_is_native()) { - SLOGE("cryptfs_check_passwd not valid for file encryption\n"); + SLOGE("cryptfs_check_passwd not valid for file encryption"); return -1; }*/ @@ -1609,7 +1602,7 @@ int cryptfs_check_passwd(const char *passwd) rc = check_unmounted_and_get_ftr(&crypt_ftr); if (rc) { - SLOGE("Could not get footer\n"); + SLOGE("Could not get footer"); return rc; } @@ -1622,7 +1615,7 @@ int cryptfs_check_passwd(const char *passwd) DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE); if (rc) { - SLOGE("Password did not match\n"); + SLOGE("Password did not match"); return rc; } @@ -1635,7 +1628,7 @@ int cryptfs_check_passwd(const char *passwd) rc = test_mount_encrypted_fs(&crypt_ftr, DEFAULT_PASSWORD, DATA_MNT_POINT, CRYPTO_BLOCK_DEVICE); if (rc) { - SLOGE("Default password did not match on reboot encryption\n"); + SLOGE("Default password did not match on reboot encryption"); return rc; } } @@ -1652,17 +1645,17 @@ int cryptfs_verify_passwd(const char *passwd) property_get("ro.crypto.state", encrypted_state, ""); if (strcmp(encrypted_state, "encrypted") ) { - SLOGE("device not encrypted, aborting\n"); + SLOGE("device not encrypted, aborting"); return -2; } if (!master_key_saved) { - SLOGE("encrypted fs not yet mounted, aborting\n"); + SLOGE("encrypted fs not yet mounted, aborting"); return -1; } if (!saved_mount_point) { - SLOGE("encrypted fs failed to save mount point, aborting\n"); + SLOGE("encrypted fs failed to save mount point, aborting"); return -1; } @@ -1742,7 +1735,7 @@ int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password, &intermediate_key_size); if (rc) { - SLOGE("Can't calculate intermediate key\n"); + SLOGE("Can't calculate intermediate key"); return rc; } @@ -1760,7 +1753,7 @@ int cryptfs_get_master_key(struct crypt_mnt_ftr* ftr, const char* password, free(intermediate_key); if (rc) { - SLOGE("Can't scrypt intermediate key\n"); + SLOGE("Can't scrypt intermediate key"); return rc; } diff --git a/crypto/vold_decrypt/Android.mk b/crypto/vold_decrypt/Android.mk index 860e61f2..8d609119 100644 --- a/crypto/vold_decrypt/Android.mk +++ b/crypto/vold_decrypt/Android.mk @@ -39,7 +39,7 @@ ifeq ($(TW_INCLUDE_CRYPTO), true) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.vold_decrypt.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES # Cannot send to TARGET_RECOVERY_ROOT_OUT since build system wipes init*.rc @@ -75,7 +75,7 @@ ifeq ($(TW_INCLUDE_CRYPTO), true) include $(CLEAR_VARS) LOCAL_MODULE := libvolddecrypt - LOCAL_MODULE_TAGS := eng optional + LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS := -Wall ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_C_INCLUDES += external/stlport/stlport bionic bionic/libstdc++/include @@ -115,7 +115,7 @@ ifeq ($(TW_INCLUDE_CRYPTO), true) include $(CLEAR_VARS) LOCAL_MODULE := vdc_pie LOCAL_SRC_FILES := vdc_pie.cpp - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_CLANG := true diff --git a/etc/Android.mk b/etc/Android.mk index ca549ea2..a59a54c8 100644 --- a/etc/Android.mk +++ b/etc/Android.mk @@ -18,7 +18,7 @@ ifneq ($(TW_EXCLUDE_DEFAULT_USB_INIT), true) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.usb.rc -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES # Cannot send to TARGET_RECOVERY_ROOT_OUT since build system wipes init*.rc @@ -34,7 +34,7 @@ endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 22; echo $$?),0) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.service.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) @@ -43,7 +43,7 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 22; echo $$?),0) else include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.service.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) @@ -54,7 +54,7 @@ endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.hlthchrg.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) @@ -72,7 +72,7 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) else include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.hlthchrg.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT) @@ -85,7 +85,7 @@ ifeq ($(TWRP_INCLUDE_LOGCAT), true) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.logd.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES # Cannot send to TARGET_RECOVERY_ROOT_OUT since build system wipes init*.rc @@ -101,7 +101,7 @@ endif ifeq ($(TW_USE_TOOLBOX), true) include $(CLEAR_VARS) LOCAL_MODULE := init.recovery.mksh.rc - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES # Cannot send to TARGET_RECOVERY_ROOT_OUT since build system wipes init*.rc diff --git a/etc/init.rc b/etc/init.rc old mode 100644 new mode 100755 index c5138aae..b96016ca --- a/etc/init.rc +++ b/etc/init.rc @@ -7,26 +7,11 @@ import /init.recovery.vold_decrypt.rc import /init.recovery.${ro.hardware}.rc on early-init - # Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls. - write /sys/fs/selinux/checkreqprot 0 - - # Set the security context for the init process. - # This should occur before anything else (e.g. ueventd) is started. - setcon u:r:init:s0 - # Set the security context of /postinstall if present. restorecon /postinstall start ueventd -<<<<<<< HEAD -service set_permissive /sbin/permissive.sh - oneshot - seclabel u:r:recovery:s0 -======= - setprop sys.usb.configfs 0 ->>>>>>> android-10.0.0_r25 - on init export PATH /sbin:/system/bin export LD_LIBRARY_PATH /sbin @@ -35,8 +20,6 @@ on init export ANDROID_DATA /data export EXTERNAL_STORAGE /sdcard -<<<<<<< HEAD -======= symlink /proc/self/fd/0 /dev/stdin symlink /proc/self/fd/1 /dev/stdout symlink /proc/self/fd/2 /dev/stderr @@ -44,7 +27,6 @@ on init symlink /system/bin /bin symlink /system/etc /etc ->>>>>>> android-10.0.0_r25 mount cgroup none /acct cpuacct mkdir /acct/uid @@ -61,15 +43,12 @@ on init write /proc/sys/kernel/panic_on_oops 1 write /proc/sys/vm/max_map_count 1000000 -<<<<<<< HEAD on fs mount pstore pstore /sys/fs/pstore mkdir /dev/usb-ffs 0770 shell shell mkdir /dev/usb-ffs/adb 0770 shell shell mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 -======= ->>>>>>> android-10.0.0_r25 on boot ifup lo hostname localhost @@ -116,7 +95,6 @@ on late-init trigger early-boot trigger boot -<<<<<<< HEAD on property:sys.powerctl=* powerctl ${sys.powerctl} @@ -125,37 +103,20 @@ service ueventd /sbin/ueventd seclabel u:r:ueventd:s0 service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery -======= -service ueventd /system/bin/ueventd - critical - seclabel u:r:ueventd:s0 - -service charger /system/bin/charger - critical - seclabel u:r:charger:s0 - -service recovery /system/bin/recovery - socket recovery stream 422 system system - seclabel u:r:recovery:s0 - -service adbd /system/bin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery ->>>>>>> android-10.0.0_r25 disabled socket adbd stream 660 system system seclabel u:r:adbd:s0 -<<<<<<< HEAD # Always start adbd on userdebug and eng builds on property:ro.debuggable=1 #write /sys/class/android_usb/android0/enable 1 #start adbd setprop service.adb.root 1 -======= -service fastbootd /system/bin/fastbootd + +service fastbootd /sbin/fastbootd disabled group system seclabel u:r:fastbootd:s0 ->>>>>>> android-10.0.0_r25 # Restart adbd so it can run as root on property:service.adb.root=1 diff --git a/etc/init.recovery.service22.rc b/etc/init.recovery.service22.rc old mode 100644 new mode 100755 index bb2853c1..438bb3bf --- a/etc/init.recovery.service22.rc +++ b/etc/init.recovery.service22.rc @@ -3,3 +3,6 @@ on boot # For starting recovery on 5.0 and newer service recovery /sbin/recovery seclabel u:r:recovery:s0 + +on early-init + write /sys/fs/selinux/enforce 0 diff --git a/etc/init28.rc b/etc/init28.rc new file mode 100755 index 00000000..0b2a4ef8 --- /dev/null +++ b/etc/init28.rc @@ -0,0 +1,225 @@ +import /init.recovery.logd.rc +import /init.recovery.ldconfig.rc +import /init.recovery.mksh.rc +import /init.recovery.usb.rc +import /init.recovery.service.rc +import /init.recovery.vold_decrypt.rc +import /init.recovery.${ro.hardware}.rc + +on early-init + # Apply strict SELinux checking of PROT_EXEC on mmap/mprotect calls. + write /sys/fs/selinux/checkreqprot 0 + + # Set the security context for the init process. + # This should occur before anything else (e.g. ueventd) is started. + setcon u:r:init:s0 + + # Set the security context of /postinstall if present. + restorecon /postinstall + + start ueventd + +service set_permissive /sbin/permissive.sh + oneshot + seclabel u:r:recovery:s0 + +on init + export PATH /sbin:/system/bin + export LD_LIBRARY_PATH /sbin + + export ANDROID_ROOT /system + export ANDROID_DATA /data + export EXTERNAL_STORAGE /sdcard + + symlink /proc/self/fd/0 /dev/stdin + symlink /proc/self/fd/1 /dev/stdout + symlink /proc/self/fd/2 /dev/stderr + + symlink /system/bin /bin + symlink /system/etc /etc + + mount cgroup none /acct cpuacct + mkdir /acct/uid + + mkdir /system + mkdir /data + mkdir /cache + mkdir /sideload + mkdir /mnt/system + mount tmpfs tmpfs /tmp + + chown root shell /tmp + chmod 0775 /tmp + + write /proc/sys/kernel/panic_on_oops 1 + write /proc/sys/vm/max_map_count 1000000 + +on fs + mount pstore pstore /sys/fs/pstore + mkdir /dev/usb-ffs 0770 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + +on boot + ifup lo + hostname localhost + domainname localdomain + + class_start default + +# Load properties, pre-Android 6.0 +on load_all_props_action + load_all_props + +# Load properties, Android 6.0+ +on load_system_props_action + load_system_props + +# Load properties, Android 6.0+, vendor init lives here +on load_persist_props_action + load_persist_props + +on firmware_mounts_complete + rm /dev/.booting + +# Mount filesystems and start core system services. +on late-init + trigger early-fs + trigger fs + trigger post-fs + trigger post-fs-data + + # Load properties, pre-Android 6.0 + trigger load_all_props_action + + # Load properties from /system/ + /factory after fs mount. Place + # this in another action so that the load will be scheduled after the prior + # issued fs triggers have completed. + trigger load_system_props_action + + # Load properties, Android 6.0+, vendor init lives here + trigger load_persist_props_action + + # Remove a file to wake up anything waiting for firmware + trigger firmware_mounts_complete + + trigger early-boot + trigger boot + +on property:sys.powerctl=* + powerctl ${sys.powerctl} + +service ueventd /sbin/ueventd + critical + seclabel u:r:ueventd:s0 + +service adbd /sbin/adbd --root_seclabel=u:r:su:s0 --device_banner=recovery + disabled + socket adbd stream 660 system system + seclabel u:r:adbd:s0 + +# Always start adbd on userdebug and eng builds +on property:ro.debuggable=1 + #write /sys/class/android_usb/android0/enable 1 + #start adbd + setprop service.adb.root 1 + +service fastbootd /sbin/fastbootd + disabled + group system + seclabel u:r:fastbootd:s0 + +# Restart adbd so it can run as root +on property:service.adb.root=1 + restart adbd + +# Always start adbd on userdebug and eng builds +on fs && property:ro.debuggable=1 + setprop sys.usb.config adb + +on fs && property:sys.usb.configfs=1 + mount configfs none /config + mkdir /config/usb_gadget/g1 0770 shell shell + write /config/usb_gadget/g1/idVendor 0x18D1 + mkdir /config/usb_gadget/g1/strings/0x409 0770 + write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno} + write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer} + write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model} + mkdir /config/usb_gadget/g1/functions/ffs.adb + mkdir /config/usb_gadget/g1/functions/ffs.fastboot + mkdir /config/usb_gadget/g1/configs/b.1 0777 shell shell + mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770 shell shell + +on fs && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/f_ffs/aliases adb,fastboot + write /sys/class/android_usb/android0/idVendor 18D1 + write /sys/class/android_usb/android0/iManufacturer ${ro.product.manufacturer} + write /sys/class/android_usb/android0/iProduct ${ro.product.model} + write /sys/class/android_usb/android0/iSerial ${ro.serialno} + +on fs + mkdir /dev/usb-ffs 0775 shell shell + mkdir /dev/usb-ffs/adb 0770 shell shell + mount functionfs adb /dev/usb-ffs/adb uid=2000,gid=2000 + mkdir /dev/usb-ffs/fastboot 0770 system system + mount functionfs fastboot /dev/usb-ffs/fastboot rmode=0770,fmode=0660,uid=1000,gid=1000 + +on property:sys.usb.config=adb + start adbd + +on property:sys.usb.config=fastboot + start fastbootd + +on property:sys.usb.config=none && property:sys.usb.configfs=0 + stop adbd + stop fastboot + write /sys/class/android_usb/android0/enable 0 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=adb && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/idProduct D001 + write /sys/class/android_usb/android0/functions adb + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=sideload && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/idProduct D001 + write /sys/class/android_usb/android0/functions adb + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=fastboot && property:sys.usb.configfs=0 + write /sys/class/android_usb/android0/idProduct 4EE0 + write /sys/class/android_usb/android0/functions fastboot + write /sys/class/android_usb/android0/enable 1 + setprop sys.usb.state ${sys.usb.config} + +# Configfs triggers +on property:sys.usb.config=none && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/UDC "none" + stop adbd + stop fastbootd + setprop sys.usb.ffs.ready 0 + rm /config/usb_gadget/g1/configs/b.1/f1 + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=sideload && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idProduct 0xD001 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=adb && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idProduct 0xD001 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb" + symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} + +on property:sys.usb.config=fastboot && property:sys.usb.ffs.ready=1 && property:sys.usb.configfs=1 + write /config/usb_gadget/g1/idProduct 0x4EE0 + write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "fastboot" + symlink /config/usb_gadget/g1/functions/ffs.fastboot /config/usb_gadget/g1/configs/b.1/f1 + write /config/usb_gadget/g1/UDC ${sys.usb.controller} + setprop sys.usb.state ${sys.usb.config} diff --git a/fb2png/Android.mk b/fb2png/Android.mk index e82495d5..8d198689 100644 --- a/fb2png/Android.mk +++ b/fb2png/Android.mk @@ -62,7 +62,7 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := fb2png LOCAL_FORCE_STATIC_EXECUTABLE := true -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS += -DANDROID LOCAL_STATIC_LIBRARIES := libfb2png libpng libz libc diff --git a/flashutils/Android.mk b/flashutils/Android.mk index ab552b1e..1c5872ef 100644 --- a/flashutils/Android.mk +++ b/flashutils/Android.mk @@ -81,7 +81,7 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_SRC_FILES := flashutils.c LOCAL_MODULE := libflashutils -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES += $(commands_recovery_local_path) LOCAL_SHARED_LIBRARIES := libc libmtdutils libmmcutils libbmlutils libcrecovery @@ -97,7 +97,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := flash_image -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SRC_FILES := flash_image.c @@ -106,7 +106,7 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE := dump_image -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SRC_FILES := dump_image.c @@ -115,7 +115,7 @@ include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE := erase_image -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SRC_FILES := erase_image.c diff --git a/fuse_sideload/fuse_sideload.cpp b/fuse_sideload/fuse_sideload.cpp index 8fa8ad4e..3d948030 100644 --- a/fuse_sideload/fuse_sideload.cpp +++ b/fuse_sideload/fuse_sideload.cpp @@ -45,9 +45,8 @@ #include #include -#include -#include "fuse.h" -#include +#include // PATH_MAX +#include #include #include #include @@ -58,19 +57,13 @@ #include #include -#ifdef USE_MINCRYPT -#include "mincrypt/sha256.h" -#define SHA256_DIGEST_LENGTH SHA256_DIGEST_SIZE -#else -#include -#endif - #include #include #include -//#include -//#include +#include +#include +#include static constexpr uint64_t PACKAGE_FILE_ID = FUSE_ROOT_ID + 1; static constexpr uint64_t EXIT_FLAG_ID = FUSE_ROOT_ID + 2; @@ -80,12 +73,8 @@ static constexpr int NO_STATUS_EXIT = 2; using SHA256Digest = std::array; -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif - struct fuse_data { - int ffd; // file descriptor for the fuse socket + android::base::unique_fd ffd; // file descriptor for the fuse socket FuseDataProvider* provider; // Provider of the source data. @@ -102,8 +91,8 @@ struct fuse_data { uint8_t* extra_block; // another block of storage for reads that span two blocks - uint8_t* hashes; // SHA-256 hash of each block (all zeros - // if block hasn't been read yet) + std::vector + hashes; // SHA-256 hash of each block (all zeros if block hasn't been read yet) }; static void fuse_reply(const fuse_data* fd, uint64_t unique, const void* data, size_t len) { @@ -162,7 +151,7 @@ static int handle_init(void* data, fuse_data* fd, const fuse_in_header* hdr) { static void fill_attr(fuse_attr* attr, const fuse_data* fd, uint64_t nodeid, uint64_t size, uint32_t mode) { - memset(attr, 0, sizeof(*attr)); + *attr = {}; attr->nlink = 1; attr->uid = fd->uid; attr->gid = fd->gid; @@ -175,8 +164,7 @@ static void fill_attr(fuse_attr* attr, const fuse_data* fd, uint64_t nodeid, uin } static int handle_getattr(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) { - struct fuse_attr_out out; - memset(&out, 0, sizeof(out)); + fuse_attr_out out = {}; out.attr_valid = 10; if (hdr->nodeid == FUSE_ROOT_ID) { @@ -196,8 +184,7 @@ static int handle_getattr(void* /* data */, const fuse_data* fd, const fuse_in_h static int handle_lookup(void* data, const fuse_data* fd, const fuse_in_header* hdr) { if (data == nullptr) return -ENOENT; - struct fuse_entry_out out; - memset(&out, 0, sizeof(out)); + fuse_entry_out out = {}; out.entry_valid = 10; out.attr_valid = 10; @@ -222,8 +209,7 @@ static int handle_open(void* /* data */, const fuse_data* fd, const fuse_in_head if (hdr->nodeid == EXIT_FLAG_ID) return -EPERM; if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT; - struct fuse_open_out out; - memset(&out, 0, sizeof(out)); + fuse_open_out out = {}; out.fh = 10; // an arbitrary number; we always use the same handle fuse_reply(fd, hdr->unique, &out, sizeof(out)); return NO_STATUS; @@ -271,26 +257,22 @@ static int fetch_block(fuse_data* fd, uint32_t block) { // time we've read this block). // - Otherwise, return -EINVAL for the read. - uint8_t hash[SHA256_DIGEST_LENGTH]; -#ifdef USE_MINCRYPT - SHA256_hash(fd->block_data, fd->block_size, hash); -#else - SHA256(fd->block_data, fd->block_size, hash); -#endif - uint8_t* blockhash = fd->hashes + block * SHA256_DIGEST_LENGTH; - if (memcmp(hash, blockhash, SHA256_DIGEST_LENGTH) == 0) { + SHA256Digest hash; + SHA256(fd->block_data, fd->block_size, hash.data()); + + const SHA256Digest& blockhash = fd->hashes[block]; + if (hash == blockhash) { return 0; } - int i; - for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) { - if (blockhash[i] != 0) { + for (uint8_t i : blockhash) { + if (i != 0) { fd->curr_block = -1; return -EIO; } } - memcpy(blockhash, hash, SHA256_DIGEST_LENGTH); + fd->hashes[block] = hash; return 0; } @@ -377,14 +359,8 @@ int run_fuse_sideload(std::unique_ptr&& provider, const char* return -1; } -<<<<<<< HEAD:fuse_sideload.cpp - fuse_data fd; - memset(&fd, 0, sizeof(fd)); - fd.vtab = vtab; -======= fuse_data fd = {}; fd.provider = provider.get(); ->>>>>>> android-10.0.0_r25:fuse_sideload/fuse_sideload.cpp fd.file_size = file_size; fd.block_size = block_size; fd.file_blocks = (file_size == 0) ? 0 : (((file_size - 1) / block_size) + 1); @@ -396,14 +372,8 @@ int run_fuse_sideload(std::unique_ptr&& provider, const char* goto done; } - fd.hashes = (uint8_t*)calloc(fd.file_blocks, SHA256_DIGEST_LENGTH); - if (fd.hashes == NULL) { - fprintf(stderr, "failed to allocate %d bites for hashes\n", - fd.file_blocks * SHA256_DIGEST_LENGTH); - result = -1; - goto done; - } - + // All hashes will be zero-initialized. + fd.hashes.resize(fd.file_blocks); fd.uid = getuid(); fd.gid = getgid(); @@ -421,28 +391,21 @@ int run_fuse_sideload(std::unique_ptr&& provider, const char* goto done; } -<<<<<<< HEAD:fuse_sideload.cpp - fd.ffd = open("/dev/fuse", O_RDWR); - if (!fd.ffd) { -======= fd.ffd.reset(open("/dev/fuse", O_RDWR)); if (fd.ffd == -1) { ->>>>>>> android-10.0.0_r25:fuse_sideload/fuse_sideload.cpp perror("open /dev/fuse"); result = -1; goto done; } { - char opts[256]; - snprintf(opts, sizeof(opts), - ("fd=%d,user_id=%d,group_id=%d,max_read=%u," - "allow_other,rootmode=040000"), - fd.ffd, fd.uid, fd.gid, block_size); + std::string opts = android::base::StringPrintf( + "fd=%d,user_id=%d,group_id=%d,max_read=%u,allow_other,rootmode=040000", fd.ffd.get(), + fd.uid, fd.gid, block_size); - result = mount("/dev/fuse", FUSE_SIDELOAD_HOST_MOUNTPOINT, "fuse", - MS_NOSUID | MS_NODEV | MS_RDONLY | MS_NOEXEC, opts); - if (result < 0) { + result = mount("/dev/fuse", mount_point, "fuse", MS_NOSUID | MS_NODEV | MS_RDONLY | MS_NOEXEC, + opts.c_str()); + if (result == -1) { perror("mount"); goto done; } @@ -530,9 +493,3 @@ done: return result; } - -extern "C" int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie __unused, - uint64_t file_size, uint32_t block_size) -{ - return run_fuse_sideload(vtab, file_size, block_size, FUSE_SIDELOAD_HOST_MOUNTPOINT); -} diff --git a/fuse_sideload/include/fuse_sideload.h b/fuse_sideload/include/fuse_sideload.h index 55bc8f2c..1b7759a7 100644 --- a/fuse_sideload/include/fuse_sideload.h +++ b/fuse_sideload/include/fuse_sideload.h @@ -17,17 +17,9 @@ #ifndef __FUSE_SIDELOAD_H #define __FUSE_SIDELOAD_H -<<<<<<< HEAD:fuse_sideload.h -#ifdef USE_FUSE_SIDELOAD22 -#include "fuse_sideload22.h" -#else - -#include -======= #include #include "fuse_provider.h" ->>>>>>> android-10.0.0_r25:fuse_sideload/include/fuse_sideload.h // Define the filenames created by the sideload FUSE filesystem. static constexpr const char* FUSE_SIDELOAD_HOST_MOUNTPOINT = "/sideload"; @@ -39,15 +31,4 @@ static constexpr const char* FUSE_SIDELOAD_HOST_EXIT_PATHNAME = "/sideload/exit" int run_fuse_sideload(std::unique_ptr&& provider, const char* mount_point = FUSE_SIDELOAD_HOST_MOUNTPOINT); -#ifdef __cplusplus -extern "C" { -#endif -int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie, - uint64_t file_size, uint32_t block_size); -#ifdef __cplusplus -} -#endif - -#endif - #endif diff --git a/fuse_sideload28/fuse_sideload.cpp b/fuse_sideload28/fuse_sideload.cpp new file mode 100644 index 00000000..45c79f90 --- /dev/null +++ b/fuse_sideload28/fuse_sideload.cpp @@ -0,0 +1,525 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// This module creates a special filesystem containing two files. +// +// "/sideload/package.zip" appears to be a normal file, but reading +// from it causes data to be fetched from the adb host. We can use +// this to sideload packages over an adb connection without having to +// store the entire package in RAM on the device. +// +// Because we may not trust the adb host, this filesystem maintains +// the following invariant: each read of a given position returns the +// same data as the first read at that position. That is, once a +// section of the file is read, future reads of that section return +// the same data. (Otherwise, a malicious adb host process could +// return one set of bits when the package is read for signature +// verification, and then different bits for when the package is +// accessed by the installer.) If the adb host returns something +// different than it did on the first read, the reader of the file +// will see their read fail with EINVAL. +// +// The other file, "/sideload/exit", is used to control the subprocess +// that creates this filesystem. Calling stat() on the exit file +// causes the filesystem to be unmounted and the adb process on the +// device shut down. +// +// Note that only the minimal set of file operations needed for these +// two files is implemented. In particular, you can't opendir() or +// readdir() on the "/sideload" directory; ls on it won't work. + +#include "fuse_sideload.h" + +#include +#include +#include +#include "fuse.h" +#include +#include +#include +#include +#include +#include +#include // MIN +#include +#include +#include + +#ifdef USE_MINCRYPT +#include "mincrypt/sha256.h" +#define SHA256_DIGEST_LENGTH SHA256_DIGEST_SIZE +#else +#include +#endif + +#include +#include +#include + +//#include +//#include + +static constexpr uint64_t PACKAGE_FILE_ID = FUSE_ROOT_ID + 1; +static constexpr uint64_t EXIT_FLAG_ID = FUSE_ROOT_ID + 2; + +static constexpr int NO_STATUS = 1; +static constexpr int NO_STATUS_EXIT = 2; + +using SHA256Digest = std::array; + +#ifndef MIN +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +struct fuse_data { + int ffd; // file descriptor for the fuse socket + + provider_vtab vtab; + + uint64_t file_size; // bytes + + uint32_t block_size; // block size that the adb host is using to send the file to us + uint32_t file_blocks; // file size in block_size blocks + + uid_t uid; + gid_t gid; + + uint32_t curr_block; // cache the block most recently read from the host + uint8_t* block_data; + + uint8_t* extra_block; // another block of storage for reads that span two blocks + + uint8_t* hashes; // SHA-256 hash of each block (all zeros + // if block hasn't been read yet) +}; + +static void fuse_reply(const fuse_data* fd, uint64_t unique, const void* data, size_t len) { + fuse_out_header hdr; + hdr.len = len + sizeof(hdr); + hdr.error = 0; + hdr.unique = unique; + + struct iovec vec[2]; + vec[0].iov_base = &hdr; + vec[0].iov_len = sizeof(hdr); + vec[1].iov_base = const_cast(data); + vec[1].iov_len = len; + + int res = writev(fd->ffd, vec, 2); + if (res == -1) { + printf("*** REPLY FAILED *** %s\n", strerror(errno)); + } +} + +static int handle_init(void* data, fuse_data* fd, const fuse_in_header* hdr) { + const fuse_init_in* req = static_cast(data); + + // Kernel 2.6.16 is the first stable kernel with struct fuse_init_out defined (fuse version 7.6). + // The structure is the same from 7.6 through 7.22. Beginning with 7.23, the structure increased + // in size and added new parameters. + if (req->major != FUSE_KERNEL_VERSION || req->minor < 6) { + printf("Fuse kernel version mismatch: Kernel version %d.%d, Expected at least %d.6", req->major, + req->minor, FUSE_KERNEL_VERSION); + return -1; + } + + fuse_init_out out; + out.minor = MIN(req->minor, FUSE_KERNEL_MINOR_VERSION); + size_t fuse_struct_size = sizeof(out); +#if defined(FUSE_COMPAT_22_INIT_OUT_SIZE) + /* FUSE_KERNEL_VERSION >= 23. */ + + // If the kernel only works on minor revs older than or equal to 22, then use the older structure + // size since this code only uses the 7.22 version of the structure. + if (req->minor <= 22) { + fuse_struct_size = FUSE_COMPAT_22_INIT_OUT_SIZE; + } +#endif + + out.major = FUSE_KERNEL_VERSION; + out.max_readahead = req->max_readahead; + out.flags = 0; + out.max_background = 32; + out.congestion_threshold = 32; + out.max_write = 4096; + fuse_reply(fd, hdr->unique, &out, fuse_struct_size); + + return NO_STATUS; +} + +static void fill_attr(fuse_attr* attr, const fuse_data* fd, uint64_t nodeid, uint64_t size, + uint32_t mode) { + memset(attr, 0, sizeof(*attr)); + attr->nlink = 1; + attr->uid = fd->uid; + attr->gid = fd->gid; + attr->blksize = 4096; + + attr->ino = nodeid; + attr->size = size; + attr->blocks = (size == 0) ? 0 : (((size - 1) / attr->blksize) + 1); + attr->mode = mode; +} + +static int handle_getattr(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) { + struct fuse_attr_out out; + memset(&out, 0, sizeof(out)); + out.attr_valid = 10; + + if (hdr->nodeid == FUSE_ROOT_ID) { + fill_attr(&(out.attr), fd, hdr->nodeid, 4096, S_IFDIR | 0555); + } else if (hdr->nodeid == PACKAGE_FILE_ID) { + fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444); + } else if (hdr->nodeid == EXIT_FLAG_ID) { + fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0); + } else { + return -ENOENT; + } + + fuse_reply(fd, hdr->unique, &out, sizeof(out)); + return (hdr->nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS; +} + +static int handle_lookup(void* data, const fuse_data* fd, const fuse_in_header* hdr) { + if (data == nullptr) return -ENOENT; + + struct fuse_entry_out out; + memset(&out, 0, sizeof(out)); + out.entry_valid = 10; + out.attr_valid = 10; + + std::string filename(static_cast(data)); + if (filename == FUSE_SIDELOAD_HOST_FILENAME) { + out.nodeid = PACKAGE_FILE_ID; + out.generation = PACKAGE_FILE_ID; + fill_attr(&(out.attr), fd, PACKAGE_FILE_ID, fd->file_size, S_IFREG | 0444); + } else if (filename == FUSE_SIDELOAD_HOST_EXIT_FLAG) { + out.nodeid = EXIT_FLAG_ID; + out.generation = EXIT_FLAG_ID; + fill_attr(&(out.attr), fd, EXIT_FLAG_ID, 0, S_IFREG | 0); + } else { + return -ENOENT; + } + + fuse_reply(fd, hdr->unique, &out, sizeof(out)); + return (out.nodeid == EXIT_FLAG_ID) ? NO_STATUS_EXIT : NO_STATUS; +} + +static int handle_open(void* /* data */, const fuse_data* fd, const fuse_in_header* hdr) { + if (hdr->nodeid == EXIT_FLAG_ID) return -EPERM; + if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT; + + struct fuse_open_out out; + memset(&out, 0, sizeof(out)); + out.fh = 10; // an arbitrary number; we always use the same handle + fuse_reply(fd, hdr->unique, &out, sizeof(out)); + return NO_STATUS; +} + +static int handle_flush(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) { + return 0; +} + +static int handle_release(void* /* data */, fuse_data* /* fd */, const fuse_in_header* /* hdr */) { + return 0; +} + +// 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) { + if (block == fd->curr_block) { + return 0; + } + + if (block >= fd->file_blocks) { + memset(fd->block_data, 0, fd->block_size); + fd->curr_block = block; + return 0; + } + + size_t fetch_size = fd->block_size; + if (block * fd->block_size + fetch_size > fd->file_size) { + // If we're reading the last (partial) block of the file, expect a shorter response from the + // host, and pad the rest of the block with zeroes. + fetch_size = fd->file_size - (block * fd->block_size); + memset(fd->block_data + fetch_size, 0, fd->block_size - fetch_size); + } + + int result = fd->vtab.read_block(block, fd->block_data, fetch_size); + if (result < 0) return result; + + fd->curr_block = block; + + // Verify the hash of the block we just got from the host. + // + // - If the hash of the just-received data matches the stored hash for the block, accept it. + // - If the stored hash is all zeroes, store the new hash and accept the block (this is the first + // time we've read this block). + // - Otherwise, return -EINVAL for the read. + + uint8_t hash[SHA256_DIGEST_LENGTH]; +#ifdef USE_MINCRYPT + SHA256_hash(fd->block_data, fd->block_size, hash); +#else + SHA256(fd->block_data, fd->block_size, hash); +#endif + uint8_t* blockhash = fd->hashes + block * SHA256_DIGEST_LENGTH; + if (memcmp(hash, blockhash, SHA256_DIGEST_LENGTH) == 0) { + return 0; + } + + int i; + for (i = 0; i < SHA256_DIGEST_LENGTH; ++i) { + if (blockhash[i] != 0) { + fd->curr_block = -1; + return -EIO; + } + } + + memcpy(blockhash, hash, SHA256_DIGEST_LENGTH); + return 0; +} + +static int handle_read(void* data, fuse_data* fd, const fuse_in_header* hdr) { + if (hdr->nodeid != PACKAGE_FILE_ID) return -ENOENT; + + const fuse_read_in* req = static_cast(data); + uint64_t offset = req->offset; + uint32_t size = req->size; + + // The docs on the fuse kernel interface are vague about what to do when a read request extends + // past the end of the file. We can return a short read -- the return structure does include a + // length field -- but in testing that caused the program using the file to segfault. (I + // speculate that this is due to the reading program accessing it via mmap; maybe mmap dislikes + // when you return something short of a whole page?) To fix this we zero-pad reads that extend + // past the end of the file so we're always returning exactly as many bytes as were requested. + // (Users of the mapped file have to know its real length anyway.) + + fuse_out_header outhdr; + outhdr.len = sizeof(outhdr) + size; + outhdr.error = 0; + outhdr.unique = hdr->unique; + + struct iovec vec[3]; + vec[0].iov_base = &outhdr; + vec[0].iov_len = sizeof(outhdr); + + uint32_t block = offset / fd->block_size; + int result = fetch_block(fd, block); + if (result != 0) return result; + + // Two cases: + // + // - the read request is entirely within this block. In this case we can reply immediately. + // + // - the read request goes over into the next block. Note that since we mount the filesystem + // with max_read=block_size, a read can never span more than two blocks. In this case we copy + // the block to extra_block and issue a fetch for the following block. + + uint32_t block_offset = offset - (block * fd->block_size); + + int vec_used; + if (size + block_offset <= fd->block_size) { + // First case: the read fits entirely in the first block. + + vec[1].iov_base = fd->block_data + block_offset; + vec[1].iov_len = size; + vec_used = 2; + } else { + // Second case: the read spills over into the next block. + + memcpy(fd->extra_block, fd->block_data + block_offset, fd->block_size - block_offset); + vec[1].iov_base = fd->extra_block; + vec[1].iov_len = fd->block_size - block_offset; + + result = fetch_block(fd, block + 1); + if (result != 0) return result; + vec[2].iov_base = fd->block_data; + vec[2].iov_len = size - vec[1].iov_len; + vec_used = 3; + } + + if (writev(fd->ffd, vec, vec_used) == -1) { + printf("*** READ REPLY FAILED: %s ***\n", strerror(errno)); + } + return NO_STATUS; +} + +int run_fuse_sideload(const provider_vtab& vtab, uint64_t file_size, uint32_t block_size, + const char* mount_point) { + // If something's already mounted on our mountpoint, try to remove it. (Mostly in case of a + // previous abnormal exit.) + umount2(mount_point, MNT_FORCE); + + // fs/fuse/inode.c in kernel code uses the greater of 4096 and the passed-in max_read. + if (block_size < 4096) { + fprintf(stderr, "block size (%u) is too small\n", block_size); + return -1; + } + if (block_size > (1 << 22)) { // 4 MiB + fprintf(stderr, "block size (%u) is too large\n", block_size); + return -1; + } + + fuse_data fd; + memset(&fd, 0, sizeof(fd)); + fd.vtab = vtab; + fd.file_size = file_size; + fd.block_size = block_size; + fd.file_blocks = (file_size == 0) ? 0 : (((file_size - 1) / block_size) + 1); + + int result; + if (fd.file_blocks > (1 << 18)) { + fprintf(stderr, "file has too many blocks (%u)\n", fd.file_blocks); + result = -1; + goto done; + } + + fd.hashes = (uint8_t*)calloc(fd.file_blocks, SHA256_DIGEST_LENGTH); + if (fd.hashes == NULL) { + fprintf(stderr, "failed to allocate %d bites for hashes\n", + fd.file_blocks * SHA256_DIGEST_LENGTH); + result = -1; + goto done; + } + + fd.uid = getuid(); + fd.gid = getgid(); + + fd.curr_block = -1; + fd.block_data = static_cast(malloc(block_size)); + if (fd.block_data == nullptr) { + fprintf(stderr, "failed to allocate %d bites for block_data\n", block_size); + result = -1; + goto done; + } + fd.extra_block = static_cast(malloc(block_size)); + if (fd.extra_block == nullptr) { + fprintf(stderr, "failed to allocate %d bites for extra_block\n", block_size); + result = -1; + goto done; + } + + fd.ffd = open("/dev/fuse", O_RDWR); + if (!fd.ffd) { + perror("open /dev/fuse"); + result = -1; + goto done; + } + + { + char opts[256]; + snprintf(opts, sizeof(opts), + ("fd=%d,user_id=%d,group_id=%d,max_read=%u," + "allow_other,rootmode=040000"), + fd.ffd, fd.uid, fd.gid, block_size); + + result = mount("/dev/fuse", FUSE_SIDELOAD_HOST_MOUNTPOINT, "fuse", + MS_NOSUID | MS_NODEV | MS_RDONLY | MS_NOEXEC, opts); + if (result < 0) { + perror("mount"); + goto done; + } + } + + uint8_t request_buffer[sizeof(fuse_in_header) + PATH_MAX * 8]; + for (;;) { + ssize_t len = TEMP_FAILURE_RETRY(read(fd.ffd, request_buffer, sizeof(request_buffer))); + if (len == -1) { + perror("read request"); + if (errno == ENODEV) { + result = -1; + break; + } + continue; + } + + if (static_cast(len) < sizeof(fuse_in_header)) { + fprintf(stderr, "request too short: len=%zd\n", len); + continue; + } + + fuse_in_header* hdr = reinterpret_cast(request_buffer); + void* data = request_buffer + sizeof(fuse_in_header); + + result = -ENOSYS; + + switch (hdr->opcode) { + case FUSE_INIT: + result = handle_init(data, &fd, hdr); + break; + + case FUSE_LOOKUP: + result = handle_lookup(data, &fd, hdr); + break; + + case FUSE_GETATTR: + result = handle_getattr(data, &fd, hdr); + break; + + case FUSE_OPEN: + result = handle_open(data, &fd, hdr); + break; + + case FUSE_READ: + result = handle_read(data, &fd, hdr); + break; + + case FUSE_FLUSH: + result = handle_flush(data, &fd, hdr); + break; + + case FUSE_RELEASE: + result = handle_release(data, &fd, hdr); + break; + + default: + fprintf(stderr, "unknown fuse request opcode %d\n", hdr->opcode); + break; + } + + if (result == NO_STATUS_EXIT) { + result = 0; + break; + } + + if (result != NO_STATUS) { + fuse_out_header outhdr; + outhdr.len = sizeof(outhdr); + outhdr.error = result; + outhdr.unique = hdr->unique; + TEMP_FAILURE_RETRY(write(fd.ffd, &outhdr, sizeof(outhdr))); + } + } + +done: + fd.vtab.close(); + + if (umount2(mount_point, MNT_DETACH) == -1) { + fprintf(stderr, "fuse_sideload umount failed: %s\n", strerror(errno)); + } + + free(fd.block_data); + free(fd.extra_block); + + return result; +} + +extern "C" int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie __unused, + uint64_t file_size, uint32_t block_size) +{ + return run_fuse_sideload(vtab, file_size, block_size, FUSE_SIDELOAD_HOST_MOUNTPOINT); +} diff --git a/fuse_sideload28/fuse_sideload.h b/fuse_sideload28/fuse_sideload.h new file mode 100644 index 00000000..1ea1eb8d --- /dev/null +++ b/fuse_sideload28/fuse_sideload.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __FUSE_SIDELOAD_H +#define __FUSE_SIDELOAD_H + +#ifdef USE_FUSE_SIDELOAD22 +#include "fuse_sideload22.h" +#else + +#include + +// Define the filenames created by the sideload FUSE filesystem. +static constexpr const char* FUSE_SIDELOAD_HOST_MOUNTPOINT = "/sideload"; +static constexpr const char* FUSE_SIDELOAD_HOST_FILENAME = "package.zip"; +static constexpr const char* FUSE_SIDELOAD_HOST_PATHNAME = "/sideload/package.zip"; +static constexpr const char* FUSE_SIDELOAD_HOST_EXIT_FLAG = "exit"; +static constexpr const char* FUSE_SIDELOAD_HOST_EXIT_PATHNAME = "/sideload/exit"; + +struct provider_vtab { + // read a block + std::function read_block; + + // close down + std::function close; +}; + +int run_fuse_sideload(const provider_vtab& vtab, uint64_t file_size, uint32_t block_size, + const char* mount_point = FUSE_SIDELOAD_HOST_MOUNTPOINT); + +#ifdef __cplusplus +extern "C" { +#endif +int run_old_fuse_sideload(const struct provider_vtab& vtab, void* cookie, + uint64_t file_size, uint32_t block_size); +#ifdef __cplusplus +} +#endif + +#endif + +#endif diff --git a/gui/Android.mk b/gui/Android.mk old mode 100644 new mode 100755 index 22b53477..9ee54d6a --- a/gui/Android.mk +++ b/gui/Android.mk @@ -1,7 +1,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) -LOCAL_CFLAGS := -fno-strict-aliasing +LOCAL_CFLAGS := -fno-strict-aliasing -Wno-implicit-fallthrough LOCAL_SRC_FILES := \ gui.cpp \ @@ -39,9 +39,21 @@ else endif LOCAL_SHARED_LIBRARIES += libminuitwrp libc libstdc++ libaosprecovery libselinux +LOCAL_C_INCLUDES += $(LOCAL_PATH)/../otautil/include ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - LOCAL_SHARED_LIBRARIES += libziparchive - LOCAL_C_INCLUDES += $(LOCAL_PATH)/../otautil/include + LOCAL_SHARED_LIBRARIES += libziparchive + LOCAL_STATIC_LIBRARIES += libotautil + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28; echo $$?),0) + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../install/include \ + system/core/libziparchive/include/ \ + $(LOCAL_PATH)/../recovery_ui/include \ + $(LOCAL_PATH)/../fuse_sideload/include + LOCAL_CFLAGS += -D_USE_SYSTEM_ZIPARCHIVE + else + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../install28/ \ + $(LOCAL_PATH)/../fuse_sideload28/ + LOCAL_CFLAGS += -DUSE_28_INSTALL -DUSE_OTAUTIL_ZIPARCHIVE + endif else LOCAL_SHARED_LIBRARIES += libminzip LOCAL_CFLAGS += -DUSE_MINZIP @@ -84,7 +96,8 @@ endif LOCAL_C_INCLUDES += \ bionic \ system/core/include \ - system/core/libpixelflinger/include + system/core/libpixelflinger/include \ + external/freetype/include ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) LOCAL_C_INCLUDES += external/stlport/stlport @@ -98,7 +111,7 @@ include $(BUILD_STATIC_LIBRARY) # Transfer in the resources for the device include $(CLEAR_VARS) LOCAL_MODULE := twrp -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)$(TWRES_PATH) diff --git a/gui/action.cpp b/gui/action.cpp index 0216d849..52d924b5 100755 --- a/gui/action.cpp +++ b/gui/action.cpp @@ -40,8 +40,9 @@ #include "../twrp-functions.hpp" #include "../openrecoveryscript.hpp" -#include "../adb_install.h" -#include "../fuse_sideload.h" +#include "install/adb_install.h" + +#include "fuse_sideload.h" #include "blanktimer.hpp" #include "../twinstall.h" @@ -49,14 +50,14 @@ extern "C" { #include "../twcommon.h" #include "../variables.h" #include "cutils/properties.h" -#include "../adb_install.h" +#include "install/adb_install.h" }; -#include "../set_metadata.h" +#include "set_metadata.h" #include "../minuitwrp/minui.h" #include "rapidxml.hpp" #include "objects.hpp" -#include "../tw_atomic.hpp" +#include "tw_atomic.hpp" GUIAction::mapFunc GUIAction::mf; std::set GUIAction::setActionsRunningInCallerThread; @@ -1533,7 +1534,9 @@ int GUIAction::adbsideload(std::string arg __unused) bool mtp_was_enabled = TWFunc::Toggle_MTP(false); // wait for the adb connection - int ret = apply_from_adb("/", &sideload_child_pid); + // int ret = apply_from_adb("/", &sideload_child_pid); + Device::BuiltinAction reboot_action = Device::REBOOT_BOOTLOADER; + int ret = ApplyFromAdb("/", &reboot_action); DataManager::SetValue("tw_has_cancel", 0); // Remove cancel button from gui now that the zip install is going to start if (ret != 0) { diff --git a/gui/gui.cpp b/gui/gui.cpp old mode 100644 new mode 100755 index ce8c3e29..bab7ed21 --- a/gui/gui.cpp +++ b/gui/gui.cpp @@ -50,7 +50,7 @@ extern "C" #include "../openrecoveryscript.hpp" #include "../orscmd/orscmd.h" #include "blanktimer.hpp" -#include "../tw_atomic.hpp" +#include "tw_atomic.hpp" // Enable to print render time of each frame to the log file //#define PRINT_RENDER_TIME 1 diff --git a/gui/input.cpp b/gui/input.cpp old mode 100644 new mode 100755 index 91a1c117..458eb551 --- a/gui/input.cpp +++ b/gui/input.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -41,6 +41,7 @@ extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" #include "rapidxml.hpp" #include "objects.hpp" @@ -215,7 +216,7 @@ void GUIInput::UpdateDisplayText() { displayValue = mValue; } - textWidth = gr_ttf_measureEx(displayValue.c_str(), fontResource); + textWidth = twrpTruetype::gr_ttf_measureEx(displayValue.c_str(), fontResource); } void GUIInput::HandleCursorByTouch(int x) { @@ -239,7 +240,7 @@ void GUIInput::HandleCursorByTouch(int x) { for (index = 0; index <= displaySize; index++) { cursorString = displayValue.substr(0, index); - cursorX = gr_ttf_measureEx(cursorString.c_str(), fontResource) + mRenderX + scrollingX; + cursorX = twrpTruetype::gr_ttf_measureEx(cursorString.c_str(), fontResource) + mRenderX + scrollingX; if (cursorX > x) { if (index > 0 && x <= cursorX - ((x - prevX) / 2) && prevX >= mRenderX) { // This helps make sure that we can place the cursor before the very first char if the first char is @@ -280,7 +281,7 @@ void GUIInput::HandleCursorByText() { if (mCursorLocation != -1) { string cursorDisplay = displayValue; cursorDisplay.resize(mCursorLocation); - cursorTextWidth = gr_ttf_measureEx(cursorDisplay.c_str(), fontResource); + cursorTextWidth = twrpTruetype::gr_ttf_measureEx(cursorDisplay.c_str(), fontResource); } cursorX = mRenderX + cursorTextWidth + scrollingX; if (cursorX >= mRenderX + mRenderW) { diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp index b6a772b0..026984c3 100755 --- a/gui/keyboard.cpp +++ b/gui/keyboard.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -28,6 +28,7 @@ extern "C" { #include "gui.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" #include "rapidxml.hpp" #include "objects.hpp" @@ -333,7 +334,7 @@ void GUIKeyboard::DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH) else if (!labelText.empty() && labelFont && labelFont->GetResource()) { void* fontResource = labelFont->GetResource(); - int textW = gr_ttf_measureEx(labelText.c_str(), fontResource); + int textW = twrpTruetype::gr_ttf_measureEx(labelText.c_str(), fontResource); int textH = labelFont->GetHeight(); int textX = keyX + (keyW - textW) / 2; int textY = keyY + (keyH - textH) / 2; @@ -346,7 +347,7 @@ void GUIKeyboard::DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH) void* fontResource = mLongpressFont->GetResource(); gr_color(mLongpressFontColor.red, mLongpressFontColor.green, mLongpressFontColor.blue, mLongpressFontColor.alpha); string text(1, keychar); - int textW = gr_ttf_measureEx(text.c_str(), fontResource); + int textW = twrpTruetype::gr_ttf_measureEx(text.c_str(), fontResource); int textX = keyX + keyW - longpressOffsetX - textW; int textY = keyY + longpressOffsetY; gr_textEx_scaleW(textX, textY, text.c_str(), fontResource, keyW, TOP_LEFT, 0); diff --git a/gui/pages.cpp b/gui/pages.cpp old mode 100644 new mode 100755 index fd0ad9bf..cc2f6153 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -42,14 +42,18 @@ #ifdef USE_MINZIP #include "../minzip/SysUtil.h" #else +#ifdef USE_OTAUTIL_ZIPARCHIVE #include +#else +#include +#endif #endif extern "C" { #include "../twcommon.h" #include "gui.h" } -#include "../zipwrap.hpp" +#include "zipwrap.hpp" #include "../minuitwrp/minui.h" #include "rapidxml.hpp" diff --git a/gui/pages.hpp b/gui/pages.hpp old mode 100644 new mode 100755 index 282b2d5b..8c5edafe --- a/gui/pages.hpp +++ b/gui/pages.hpp @@ -21,7 +21,7 @@ #ifndef _PAGES_HEADER_HPP #define _PAGES_HEADER_HPP -#include "../zipwrap.hpp" +#include "zipwrap.hpp" #include #include #include diff --git a/gui/resources.cpp b/gui/resources.cpp old mode 100644 new mode 100755 index bb2fd500..5efa0933 --- a/gui/resources.cpp +++ b/gui/resources.cpp @@ -1,5 +1,5 @@ /* - Copyright 2017 TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -30,11 +30,13 @@ #include #include -#include "../zipwrap.hpp" +#include "zipwrap.hpp" extern "C" { #include "../twcommon.h" #include "gui.h" } + +#include "../minuitwrp/truetype.hpp" #include "../minuitwrp/minui.h" #include "rapidxml.hpp" @@ -155,12 +157,12 @@ void FontResource::LoadFont(xml_node<>* node, ZipWrap* pZip) std::string tmpname = "/tmp/" + file; if (ExtractResource(pZip, "fonts", file, "", tmpname) == 0) { - mFont = gr_ttf_loadFont(tmpname.c_str(), font_size, dpi); + mFont = twrpTruetype::gr_ttf_loadFont(tmpname.c_str(), font_size, dpi); } else { file = std::string(TWRES "fonts/") + file; - mFont = gr_ttf_loadFont(file.c_str(), font_size, dpi); + mFont = twrpTruetype::gr_ttf_loadFont(file.c_str(), font_size, dpi); } } else @@ -170,11 +172,13 @@ void FontResource::LoadFont(xml_node<>* node, ZipWrap* pZip) } void FontResource::DeleteFont() { - if (mFont) - gr_ttf_freeFont(mFont); + if (mFont) { + twrpTruetype::gr_ttf_freeFont(mFont); + } mFont = NULL; - if (origFont) - gr_ttf_freeFont(origFont); + if (origFont) { + twrpTruetype::gr_ttf_freeFont(origFont); + } origFont = NULL; } @@ -182,7 +186,7 @@ void FontResource::Override(xml_node<>* node, ZipWrap* pZip) { if (!origFont) { origFont = mFont; } else if (mFont) { - gr_ttf_freeFont(mFont); + twrpTruetype::gr_ttf_freeFont(mFont); mFont = NULL; } LoadFont(node, pZip); diff --git a/gui/resources.hpp b/gui/resources.hpp old mode 100644 new mode 100755 index 69bebc70..e709e330 --- a/gui/resources.hpp +++ b/gui/resources.hpp @@ -1,5 +1,5 @@ /* - Copyright 2017 TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -25,7 +25,8 @@ #include #include #include "rapidxml.hpp" -#include "../zipwrap.hpp" +#include "zipwrap.hpp" +#include "../minuitwrp/truetype.hpp" extern "C" { #include "../minuitwrp/minui.h" @@ -58,7 +59,7 @@ public: public: void* GetResource() { return mFont; } - int GetHeight() { return gr_ttf_getMaxFontHeight(mFont); } + int GetHeight() { return twrpTruetype::gr_ttf_getMaxFontHeight(mFont); } void Override(xml_node<>* node, ZipWrap* pZip); protected: diff --git a/gui/scrolllist.cpp b/gui/scrolllist.cpp index bf5a9b06..0a4eed85 100755 --- a/gui/scrolllist.cpp +++ b/gui/scrolllist.cpp @@ -1,5 +1,5 @@ /* - Copyright 2013 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" #include "rapidxml.hpp" #include "objects.hpp" @@ -633,7 +634,7 @@ bool GUIScrollList::AddLines(std::vector* origText, std::vectorat(i); for (;;) { - size_t line_char_width = gr_ttf_maxExW(curr_line.c_str(), mFont->GetResource(), mRenderW); + size_t line_char_width = twrpTruetype::gr_ttf_maxExW(curr_line.c_str(), mFont->GetResource(), mRenderW); if (line_char_width < curr_line.size()) { //string left = curr_line.substr(0, line_char_width); size_t wrap_pos = curr_line.find_last_of(" ,./:-_;", line_char_width - 1); diff --git a/gui/slidervalue.cpp b/gui/slidervalue.cpp old mode 100644 new mode 100755 index 3aaffcc0..5ed9c4fa --- a/gui/slidervalue.cpp +++ b/gui/slidervalue.cpp @@ -1,5 +1,5 @@ /* - Copyright 2017 TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -39,6 +39,7 @@ extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" #include "rapidxml.hpp" #include "objects.hpp" @@ -270,7 +271,7 @@ int GUISliderValue::measureText(const std::string& str) void* fontResource = NULL; if (mFont) fontResource = mFont->GetResource(); - return gr_ttf_measureEx(str.c_str(), fontResource); + return twrpTruetype::gr_ttf_measureEx(str.c_str(), fontResource); } int GUISliderValue::Render(void) diff --git a/gui/terminal.cpp b/gui/terminal.cpp index a4fed910..e12df5c7 100755 --- a/gui/terminal.cpp +++ b/gui/terminal.cpp @@ -34,6 +34,8 @@ extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" + #include "gui.hpp" #include "rapidxml.hpp" @@ -883,10 +885,10 @@ void GUITerminal::RenderItem(size_t itemindex, int yPos, bool selected __unused) // render cursor int cursorX = engine->getCursorX(); std::string leftOfCursor = line.substr(0, cursorX); - int x = gr_ttf_measureEx(leftOfCursor.c_str(), mFont->GetResource()); + int x = twrpTruetype::gr_ttf_measureEx(leftOfCursor.c_str(), mFont->GetResource()); // note that this single character can be a UTF-8 sequence std::string atCursor = (size_t)cursorX < line.length() ? line.substr(cursorX, 1) : " "; - int w = gr_ttf_measureEx(atCursor.c_str(), mFont->GetResource()); + int w = twrpTruetype::gr_ttf_measureEx(atCursor.c_str(), mFont->GetResource()); gr_color(mFontColor.red, mFontColor.green, mFontColor.blue, mFontColor.alpha); gr_fill(mRenderX + x, yPos, w, actualItemHeight); gr_color(mBackgroundColor.red, mBackgroundColor.green, mBackgroundColor.blue, mBackgroundColor.alpha); @@ -905,7 +907,7 @@ void GUITerminal::InitAndResize() engine->initPty(); // send window resize if (mFont && mFont->GetResource()) { - int charWidth = gr_ttf_measureEx("N", mFont->GetResource()); + int charWidth = twrpTruetype::gr_ttf_measureEx("N", mFont->GetResource()); engine->setSize(mRenderW / charWidth, GetDisplayItemCount(), mRenderW, mRenderH); } } diff --git a/gui/text.cpp b/gui/text.cpp old mode 100644 new mode 100755 index 123b2499..b72dd047 --- a/gui/text.cpp +++ b/gui/text.cpp @@ -1,5 +1,5 @@ /* - Copyright 2012 to 2016 bigbiff/Dees_Troy TeamWin + Copyright 2012 to 2020 TeamWin This file is part of TWRP/TeamWin Recovery Project. TWRP is free software: you can redistribute it and/or modify @@ -39,6 +39,7 @@ extern "C" { #include "../twcommon.h" } #include "../minuitwrp/minui.h" +#include "../minuitwrp/truetype.hpp" #include "rapidxml.hpp" #include "objects.hpp" @@ -159,7 +160,7 @@ int GUIText::GetCurrentBounds(int& w, int& h) h = mFontHeight; mLastValue = gui_parse_text(mText); - w = gr_ttf_measureEx(mLastValue.c_str(), fontResource); + w = twrpTruetype::gr_ttf_measureEx(mLastValue.c_str(), fontResource); return 0; } diff --git a/gui/theme/common/languages/tr.xml b/gui/theme/common/languages/tr.xml index d86d494e..8e924cb5 100644 --- a/gui/theme/common/languages/tr.xml +++ b/gui/theme/common/languages/tr.xml @@ -98,19 +98,16 @@ Başarılı Yükleme Başarısız Yükleme Başarılı - Önbellek/Dalvik Temizle - Dalvik Temizle + Cache/dalvik temizle Sistemi Yeniden Başlat Hedef Bölümü Seç - İmajı Flashlamak için Bölüm Seçin: + İmajı Flashlamak için Bölüm Seç: Hedef Bölüm: İmaj Flashlanıyor... İmaj Flashlandı Önbellek ve Dalvik temizlensin mi? - Dalvik temizlensin mi? Önbellek ve Dalvik temizleniyor... Önbellek ve Dalvik temizliği tamamlandı - Dalvik Temizliği Tamamlandı Temizlemek için Kaydır Temizle İşletim Sistemi yüklü değil! @@ -122,13 +119,9 @@ TWRP Uygulaması yüklensin mi? Resmi TWRP Uygulamasını yüklemek ister misiniz? Uygulama, yeni TWRP sürümlerini kontrol edebilir. - Yüklü değilse TWRP uygulamasını yüklemeyi sor + Yüklü değilse, TWRP uygulamasını yüklemek için sor Sistem Uygulaması olarak yükle Uygulama yükleniyor... - TWRP Uygulamasını Sistemden kaldır - TWRP Uygulaması Sistemden kaldırılsın mı? - TWRP Uygulaması Sistemden kaldırılıyor... - TWRP Uygulamasını Sistemden Kaldırma Tamamlandı TWRP Uygulamasını yüklemek için kaydır Flashlamayı onaylamak için kaydır Eylemi Onayla @@ -137,7 +130,7 @@ Temizle Sıfırla Sıfırla - Veriyi, Önbelleği ve Dalvik'i temizler + Veriyi, Önbelleği, ve Dalvik'i temizler (dahili depolama hariç) Çoğu zaman ihtiyacınız olan tek temizlik budur. @@ -158,10 +151,10 @@ Veriyi Biçimlendir Veriyi Biçimlendir Veriyi biçimlendirmek tüm uygulamalarınızı, - yedeklerinizi, resimlerinizi, videolarınızı, medyanızı temizleyecek ve + yedeklerinizi, resimlerinizi, videolarınızı, medyanızı, temizleyecek ve dahili depolama üzerindeki şifrelemeyi kaldıracak. Kabul Edilen Depolama Dahil - Veriyi biçimlendirmek tüm uygulamalarınızı, yedeklerinizi, resimlerinizi, videolarınızı, medyanızı temizleyecek ve + Veriyi biçimlendirmek tüm uygulamalarınızı, yedeklerinizi, resimlerinizi, videolarınızı, medyanızı, temizleyecek ve dahili depolama üzerindeki şifrelemeyi kaldıracak. Veriyi biçimlendirmek tüm uygulamalarınızı, yedeklerinizi ve medyanızı temizleyecek. Bu işlem geri alınamaz. @@ -218,13 +211,13 @@ ŞİFRELEME Şifreleme: Ad: - Yedeklenecek Bölümleri Seçin: + Yedeklenecek Bölümleri Seç: Depolama: devre dışı - etkinleştirmek için bir şifre ayarlayın etkin Sıkıştırmayı etkinleştir Yedekleme sırasında Digest oluşturmayı geç - Yedeklemeden önce boş alan kontrolünü devre dışı bırak + Yedeklemeden önce boş alan denetimini devre dışı bırak Geçerli Yuva: %tw_active_slot% A Yuvası B Yuvası @@ -235,7 +228,7 @@ Tarih Ekle Bu adda bir yedek zaten var! Yedeklemeniz şifrelensin mi? - Şifreyi Girin: + Şifre Gir: Şifreyi Tekrar Girin: Şifreler eşleşmiyor! Bölümler: @@ -260,7 +253,7 @@ Şifreli Yedek - Çözülmeye Çalışılıyor Çözülmeye Çalışılıyor Yedek tarihi: %tw_restore_file_date% - Geri Yüklenecek Bölümleri Seçin: + Geri Yüklenecek Bölümleri Seç: Yedek Dosyalarının Digest Doğrulamasını etkinleştir Geri Yükleme Tamamlandı Geri Yüklemek için Kaydır @@ -274,7 +267,7 @@ Yeniden Adlandır Onayla Bağla - Bağlanacak Bölümleri Seçin: + Bağlanacak Bölümleri Seç: Sistem bölümünü salt okunur bağla Sistemi RO Bağla Veri Şifresini Çöz @@ -326,11 +319,10 @@ Zaman Dilimi Ekran Ekran Parlaklığı - Bu cihaz için titreşim devre dışı Titreşim Dil Zaman Dilimi - Zaman Dilimi Seçin: + Zaman Dilimi Seç: (UTC -11) Samoa, Midway Adası @@ -382,7 +374,7 @@ Düğme Titreşimi: Klavye Titreşimi: Eylem Titreşimi: - Dil Seçin: + Dil Seç: Dil Seç Dili Ayarla Gelişmiş @@ -432,10 +424,10 @@ Kilidi Açmak için Kaydır Kilidi Aç Dosya Yöneticisi - Bir Dosya veya Klasör Seç + Bir Dosya veya Klasör Seçin Klasör Dosya - Eylem Seç + Eylem Seçin %tw_fm_type% seçili: Kopyala Dosyayı Kopyala @@ -452,7 +444,7 @@ Dosyayı Yeniden Adlandır Klasörü Yeniden Adlandır Yeniden Adlandır - Hedef Klasörü Seç + Hedef Klasörü Seçin Geçerli Klasörü Seç Yeniden Adlandır İzinleri Ayarla @@ -489,28 +481,6 @@ Yükleme Depolama Seç Tamam - Recovery Ramdisk Yükle - Kernel Yükle - Kernel Yükle - Recovery Yükle - Kernel Yüklensin mi? - Recovery Yüklensin mi? - Önce geçerli imajı yedekle - Yeniden paketle - Yüklemek için Kaydır - Yükleniyor... - Yükleme Tamamlandı - İmaj açılırken hata oluştu. - İmajı yeniden paketleme hatası. - {1} açılıyor... - {1} yeniden paketleniyor... - İmaj Seç - Recovery Bootloop'unu Onar - Recovery Bootloop'u Onarılsın mı? - Recovery Bootloop'u Onarılıyor... - Recovery Bootloop'unu Onarma Tamamlandı - Kernel yamalanıyor... - Kernel yamalama hatası. Kernel SELinux içeriklerini okuma desteğine sahip değil. @@ -540,7 +510,7 @@ * Yedekleme Klasörü: {1} Yedekleme klasörü oluşturulamadı. Dosya sistemleri için ortalama yedekleme hızı: {1} MB/sn - İmajlı sürücüler için ortalama yedekleme hızı: {1} MB/sn + Görüntülü sürücüler için ortalama yedekleme hızı: {1} MB/sn [{1} MB YEDEKLENDİ] [YEDEKLEME {1} SANİYEDE TAMAMLANDI] [GERİ YÜKLEME BAŞLATILDI] @@ -548,7 +518,7 @@ [{1} bitti ({2} saniye)] Digest Doğrulanıyor - Kullanıcı ayarına göre Digest kontrolü geçiliyor. + Kullanıcı ayarına göre Digest denetimi geçiliyor. Geri yükleme ayrıntıları hesaplanıyor... {1} geri yüklenemiyor -- salt okunur bağlanmış. Geri yüklemek için \'{1}\' bölümü bulunamıyor. @@ -563,10 +533,9 @@ \'{1}\' yolu için bölüm bulunamıyor Bölüm ayrıntıları güncelleniyor... ...bitti - Dalvik Dizinleri Temizleniyor... + Dalvik Önbelleği Dizinleri Temizleniyor... Temizlendi: {1}... - -- Dalvik Önbelleği Dizinleri Temizleme Tamamlandı! - -- Dalvik Dizinleri Temizleme Tamamlandı! + -- Dalvik Önbelleği Dizinleri Temizleme Tamamlandı! Android secure bölümü yok. {1} bulunamıyor. Dahili depolama temizleniyor -- /data/media... @@ -634,7 +603,7 @@ Yedekleme klasörü '{1}' olarak ayarlandı '{1}' yedeği bulunamadı Geri yükleme seçeneklerini ayarlama: '{1}': - Digest kontrolünü atlama açık + Digest denetimini atlama açık Şifrelenmiş bir yedeklemeyi geri yüklemek için OpenRecoveryScript kullanılamıyor. Bağlanıyor Kaldırılıyor @@ -669,7 +638,7 @@ Zip imzası doğrulama başarısız oldu! Zip imzası başarıyla doğrulandı. Zip dosyası bozuk! - Digest kontrolü geçiliyor: Digest dosyası bulunamadı + Digest denetimi geçiliyor: Digest dosyası bulunamadı Digest eşleşmiyor Digest eşleşti {1} process ended with signal: {2} diff --git a/htcdumlock/Android.mk b/htcdumlock/Android.mk index 242f1244..27b3c34f 100644 --- a/htcdumlock/Android.mk +++ b/htcdumlock/Android.mk @@ -6,8 +6,8 @@ ifeq ($(TW_INCLUDE_DUMLOCK), true) htcdumlock.c LOCAL_CFLAGS:= -g -c -W LOCAL_MODULE:=htcdumlock - LOCAL_MODULE_TAGS:= eng + LOCAL_MODULE_TAGS:= optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin include $(BUILD_EXECUTABLE) -endif \ No newline at end of file +endif diff --git a/injecttwrp/Android.mk b/injecttwrp/Android.mk index 2557523a..d7f79361 100644 --- a/injecttwrp/Android.mk +++ b/injecttwrp/Android.mk @@ -6,7 +6,7 @@ ifeq ($(TW_INCLUDE_INJECTTWRP), true) injecttwrp.c LOCAL_CFLAGS:= -g -c -W LOCAL_MODULE:=injecttwrp - LOCAL_MODULE_TAGS:= eng + LOCAL_MODULE_TAGS:= optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin include $(BUILD_EXECUTABLE) diff --git a/otautil/ZipUtil.cpp b/install/ZipUtil.cpp old mode 100644 new mode 100755 similarity index 99% rename from otautil/ZipUtil.cpp rename to install/ZipUtil.cpp index a2d0cbac..f8134bc4 --- a/otautil/ZipUtil.cpp +++ b/install/ZipUtil.cpp @@ -28,7 +28,7 @@ #include #include -#include "otautil/DirUtil.h" +#include "otautil/dirutil.h" static constexpr mode_t UNZIP_DIRMODE = 0755; static constexpr mode_t UNZIP_FILEMODE = 0644; diff --git a/otautil/ZipUtil.h b/install/ZipUtil.h similarity index 100% rename from otautil/ZipUtil.h rename to install/ZipUtil.h diff --git a/install/adb_install.cpp b/install/adb_install.cpp old mode 100644 new mode 100755 index 9497df50..44a58a06 --- a/install/adb_install.cpp +++ b/install/adb_install.cpp @@ -90,7 +90,7 @@ static bool WriteStatusToFd(MinadbdCommandStatus status, int fd) { // Installs the package from FUSE. Returns the installation result and whether it should continue // waiting for new commands. -static auto AdbInstallPackageHandler(RecoveryUI* ui, int* result) { +static auto AdbInstallPackageHandler(int* result) { // How long (in seconds) we wait for the package path to be ready. It doesn't need to be too long // because the minadbd service has already issued an install command. FUSE_SIDELOAD_HOST_PATHNAME // will start to exist once the host connects and starts serving a package. Poll for its @@ -106,11 +106,11 @@ static auto AdbInstallPackageHandler(RecoveryUI* ui, int* result) { continue; } else { should_continue = false; - ui->Print("\nTimed out waiting for fuse to be ready.\n\n"); + // ui->Print("\nTimed out waiting for fuse to be ready.\n\n"); break; } } - *result = install_package(FUSE_SIDELOAD_HOST_PATHNAME, false, false, 0, ui); + *result = install_package(FUSE_SIDELOAD_HOST_PATHNAME, false, false, 0); break; } @@ -182,7 +182,7 @@ static bool HandleMessageFromMinadbd(int socket_fd, // TODO(xunchang) add a wrapper function and kill the minadbd service there. static void ListenAndExecuteMinadbdCommands( - RecoveryUI* ui, pid_t minadbd_pid, android::base::unique_fd&& socket_fd, + pid_t minadbd_pid, android::base::unique_fd&& socket_fd, const std::map& command_map) { android::base::unique_fd epoll_fd(epoll_create1(O_CLOEXEC)); if (epoll_fd == -1) { @@ -206,8 +206,8 @@ static void ListenAndExecuteMinadbdCommands( constexpr int TIMEOUT_MILLIS = 300 * 1000; while (true) { // Reset the progress bar and the background image before each command. - ui->SetProgressType(RecoveryUI::EMPTY); - ui->SetBackground(RecoveryUI::NO_COMMAND); + // ui->SetProgressType(RecoveryUI::EMPTY); + // ui->SetBackground(RecoveryUI::NO_COMMAND); // Poll for the status change of the socket_fd, and handle the message if the fd is ready to // read. @@ -272,8 +272,8 @@ static void ListenAndExecuteMinadbdCommands( // b11. exit the listening loop // static void CreateMinadbdServiceAndExecuteCommands( - RecoveryUI* ui, const std::map& command_map, - bool rescue_mode) { + const std::map& command_map, + bool rescue_mode, std::string install_file) { signal(SIGPIPE, SIG_IGN); android::base::unique_fd recovery_socket; @@ -291,8 +291,10 @@ static void CreateMinadbdServiceAndExecuteCommands( if (child == 0) { recovery_socket.reset(); std::vector minadbd_commands = { - "/system/bin/minadbd", - "--socket_fd", + "/sbin/recovery", + "recovery", + "--adbd", + install_file, std::to_string(minadbd_socket.release()), }; if (rescue_mode) { @@ -312,7 +314,7 @@ static void CreateMinadbdServiceAndExecuteCommands( return; } - std::thread listener_thread(ListenAndExecuteMinadbdCommands, ui, child, + std::thread listener_thread(ListenAndExecuteMinadbdCommands, child, std::move(recovery_socket), std::ref(command_map)); if (listener_thread.joinable()) { listener_thread.join(); @@ -331,7 +333,9 @@ static void CreateMinadbdServiceAndExecuteCommands( signal(SIGPIPE, SIG_DFL); } -int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot_action) { +// int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot_action) { + int ApplyFromAdb(const char* install_file, Device::BuiltinAction* reboot_action) { + // Save the usb state to restore after the sideload operation. std::string usb_state = android::base::GetProperty("sys.usb.state", "none"); // Clean up state and stop adbd. @@ -340,24 +344,25 @@ int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot return INSTALL_ERROR; } - RecoveryUI* ui = device->GetUI(); + // RecoveryUI* ui = device->GetUI(); int install_result = INSTALL_ERROR; std::map command_map{ - { MinadbdCommand::kInstall, std::bind(&AdbInstallPackageHandler, ui, &install_result) }, - { MinadbdCommand::kRebootAndroid, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootAndroid, + { MinadbdCommand::kInstall, std::bind(&AdbInstallPackageHandler, &install_result) }, + { MinadbdCommand::kRebootAndroid, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootAndroid, + &install_result, reboot_action) }, + { MinadbdCommand::kRebootBootloader, + std::bind(&AdbRebootHandler, MinadbdCommand::kRebootBootloader, &install_result, + reboot_action) }, + { MinadbdCommand::kRebootFastboot, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootFastboot, &install_result, reboot_action) }, - { MinadbdCommand::kRebootBootloader, - std::bind(&AdbRebootHandler, MinadbdCommand::kRebootBootloader, &install_result, - reboot_action) }, - { MinadbdCommand::kRebootFastboot, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootFastboot, - &install_result, reboot_action) }, - { MinadbdCommand::kRebootRecovery, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootRecovery, - &install_result, reboot_action) }, - { MinadbdCommand::kRebootRescue, - std::bind(&AdbRebootHandler, MinadbdCommand::kRebootRescue, &install_result, reboot_action) }, - }; + { MinadbdCommand::kRebootRecovery, std::bind(&AdbRebootHandler, MinadbdCommand::kRebootRecovery, + &install_result, reboot_action) }, + { MinadbdCommand::kRebootRescue, + std::bind(&AdbRebootHandler, MinadbdCommand::kRebootRescue, &install_result, reboot_action) }, +}; +/* if (!rescue_mode) { ui->Print( "\n\nNow send the package you want to apply\n" @@ -371,8 +376,8 @@ int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot ui->Print("\n\nWaiting for rescue commands...\n"); } - - CreateMinadbdServiceAndExecuteCommands(ui, command_map, rescue_mode); +*/ + CreateMinadbdServiceAndExecuteCommands(command_map, false, install_file); // Clean up before switching to the older state, for example setting the state // to none sets sys/class/android_usb/android0/enable to 0. diff --git a/install/fuse_sdcard_install.cpp b/install/fuse_sdcard_install.cpp old mode 100644 new mode 100755 index 1aa8768e..011847bd --- a/install/fuse_sdcard_install.cpp +++ b/install/fuse_sdcard_install.cpp @@ -184,7 +184,7 @@ int ApplyFromSdcard(Device* device, RecoveryUI* ui) { } } - result = install_package(FUSE_SIDELOAD_HOST_PATHNAME, false, false, 0 /*retry_count*/, ui); + result = install_package(FUSE_SIDELOAD_HOST_PATHNAME, false, false, 0 /*retry_count*/); break; } diff --git a/install/include/install/adb_install.h b/install/include/install/adb_install.h old mode 100644 new mode 100755 index 3a0a8174..f7b15b2d --- a/install/include/install/adb_install.h +++ b/install/include/install/adb_install.h @@ -21,4 +21,4 @@ // Applies a package via `adb sideload` or `adb rescue`. Returns the install result (in `enum // InstallResult`). When a reboot has been requested, INSTALL_REBOOT will be the return value, with // the reboot target set in reboot_action. -int ApplyFromAdb(Device* device, bool rescue_mode, Device::BuiltinAction* reboot_action); +int ApplyFromAdb(const char* install_file, Device::BuiltinAction* reboot_action); diff --git a/install/include/install/fuse_sdcard_install.h b/install/include/install/fuse_sdcard_install.h old mode 100644 new mode 100755 index 43f24895..d9214ca3 --- a/install/include/install/fuse_sdcard_install.h +++ b/install/include/install/fuse_sdcard_install.h @@ -16,17 +16,7 @@ #pragma once -<<<<<<< HEAD:adb_install.h -#include - -//class RecoveryUI; - -//static void set_usb_driver(bool enabled); -//static void maybe_restart_adbd(); -int apply_from_adb(const char* install_file, pid_t* child_pid); -======= #include "recovery_ui/device.h" #include "recovery_ui/ui.h" ->>>>>>> android-10.0.0_r25:install/include/install/fuse_sdcard_install.h int ApplyFromSdcard(Device* device, RecoveryUI* ui); diff --git a/install/include/install/install.h b/install/include/install/install.h old mode 100644 new mode 100755 index c0a8f1f4..9e6787f1 --- a/install/include/install/install.h +++ b/install/include/install/install.h @@ -48,11 +48,11 @@ enum class OtaType { // successful installation if |should_wipe_cache| is true or an updater command asks to wipe the // cache. int install_package(const std::string& package, bool should_wipe_cache, bool needs_mount, - int retry_count, RecoveryUI* ui); + int retry_count); // Verifies the package by ota keys. Returns true if the package is verified successfully, // otherwise returns false. -bool verify_package(Package* package, RecoveryUI* ui); +bool verify_package(Package* package); // Reads meta data file of the package; parses each line in the format "key=value"; and writes the // result to |metadata|. Return true if succeed, otherwise return false. diff --git a/install/include/install/package.h b/install/include/install/package.h old mode 100644 new mode 100755 index cd44d10b..50a4ffab --- a/install/include/install/package.h +++ b/install/include/install/package.h @@ -33,9 +33,9 @@ class Package : public VerifierInterface { public: static std::unique_ptr CreateMemoryPackage( - const std::string& path, const std::function& set_progress); + const std::string& path); static std::unique_ptr CreateMemoryPackage( - std::vector content, const std::function& set_progress); + std::vector content); static std::unique_ptr CreateFilePackage(const std::string& path, const std::function& set_progress); diff --git a/install/include/install/wipe_data.h b/install/include/install/wipe_data.h old mode 100644 new mode 100755 index b34891f3..76ebf058 --- a/install/include/install/wipe_data.h +++ b/install/include/install/wipe_data.h @@ -24,7 +24,7 @@ struct selabel_handle; // Returns true on success. -bool WipeCache(RecoveryUI* ui, const std::function& confirm); +bool WipeCache(const std::function& confirm); // Returns true on success. bool WipeData(Device* device, bool convert_fbe); diff --git a/installcommand.h b/install/include/installcommand.h similarity index 100% rename from installcommand.h rename to install/include/installcommand.h diff --git a/legacy_property_service.h b/install/include/legacy_property_service.h similarity index 100% rename from legacy_property_service.h rename to install/include/legacy_property_service.h diff --git a/set_metadata.h b/install/include/set_metadata.h similarity index 100% rename from set_metadata.h rename to install/include/set_metadata.h diff --git a/tw_atomic.hpp b/install/include/tw_atomic.hpp similarity index 100% rename from tw_atomic.hpp rename to install/include/tw_atomic.hpp diff --git a/zipwrap.hpp b/install/include/zipwrap.hpp old mode 100644 new mode 100755 similarity index 95% rename from zipwrap.hpp rename to install/include/zipwrap.hpp index f86e98e4..71021166 --- a/zipwrap.hpp +++ b/install/include/zipwrap.hpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 bigbiff/Dees_Troy TeamWin + * Copyright (C) TeamWin * This file is part of TWRP/TeamWin Recovery Project. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ #include "minzip/SysUtil.h" #else #include -#include "otautil/SysUtil.h" +#include "otautil/sysutil.h" #endif using namespace std; diff --git a/install/install.cpp b/install/install.cpp old mode 100644 new mode 100755 index 0e3cccf1..55d51fcf --- a/install/install.cpp +++ b/install/install.cpp @@ -64,8 +64,8 @@ static constexpr int kRecoveryApiVersion = 3; static_assert(kRecoveryApiVersion == RECOVERY_API_VERSION, "Mismatching recovery API versions."); // Default allocation of progress bar segments to operations -static constexpr int VERIFICATION_PROGRESS_TIME = 60; -static constexpr float VERIFICATION_PROGRESS_FRACTION = 0.25; +// static constexpr int VERIFICATION_PROGRESS_TIME = 60; +// static constexpr float VERIFICATION_PROGRESS_FRACTION = 0.25; static std::condition_variable finish_log_temperature; @@ -157,8 +157,6 @@ static int CheckAbSpecificMetadata(const std::map& met return INSTALL_ERROR; } -<<<<<<< HEAD:install.cpp -======= // Check for downgrade version. int64_t build_timestamp = android::base::GetIntProperty("ro.build.date.utc", std::numeric_limits::max()); @@ -182,7 +180,6 @@ static int CheckAbSpecificMetadata(const std::map& met } } ->>>>>>> android-10.0.0_r25:install/install.cpp return 0; } @@ -330,7 +327,7 @@ static void log_max_temperature(int* max_temperature, const std::atomic& l // If the package contains an update binary, extract it and run it. static int try_update_binary(const std::string& package, ZipArchiveHandle zip, bool* wipe_cache, std::vector* log_buffer, int retry_count, - int* max_temperature, RecoveryUI* ui) { + int* max_temperature) { std::map metadata; if (!ReadMetadataFromPackage(zip, &metadata)) { LOG(ERROR) << "Failed to parse metadata in the zip file"; @@ -442,7 +439,7 @@ static int try_update_binary(const std::string& package, ZipArchiveHandle zip, b int seconds; if (tokens.size() == 2 && android::base::ParseDouble(tokens[0].c_str(), &fraction) && android::base::ParseInt(tokens[1], &seconds)) { - ui->ShowProgress(fraction * (1 - VERIFICATION_PROGRESS_FRACTION), seconds); + // ui->ShowProgress(fraction * (1 - VERIFICATION_PROGRESS_FRACTION), seconds); } else { LOG(ERROR) << "invalid \"progress\" parameters: " << line; } @@ -450,22 +447,22 @@ static int try_update_binary(const std::string& package, ZipArchiveHandle zip, b std::vector tokens = android::base::Split(args, " "); double fraction; if (tokens.size() == 1 && android::base::ParseDouble(tokens[0].c_str(), &fraction)) { - ui->SetProgress(fraction); + // ui->SetProgress(fraction); } else { LOG(ERROR) << "invalid \"set_progress\" parameters: " << line; } } else if (command == "ui_print") { - ui->PrintOnScreenOnly("%s\n", args.c_str()); + // ui->PrintOnScreenOnly("%s\n", args.c_str()); fflush(stdout); } else if (command == "wipe_cache") { *wipe_cache = true; } else if (command == "clear_display") { - ui->SetBackground(RecoveryUI::NONE); + // ui->SetBackground(RecoveryUI::NONE); } else if (command == "enable_reboot") { // packages can explicitly request that they want the user // to be able to reboot during installation (useful for // debugging packages that don't exit). - ui->SetEnableReboot(true); + // ui->SetEnableReboot(true); } else if (command == "retry_update") { retry_update = true; } else if (command == "log") { @@ -576,16 +573,16 @@ bool verify_package_compatibility(ZipArchiveHandle package_zip) { static int really_install_package(const std::string& path, bool* wipe_cache, bool needs_mount, std::vector* log_buffer, int retry_count, - int* max_temperature, RecoveryUI* ui) { - ui->SetBackground(RecoveryUI::INSTALLING_UPDATE); - ui->Print("Finding update package...\n"); + int* max_temperature) { + // ui->SetBackground(RecoveryUI::INSTALLING_UPDATE); + // ui->Print("Finding update package...\n"); // Give verification half the progress bar... - ui->SetProgressType(RecoveryUI::DETERMINATE); - ui->ShowProgress(VERIFICATION_PROGRESS_FRACTION, VERIFICATION_PROGRESS_TIME); + // ui->SetProgressType(RecoveryUI::DETERMINATE); + // ui->ShowProgress(VERIFICATION_PROGRESS_FRACTION, VERIFICATION_PROGRESS_TIME); LOG(INFO) << "Update location: " << path; // Map the update package into memory. - ui->Print("Opening update package...\n"); + // ui->Print("Opening update package...\n"); if (needs_mount) { if (path[0] == '@') { @@ -596,14 +593,14 @@ static int really_install_package(const std::string& path, bool* wipe_cache, boo } auto package = Package::CreateMemoryPackage( - path, std::bind(&RecoveryUI::SetProgress, ui, std::placeholders::_1)); + path); if (!package) { log_buffer->push_back(android::base::StringPrintf("error: %d", kMapFileFailure)); return INSTALL_CORRUPT; } // Verify package. - if (!verify_package(package.get(), ui)) { + if (!verify_package(package.get())) { log_buffer->push_back(android::base::StringPrintf("error: %d", kZipVerificationFailure)); return INSTALL_CORRUPT; } @@ -622,21 +619,21 @@ static int really_install_package(const std::string& path, bool* wipe_cache, boo } // Verify and install the contents of the package. - ui->Print("Installing update...\n"); - if (retry_count > 0) { - ui->Print("Retry attempt: %d\n", retry_count); - } - ui->SetEnableReboot(false); + // ui->Print("Installing update...\n"); + // if (retry_count > 0) { + // ui->Print("Retry attempt: %d\n", retry_count); + // } + // ui->SetEnableReboot(false); int result = - try_update_binary(path, zip, wipe_cache, log_buffer, retry_count, max_temperature, ui); - ui->SetEnableReboot(true); - ui->Print("\n"); + try_update_binary(path, zip, wipe_cache, log_buffer, retry_count, max_temperature); + // ui->SetEnableReboot(true); + // ui->Print("\n"); return result; } int install_package(const std::string& path, bool should_wipe_cache, bool needs_mount, - int retry_count, RecoveryUI* ui) { + int retry_count) { CHECK(!path.empty()); auto start = std::chrono::system_clock::now(); @@ -652,7 +649,7 @@ int install_package(const std::string& path, bool should_wipe_cache, bool needs_ } else { bool updater_wipe_cache = false; result = really_install_package(path, &updater_wipe_cache, needs_mount, &log_buffer, - retry_count, &max_temperature, ui); + retry_count, &max_temperature); should_wipe_cache = should_wipe_cache || updater_wipe_cache; } @@ -709,7 +706,7 @@ int install_package(const std::string& path, bool should_wipe_cache, bool needs_ LOG(INFO) << log_content; if (result == INSTALL_SUCCESS && should_wipe_cache) { - if (!WipeCache(ui, nullptr)) { + if (!WipeCache(nullptr)) { result = INSTALL_ERROR; } } @@ -717,7 +714,7 @@ int install_package(const std::string& path, bool should_wipe_cache, bool needs_ return result; } -bool verify_package(Package* package, RecoveryUI* ui) { +bool verify_package(Package* package) { static constexpr const char* CERTIFICATE_ZIP_FILE = "/system/etc/security/otacerts.zip"; std::vector loaded_keys = LoadKeysFromZipfile(CERTIFICATE_ZIP_FILE); if (loaded_keys.empty()) { @@ -727,11 +724,11 @@ bool verify_package(Package* package, RecoveryUI* ui) { LOG(INFO) << loaded_keys.size() << " key(s) loaded from " << CERTIFICATE_ZIP_FILE; // Verify package. - ui->Print("Verifying update package...\n"); - auto t0 = std::chrono::system_clock::now(); + // ui->Print("Verifying update package...\n"); + // auto t0 = std::chrono::system_clock::now(); int err = verify_file(package, loaded_keys); - std::chrono::duration duration = std::chrono::system_clock::now() - t0; - ui->Print("Update package verification took %.1f s (result %d).\n", duration.count(), err); + // std::chrono::duration duration = std::chrono::system_clock::now() - t0; + // ui->Print("Update package verification took %.1f s (result %d).\n", duration.count(), err); if (err != VERIFY_SUCCESS) { LOG(ERROR) << "Signature verification failed"; LOG(ERROR) << "error: " << kZipVerificationFailure; diff --git a/installcommand.cpp b/install/installcommand.cpp old mode 100644 new mode 100755 similarity index 96% rename from installcommand.cpp rename to install/installcommand.cpp index fa079ea2..f4210568 --- a/installcommand.cpp +++ b/install/installcommand.cpp @@ -37,7 +37,7 @@ #ifdef USE_OLD_VERIFIER #include "verifier24/verifier.h" #else -#include "verifier.h" +#include "install/install.h" #endif #ifdef AB_OTA_UPDATER @@ -124,23 +124,9 @@ static int check_newer_ab_build(ZipWrap* zip) property_get("ro.product.device", value, ""); const std::string& pkg_device = metadata["pre-device"]; - - std::vector assertResults = android::base::Split(pkg_device, ","); - - bool deviceExists = false; - - for(const std::string& deviceAssert : assertResults) - { - std::string assertName = android::base::Trim(deviceAssert); - if (assertName == value && !assertName.empty()) { - deviceExists = true; - break; - } - } - - if (!deviceExists) { + if (pkg_device != value || pkg_device.empty()) { printf("Package is for product %s but expected %s\n", - pkg_device.c_str(), value); + pkg_device.c_str(), value); return INSTALL_ERROR; } diff --git a/legacy_property_service.cpp b/install/legacy_property_service.cpp similarity index 100% rename from legacy_property_service.cpp rename to install/legacy_property_service.cpp diff --git a/install/package.cpp b/install/package.cpp old mode 100644 new mode 100755 index 4402f485..22673cf7 --- a/install/package.cpp +++ b/install/package.cpp @@ -32,11 +32,10 @@ class MemoryPackage : public Package { public: // Constructs the class from a file. We will memory maps the file later. - MemoryPackage(const std::string& path, std::unique_ptr map, - const std::function& set_progress); + MemoryPackage(const std::string& path, std::unique_ptr map); // Constructs the class from the package bytes in |content|. - MemoryPackage(std::vector content, const std::function& set_progress); + MemoryPackage(std::vector content); ~MemoryPackage() override; @@ -102,14 +101,14 @@ class FilePackage : public Package { }; std::unique_ptr Package::CreateMemoryPackage( - const std::string& path, const std::function& set_progress) { + const std::string& path) { std::unique_ptr mmap = std::make_unique(); if (!mmap->MapFile(path)) { LOG(ERROR) << "failed to map file"; return nullptr; } - return std::make_unique(path, std::move(mmap), set_progress); + return std::make_unique(path, std::move(mmap)); } std::unique_ptr Package::CreateFilePackage( @@ -130,25 +129,21 @@ std::unique_ptr Package::CreateFilePackage( } std::unique_ptr Package::CreateMemoryPackage( - std::vector content, const std::function& set_progress) { - return std::make_unique(std::move(content), set_progress); + std::vector content) { + return std::make_unique(std::move(content)); } -MemoryPackage::MemoryPackage(const std::string& path, std::unique_ptr map, - const std::function& set_progress) +MemoryPackage::MemoryPackage(const std::string& path, std::unique_ptr map) : map_(std::move(map)), path_(path), zip_handle_(nullptr) { addr_ = map_->addr; package_size_ = map_->length; - set_progress_ = set_progress; } -MemoryPackage::MemoryPackage(std::vector content, - const std::function& set_progress) +MemoryPackage::MemoryPackage(std::vector content) : package_content_(std::move(content)), zip_handle_(nullptr) { CHECK(!package_content_.empty()); addr_ = package_content_.data(); package_size_ = package_content_.size(); - set_progress_ = set_progress; } MemoryPackage::~MemoryPackage() { diff --git a/set_metadata.cpp b/install/set_metadata.cpp similarity index 100% rename from set_metadata.cpp rename to install/set_metadata.cpp diff --git a/tw_atomic.cpp b/install/tw_atomic.cpp similarity index 100% rename from tw_atomic.cpp rename to install/tw_atomic.cpp diff --git a/install/wipe_data.cpp b/install/wipe_data.cpp old mode 100644 new mode 100755 index 765a8152..b0e44c7c --- a/install/wipe_data.cpp +++ b/install/wipe_data.cpp @@ -36,12 +36,12 @@ constexpr const char* CACHE_ROOT = "/cache"; constexpr const char* DATA_ROOT = "/data"; constexpr const char* METADATA_ROOT = "/metadata"; -static bool EraseVolume(const char* volume, RecoveryUI* ui, bool convert_fbe) { +static bool EraseVolume(const char* volume, bool convert_fbe) { bool is_cache = (strcmp(volume, CACHE_ROOT) == 0); bool is_data = (strcmp(volume, DATA_ROOT) == 0); - ui->SetBackground(RecoveryUI::ERASING); - ui->SetProgressType(RecoveryUI::INDETERMINATE); + // ui->SetBackground(RecoveryUI::ERASING); + // ui->SetProgressType(RecoveryUI::INDETERMINATE); std::vector log_files; if (is_cache) { @@ -50,7 +50,7 @@ static bool EraseVolume(const char* volume, RecoveryUI* ui, bool convert_fbe) { log_files = ReadLogFilesToMemory(); } - ui->Print("Formatting %s...\n", volume); + // ui->Print("Formatting %s...\n", volume); ensure_path_unmounted(volume); @@ -84,10 +84,10 @@ static bool EraseVolume(const char* volume, RecoveryUI* ui, bool convert_fbe) { return (result == 0); } -bool WipeCache(RecoveryUI* ui, const std::function& confirm_func) { +bool WipeCache(const std::function& confirm_func) { bool has_cache = volume_for_mount_point("/cache") != nullptr; if (!has_cache) { - ui->Print("No /cache partition found.\n"); + // ui->Print("No /cache partition found.\n"); return false; } @@ -95,29 +95,29 @@ bool WipeCache(RecoveryUI* ui, const std::function& confirm_func) { return false; } - ui->Print("\n-- Wiping cache...\n"); - bool success = EraseVolume("/cache", ui, false); - ui->Print("Cache wipe %s.\n", success ? "complete" : "failed"); + // ui->Print("\n-- Wiping cache...\n"); + bool success = EraseVolume("/cache", false); + // ui->Print("Cache wipe %s.\n", success ? "complete" : "failed"); return success; } bool WipeData(Device* device, bool convert_fbe) { - RecoveryUI* ui = device->GetUI(); - ui->Print("\n-- Wiping data...\n"); + // RecoveryUI* ui = device->GetUI(); + // ui->Print("\n-- Wiping data...\n"); bool success = device->PreWipeData(); if (success) { - success &= EraseVolume(DATA_ROOT, ui, convert_fbe); + success &= EraseVolume(DATA_ROOT, convert_fbe); bool has_cache = volume_for_mount_point("/cache") != nullptr; if (has_cache) { - success &= EraseVolume(CACHE_ROOT, ui, false); + success &= EraseVolume(CACHE_ROOT, false); } if (volume_for_mount_point(METADATA_ROOT) != nullptr) { - success &= EraseVolume(METADATA_ROOT, ui, false); + success &= EraseVolume(METADATA_ROOT, false); } } if (success) { success &= device->PostWipeData(); } - ui->Print("Data wipe %s.\n", success ? "complete" : "failed"); + // ui->Print("Data wipe %s.\n", success ? "complete" : "failed"); return success; } \ No newline at end of file diff --git a/zipwrap.cpp b/install/zipwrap.cpp old mode 100644 new mode 100755 similarity index 98% rename from zipwrap.cpp rename to install/zipwrap.cpp index 96195402..ddd13dec --- a/zipwrap.cpp +++ b/install/zipwrap.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 bigbiff/Dees_Troy TeamWin + * Copyright (C) TeamWin * This file is part of TWRP/TeamWin Recovery Project. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -27,8 +27,8 @@ #include "minzip/SysUtil.h" #else #include -#include "otautil/ZipUtil.h" -#include "otautil/SysUtil.h" +#include "ZipUtil.h" +#include "otautil/sysutil.h" #endif ZipWrap::ZipWrap() { diff --git a/adb_install.cpp b/install28/adb_install.cpp old mode 100644 new mode 100755 similarity index 97% rename from adb_install.cpp rename to install28/adb_install.cpp index 291708c6..5b576411 --- a/adb_install.cpp +++ b/install28/adb_install.cpp @@ -14,8 +14,6 @@ * limitations under the License. */ -#include "adb_install.h" - #include #include #include @@ -31,15 +29,19 @@ #include #include -#include "ui.h" #include "cutils/properties.h" #include "common.h" -#include "fuse_sideload.h" #ifdef USE_OLD_VERIFIER #include "verifier24/verifier.h" +#include "ui.h" +#elif USE_28_VERIFIER +#include "verifier28/verifier.h" +#include "verifier28/adb_install.h" +#include "verifier28/ui.h" +#include "verifier28/fuse_sideload.h" #else -#include "verifier.h" +#include "install/install.h" #endif static void set_usb_driver(bool enabled) { diff --git a/install28/adb_install.h b/install28/adb_install.h new file mode 100644 index 00000000..97dc83d8 --- /dev/null +++ b/install28/adb_install.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ADB_INSTALL_H +#define _ADB_INSTALL_H + +#include + +//class RecoveryUI; + +//static void set_usb_driver(bool enabled); +//static void maybe_restart_adbd(); +int apply_from_adb(const char* install_file, pid_t* child_pid); + +#endif diff --git a/libcrecovery/Android.mk b/libcrecovery/Android.mk index 8434d519..734e7b16 100644 --- a/libcrecovery/Android.mk +++ b/libcrecovery/Android.mk @@ -5,13 +5,13 @@ ifneq ($(TARGET_SIMULATOR),true) include $(CLEAR_VARS) LOCAL_SRC_FILES := system.c popen.c LOCAL_MODULE := libcrecovery -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_SRC_FILES := system.c popen.c LOCAL_MODULE := libcrecovery -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) endif diff --git a/libpixelflinger/Android.mk b/libpixelflinger/Android.mk index 026e8ad0..439c8359 100644 --- a/libpixelflinger/Android.mk +++ b/libpixelflinger/Android.mk @@ -34,11 +34,11 @@ PIXELFLINGER_SRC_FILES += \ codeflinger/load_store.cpp \ codeflinger/blending.cpp \ codeflinger/texturing.cpp \ - fixed.cpp.arm \ - picker.cpp.arm \ - pixelflinger.cpp.arm \ - trap.cpp.arm \ - scanline.cpp.arm + fixed.cpp \ + picker.cpp \ + pixelflinger.cpp \ + trap.cpp \ + scanline.cpp else PIXELFLINGER_SRC_FILES_x86 := \ codeflinger/x86/X86Assembler.cpp \ @@ -105,6 +105,7 @@ LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include LOCAL_C_INCLUDES += $(LOCAL_EXPORT_C_INCLUDE_DIRS) LOCAL_CFLAGS := $(PIXELFLINGER_CFLAGS) LOCAL_CPPFLAGS := -Wno-unused-function +LOCAL_STATIC_LIBRARIES += libbase libutils libcutils LOCAL_C_INCLUDES_x86 := $(PIXELFLINGER_C_INCLUDES_x86) ifeq ($(TW_HAVE_X86_ACCELERATED_PIXELFLINGER),true) LOCAL_WHOLE_STATIC_LIBRARIES += libenc diff --git a/libtar/Android.mk b/libtar/Android.mk index 90a5006c..6b464f30 100644 --- a/libtar/Android.mk +++ b/libtar/Android.mk @@ -4,7 +4,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtar -LOCAL_MODULE_TAGS := eng optional +LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := append.c block.c decode.c encode.c extract.c handle.c output.c util.c wrapper.c basename.c strmode.c libtar_hash.c libtar_list.c dirname.c android_utils.c LOCAL_C_INCLUDES += $(LOCAL_PATH) \ external/zlib @@ -25,7 +25,7 @@ include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE := libtar_static -LOCAL_MODULE_TAGS := eng optional +LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := append.c block.c decode.c encode.c extract.c handle.c output.c util.c wrapper.c basename.c strmode.c libtar_hash.c libtar_list.c dirname.c android_utils.c LOCAL_C_INCLUDES += $(LOCAL_PATH) \ external/zlib diff --git a/minadbd/Android.mk b/minadbd/Android.mk old mode 100644 new mode 100755 index a50d8444..0d2a8b39 --- a/minadbd/Android.mk +++ b/minadbd/Android.mk @@ -22,19 +22,20 @@ minadbd_cflags := \ # libminadbd (static library) # =============================== include $(CLEAR_VARS) + # ../fuse_sideload.cpp \ LOCAL_SRC_FILES := \ fuse_adb_provider.cpp \ - ../fuse_sideload.cpp \ minadbd.cpp \ minadbd_services.cpp \ LOCAL_MODULE := libminadbd LOCAL_CFLAGS := $(minadbd_cflags) -Wno-unused-parameter LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration +LOCAL_CFLAGS += -std=gnu++2a LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. system/core/adb -LOCAL_WHOLE_STATIC_LIBRARIES := libadbd -LOCAL_SHARED_LIBRARIES := libbase liblog libcutils libc +#LOCAL_WHOLE_STATIC_LIBRARIES := libadbd +LOCAL_SHARED_LIBRARIES := libadbd libbase liblog libcutils libc ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes @@ -49,6 +50,13 @@ else endif endif +ifeq ($shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload28/ +else + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload/include + LOCAL_SHARED_LIBRARIES += libfusesideload +endif + include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) @@ -63,9 +71,16 @@ LOCAL_CLANG := true LOCAL_MODULE := libminadbd LOCAL_CFLAGS := $(minadbd_cflags) -Wno-unused-parameter LOCAL_CONLY_FLAGS := -Wimplicit-function-declaration +LOCAL_CFLAGS += -std=gnu++2a LOCAL_C_INCLUDES := $(LOCAL_PATH)/.. system/core/adb -LOCAL_WHOLE_STATIC_LIBRARIES := libadbd -LOCAL_STATIC_LIBRARIES := libbase liblog libcutils libc +LOCAL_SHARED_LIBRARIES := libadbd libbase liblog libcutils libc +#LOCAL_STATIC_LIBRARIES := libbase liblog libcutils libc + +ifeq ($shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload28/ +else + LOCAL_C_INCLUDES += $(LOCAL_PATH)/../fuse_sideload/include +endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) LOCAL_C_INCLUDES += $(LOCAL_PATH)/libmincrypt/includes @@ -84,19 +99,19 @@ include $(BUILD_STATIC_LIBRARY) # minadbd_test (native test) # =============================== -include $(CLEAR_VARS) +# include $(CLEAR_VARS) -LOCAL_MODULE := minadbd_test -LOCAL_COMPATIBILITY_SUITE := device-tests -LOCAL_SRC_FILES := fuse_adb_provider_test.cpp -LOCAL_CFLAGS := $(minadbd_cflags) -LOCAL_C_INCLUDES := $(LOCAL_PATH) system/core/adb -LOCAL_STATIC_LIBRARIES := \ - libBionicGtestMain \ - libminadbd -LOCAL_SHARED_LIBRARIES := \ - liblog \ - libbase \ - libcutils +# LOCAL_MODULE := minadbd_test +# LOCAL_COMPATIBILITY_SUITE := device-tests +# LOCAL_SRC_FILES := fuse_adb_provider_test.cpp +# LOCAL_CFLAGS := $(minadbd_cflags) +# LOCAL_C_INCLUDES := $(LOCAL_PATH) system/core/adb +# LOCAL_STATIC_LIBRARIES := \ +# libBionicGtestMain \ +# libminadbd +# LOCAL_SHARED_LIBRARIES := \ +# liblog \ +# libbase \ +# libcutils -include $(BUILD_NATIVE_TEST) +# include $(BUILD_NATIVE_TEST) diff --git a/minadbd/fuse_adb_provider.h b/minadbd/fuse_adb_provider.h old mode 100644 new mode 100755 diff --git a/minadbd/minadbd.cpp b/minadbd/minadbd.cpp old mode 100644 new mode 100755 index 388d4143..216dc620 --- a/minadbd/minadbd.cpp +++ b/minadbd/minadbd.cpp @@ -68,13 +68,8 @@ int main(int argc, char** argv) { init_transport_registration(); usb_init(); -<<<<<<< HEAD //VLOG(ADB) << "Event loop starting"; fdevent_loop(); -======= - VLOG(ADB) << "Event loop starting"; - fdevent_loop(); ->>>>>>> android-10.0.0_r25 return 0; } diff --git a/minadbd/minadbd_services.cpp b/minadbd/minadbd_services.cpp old mode 100644 new mode 100755 index c8eae525..5fe3052b --- a/minadbd/minadbd_services.cpp +++ b/minadbd/minadbd_services.cpp @@ -48,42 +48,6 @@ #include "services.h" #include "sysdeps.h" -<<<<<<< HEAD -typedef struct stinfo stinfo; - -struct stinfo { - void (*func)(int fd, void *cookie); - int fd; - void *cookie; -}; - -void service_bootstrap_func(void* x) { - stinfo* sti = reinterpret_cast(x); - sti->func(sti->fd, sti->cookie); - free(sti); -} - -#if PLATFORM_SDK_VERSION < 26 -static void sideload_host_service(int sfd, void* data) { - char* args = reinterpret_cast(data); -#else -static void sideload_host_service(int sfd, const std::string& args) { -#endif - int file_size; - int block_size; -#if PLATFORM_SDK_VERSION < 26 - if (sscanf(args, "%d:%d", &file_size, &block_size) != 2) { - printf("bad sideload-host arguments: %s\n", args); -#else - if (sscanf(args.c_str(), "%d:%d", &file_size, &block_size) != 2) { - printf("bad sideload-host arguments: %s\n", args.c_str()); -#endif - exit(1); - } -#if PLATFORM_SDK_VERSION < 26 - free(args); -#endif -======= static int minadbd_socket = -1; static bool rescue_mode = false; static std::string sideload_mount_point = FUSE_SIDELOAD_HOST_MOUNTPOINT; @@ -174,7 +138,6 @@ static MinadbdErrorCode RunAdbFuseSideload(int sfd, const std::string& args, return kMinadbdHostSocketIOError; } } ->>>>>>> android-10.0.0_r25 return kMinadbdSuccess; } @@ -193,44 +156,6 @@ static void RescueInstallHostService(unique_fd sfd, const std::string& args) { } } -<<<<<<< HEAD -#if PLATFORM_SDK_VERSION < 26 -static int create_service_thread(void (*func)(int, void *), void *cookie) { - int s[2]; - if (adb_socketpair(s)) { - printf("cannot create service socket pair\n"); - return -1; - } - - stinfo* sti = static_cast(malloc(sizeof(stinfo))); - if(sti == 0) fatal("cannot allocate stinfo"); - sti->func = func; - sti->cookie = cookie; - sti->fd = s[1]; - -#if PLATFORM_SDK_VERSION == 23 - adb_thread_t t; - if (adb_thread_create( &t, (adb_thread_func_t)service_bootstrap_func, sti)){ -#else - if (!adb_thread_create(service_bootstrap_func, sti)) { -#endif - free(sti); - adb_close(s[0]); - adb_close(s[1]); - printf("cannot create service thread\n"); - return -1; - } - - //VLOG(SERVICES) << "service thread started, " << s[0] << ":" << s[1]; - return s[0]; -} -#else -static int create_service_thread(void (*func)(int, const std::string&), const std::string& args) { - int s[2]; - if (adb_socketpair(s)) { - printf("cannot create service socket pair\n"); - return -1; -======= // Answers the query on a given property |prop|, by writing the result to the given |sfd|. The // result will be newline-terminated, so nonexistent or nonallowed query will be answered with "\n". // If given an empty string, dumps all the supported properties (analogous to `adb shell getprop`) @@ -255,7 +180,6 @@ static void RescueGetpropHostService(unique_fd sfd, const std::string& prop) { continue; } result += "[" + key + "]: [" + value + "]\n"; ->>>>>>> android-10.0.0_r25 } } else if (kGetpropAllowedProps.find(prop) != kGetpropAllowedProps.end()) { result = android::base::GetProperty(prop, "") + "\n"; @@ -321,41 +245,14 @@ static void WipeDeviceService(unique_fd fd, const std::string& args) { exit(kMinadbdMessageFormatError); } -<<<<<<< HEAD - //VLOG(SERVICES) << "service thread started, " << s[0] << ":" << s[1]; - return s[0]; -======= std::string response = (status == MinadbdCommandStatus::kSuccess) ? kMinadbdServicesExitSuccess : kMinadbdServicesExitFailure; response += std::string(message_size - response.size(), '\0'); if (!android::base::WriteFully(fd, response.c_str(), response.size())) { exit(kMinadbdHostSocketIOError); } ->>>>>>> android-10.0.0_r25 } -#endif -<<<<<<< HEAD -#if PLATFORM_SDK_VERSION >= 28 -int service_to_fd(const char* name, atransport* /* transport */) { -#else -int service_to_fd(const char* name, const atransport* transport __unused) { -#endif - int ret = -1; - - if (!strncmp(name, "sideload:", 9)) { - // this exit status causes recovery to print a special error - // message saying to use a newer adb (that supports - // sideload-host). - exit(3); - } else if (!strncmp(name, "sideload-host:", 14)) { -#if PLATFORM_SDK_VERSION < 26 - char* arg = strdup(name + 14); -#else - std::string arg(name + 14); -#endif - ret = create_service_thread(sideload_host_service, arg); -======= unique_fd daemon_service_to_fd(std::string_view name, atransport* /* transport */) { // Common services that are supported both in sideload and rescue modes. if (ConsumePrefix(&name, "reboot:")) { @@ -389,7 +286,6 @@ unique_fd daemon_service_to_fd(std::string_view name, atransport* /* transport * } return unique_fd{}; ->>>>>>> android-10.0.0_r25 } // Sideload-specific services. diff --git a/minadbd21/Android.mk b/minadbd21/Android.mk index 201c7953..40ed9f71 100644 --- a/minadbd21/Android.mk +++ b/minadbd21/Android.mk @@ -24,7 +24,7 @@ LOCAL_SRC_FILES := \ LOCAL_CFLAGS := -O2 -g -DADB_HOST=0 -Wall -Wno-unused-parameter LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE LOCAL_CFLAGS += -DUSE_FUSE_SIDELOAD22 -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE := libminadbd LOCAL_C_INCLUDES += $(LOCAL_PATH)/../ LOCAL_SHARED_LIBRARIES := libfusesideload libcutils libc diff --git a/minui/Android.mk b/minui/Android.mk old mode 100644 new mode 100755 index 824eec65..5ccdf4fa --- a/minui/Android.mk +++ b/minui/Android.mk @@ -16,145 +16,145 @@ LOCAL_PATH := $(call my-dir) # libminui (static library) # =============================== -include $(CLEAR_VARS) +# include $(CLEAR_VARS) -LOCAL_SRC_FILES := \ - events.cpp \ - graphics.cpp \ - graphics_drm.cpp \ - graphics_fbdev.cpp \ - graphics_overlay.cpp \ - resources.cpp +# LOCAL_SRC_FILES := \ +# events.cpp \ +# graphics.cpp \ +# graphics_drm.cpp \ +# graphics_fbdev.cpp \ +# graphics_overlay.cpp \ +# resources.cpp -LOCAL_C_INCLUDES := external/libcxx/include external/libpng +# LOCAL_C_INCLUDES := external/libcxx/include external/libpng -ifeq ($(TW_TARGET_USES_QCOM_BSP), true) - LOCAL_CFLAGS += -DMSM_BSP - LOCAL_SRC_FILES += graphics_overlay.cpp - ifeq ($(TARGET_PREBUILT_KERNEL),) - ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) - LOCAL_REQUIRED_MODULES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr - else - LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr - endif - LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include - else - ifeq ($(TARGET_CUSTOM_KERNEL_HEADERS),) - LOCAL_C_INCLUDES += $(LOCAL_PATH)/include - else - LOCAL_C_INCLUDES += $(TARGET_CUSTOM_KERNEL_HEADERS) - endif - endif -else - LOCAL_C_INCLUDES += $(LOCAL_PATH)/include - # The header files required for adf graphics can cause compile errors - # with adf graphics. - LOCAL_SRC_FILES += graphics_adf.cpp - LOCAL_WHOLE_STATIC_LIBRARIES += libadf -endif +# ifeq ($(TW_TARGET_USES_QCOM_BSP), true) +# LOCAL_CFLAGS += -DMSM_BSP +# LOCAL_SRC_FILES += graphics_overlay.cpp +# ifeq ($(TARGET_PREBUILT_KERNEL),) +# ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) +# LOCAL_REQUIRED_MODULES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +# else +# LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr +# endif +# LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include +# else +# ifeq ($(TARGET_CUSTOM_KERNEL_HEADERS),) +# LOCAL_C_INCLUDES += $(LOCAL_PATH)/include +# else +# LOCAL_C_INCLUDES += $(TARGET_CUSTOM_KERNEL_HEADERS) +# endif +# endif +# else +# LOCAL_C_INCLUDES += $(LOCAL_PATH)/include +# # The header files required for adf graphics can cause compile errors +# # with adf graphics. +# LOCAL_SRC_FILES += graphics_adf.cpp +# LOCAL_WHOLE_STATIC_LIBRARIES += libadf +# endif -ifeq ($(TW_NEW_ION_HEAP), true) - LOCAL_CFLAGS += -DNEW_ION_HEAP -endif +# ifeq ($(TW_NEW_ION_HEAP), true) +# LOCAL_CFLAGS += -DNEW_ION_HEAP +# endif -LOCAL_STATIC_LIBRARIES += libpng libbase -ifneq ($(wildcard external/libdrm/Android.common.mk),) -LOCAL_WHOLE_STATIC_LIBRARIES += libdrm_platform -else -LOCAL_WHOLE_STATIC_LIBRARIES += libdrm -endif -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - LOCAL_CFLAGS += -DHAS_LIBSYNC - LOCAL_WHOLE_STATIC_LIBRARIES += libsync_recovery -endif +# LOCAL_STATIC_LIBRARIES += libpng libbase +# ifneq ($(wildcard external/libdrm/Android.common.mk),) +# LOCAL_WHOLE_STATIC_LIBRARIES += libdrm_platform +# else +# LOCAL_WHOLE_STATIC_LIBRARIES += libdrm +# endif +# ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) +# LOCAL_CFLAGS += -DHAS_LIBSYNC +# LOCAL_WHOLE_STATIC_LIBRARIES += libsync_recovery +# endif -LOCAL_CFLAGS += -Wall -Werror -std=c++14 -Wno-unused-private-field -LOCAL_C_INCLUDES += $(LOCAL_PATH)/include -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include +# LOCAL_CFLAGS += -Wall -Werror -std=c++14 -Wno-unused-private-field +# LOCAL_C_INCLUDES += $(LOCAL_PATH)/include +# LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -LOCAL_MODULE := libminui +# LOCAL_MODULE := libminui -LOCAL_CLANG := true +# LOCAL_CLANG := true -# This used to compare against values in double-quotes (which are just -# ordinary characters in this context). Strip double-quotes from the -# value so that either will work. +# # This used to compare against values in double-quotes (which are just +# # ordinary characters in this context). Strip double-quotes from the +# # value so that either will work. -ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),ABGR_8888) - LOCAL_CFLAGS += -DRECOVERY_ABGR -endif -ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBA_8888) - LOCAL_CFLAGS += -DRECOVERY_RGBA -endif -ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBX_8888) - LOCAL_CFLAGS += -DRECOVERY_RGBX -endif -ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888) - LOCAL_CFLAGS += -DRECOVERY_BGRA -endif +# ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),ABGR_8888) +# LOCAL_CFLAGS += -DRECOVERY_ABGR +# endif +# ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBA_8888) +# LOCAL_CFLAGS += -DRECOVERY_RGBA +# endif +# ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),RGBX_8888) +# LOCAL_CFLAGS += -DRECOVERY_RGBX +# endif +# ifeq ($(subst ",,$(TARGET_RECOVERY_PIXEL_FORMAT)),BGRA_8888) +# LOCAL_CFLAGS += -DRECOVERY_BGRA +# endif -ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),) - LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT) -else - LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0 -endif +# ifneq ($(TARGET_RECOVERY_OVERSCAN_PERCENT),) +# LOCAL_CFLAGS += -DOVERSCAN_PERCENT=$(TARGET_RECOVERY_OVERSCAN_PERCENT) +# else +# LOCAL_CFLAGS += -DOVERSCAN_PERCENT=0 +# endif -ifneq ($(TW_BRIGHTNESS_PATH),) - LOCAL_CFLAGS += -DTW_BRIGHTNESS_PATH=\"$(TW_BRIGHTNESS_PATH)\" -endif -ifneq ($(TW_MAX_BRIGHTNESS),) - LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=$(TW_MAX_BRIGHTNESS) -else - LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=255 -endif -ifneq ($(TW_NO_SCREEN_BLANK),) - LOCAL_CFLAGS += -DTW_NO_SCREEN_BLANK -endif -ifneq ($(BOARD_USE_CUSTOM_RECOVERY_FONT),) - LOCAL_CFLAGS += -DBOARD_USE_CUSTOM_RECOVERY_FONT=$(BOARD_USE_CUSTOM_RECOVERY_FONT) -endif -ifeq ($(wildcard system/core/healthd/animation.h),) - TARGET_GLOBAL_CFLAGS += -DTW_NO_MINUI_CUSTOM_FONTS - CLANG_TARGET_GLOBAL_CFLAGS += -DTW_NO_MINUI_CUSTOM_FONTS -endif -ifneq ($(TARGET_RECOVERY_DEFAULT_ROTATION),) - LOCAL_CFLAGS += -DDEFAULT_ROTATION=$(TARGET_RECOVERY_DEFAULT_ROTATION) -else - LOCAL_CFLAGS += -DDEFAULT_ROTATION=ROTATION_NONE -endif +# ifneq ($(TW_BRIGHTNESS_PATH),) +# LOCAL_CFLAGS += -DTW_BRIGHTNESS_PATH=\"$(TW_BRIGHTNESS_PATH)\" +# endif +# ifneq ($(TW_MAX_BRIGHTNESS),) +# LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=$(TW_MAX_BRIGHTNESS) +# else +# LOCAL_CFLAGS += -DTW_MAX_BRIGHTNESS=255 +# endif +# ifneq ($(TW_NO_SCREEN_BLANK),) +# LOCAL_CFLAGS += -DTW_NO_SCREEN_BLANK +# endif +# ifneq ($(BOARD_USE_CUSTOM_RECOVERY_FONT),) +# LOCAL_CFLAGS += -DBOARD_USE_CUSTOM_RECOVERY_FONT=$(BOARD_USE_CUSTOM_RECOVERY_FONT) +# endif +# ifeq ($(wildcard system/core/healthd/animation.h),) +# TARGET_GLOBAL_CFLAGS += -DTW_NO_MINUI_CUSTOM_FONTS +# CLANG_TARGET_GLOBAL_CFLAGS += -DTW_NO_MINUI_CUSTOM_FONTS +# endif +# ifneq ($(TARGET_RECOVERY_DEFAULT_ROTATION),) +# LOCAL_CFLAGS += -DDEFAULT_ROTATION=$(TARGET_RECOVERY_DEFAULT_ROTATION) +# else +# LOCAL_CFLAGS += -DDEFAULT_ROTATION=ROTATION_NONE +# endif -include $(BUILD_STATIC_LIBRARY) +# include $(BUILD_STATIC_LIBRARY) # libminui (shared library) # =============================== # Used by OEMs for factory test images. -include $(CLEAR_VARS) -LOCAL_CLANG := true -LOCAL_MODULE := libminui -LOCAL_WHOLE_STATIC_LIBRARIES += libminui -LOCAL_SHARED_LIBRARIES := \ - libpng \ - libbase +# include $(CLEAR_VARS) +# LOCAL_CLANG := true +# LOCAL_MODULE := libminui +# LOCAL_WHOLE_STATIC_LIBRARIES += libminui +# LOCAL_SHARED_LIBRARIES := \ +# libpng \ +# libbase -LOCAL_CFLAGS := -Wall -Werror -std=c++14 -Wno-unused-private-field -LOCAL_C_INCLUDES := $(LOCAL_PATH)/include -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include -include $(BUILD_SHARED_LIBRARY) +# LOCAL_CFLAGS := -Wall -Werror -std=c++14 -Wno-unused-private-field +# LOCAL_C_INCLUDES := $(LOCAL_PATH)/include +# LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include +# include $(BUILD_SHARED_LIBRARY) -include $(CLEAR_VARS) -LOCAL_MODULE := minuitest -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) -LOCAL_SRC_FILES := main.cpp -LOCAL_SHARED_LIBRARIES := libbinder libminui libpng libz libutils libstdc++ libcutils liblog libm libc -LOCAL_C_INCLUDES := external/libcxx/include external/libpng -ifneq ($(TARGET_ARCH), arm64) - ifneq ($(TARGET_ARCH), x86_64) - LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker - else - LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64 - endif -else - LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64 -endif -include $(BUILD_EXECUTABLE) +# include $(CLEAR_VARS) +# LOCAL_MODULE := minuitest +# LOCAL_MODULE_TAGS := optional +# LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT_SBIN) +# LOCAL_SRC_FILES := main.cpp +# LOCAL_SHARED_LIBRARIES := libbinder libminui libpng libz libutils libstdc++ libcutils liblog libm libc +# LOCAL_C_INCLUDES := external/libcxx/include external/libpng +# ifneq ($(TARGET_ARCH), arm64) +# ifneq ($(TARGET_ARCH), x86_64) +# LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker +# else +# LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64 +# endif +# else +# LOCAL_LDFLAGS += -Wl,-dynamic-linker,/sbin/linker64 +# endif +# include $(BUILD_EXECUTABLE) diff --git a/minui/events.cpp b/minui/events.cpp old mode 100644 new mode 100755 index 0b4540bf..f3eaa1e0 --- a/minui/events.cpp +++ b/minui/events.cpp @@ -65,24 +65,10 @@ static bool test_bit(size_t bit, unsigned long* array) { // NOLINT #ifdef TW_USE_MINUI_WITH_OPTIONAL_TOUCH_EVENTS int ev_init(ev_callback input_cb, bool allow_touch_inputs) { -<<<<<<< HEAD -#else -#ifdef TW_USE_MINUI_WITH_DATA -int ev_init(ev_callback input_cb, void* data) { -#else -int ev_init(ev_callback input_cb) { -#endif - bool allow_touch_inputs = false; -#endif - - g_epoll_fd = epoll_create(MAX_DEVICES + MAX_MISC_FDS); - if (g_epoll_fd == -1) { -======= g_epoll_fd.reset(); android::base::unique_fd epoll_fd(epoll_create1(EPOLL_CLOEXEC)); if (epoll_fd == -1) { ->>>>>>> android-10.0.0_r25 return -1; } @@ -114,23 +100,12 @@ int ev_init(ev_callback input_cb) { } } -<<<<<<< HEAD - ev_fdinfo[ev_count].fd = fd; - ev_fdinfo[ev_count].cb = std::move(input_cb); -#ifdef TW_USE_MINUI_WITH_DATA - ev_fdinfo[ev_count].data = data; -#endif - ev_count++; - ev_dev_count++; - if (ev_dev_count == MAX_DEVICES) break; -======= epoll_event ev; ev.events = EPOLLIN | EPOLLWAKEUP; ev.data.ptr = &ev_fdinfo[g_ev_count]; if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev) == -1) { epoll_ctl_failed = true; continue; ->>>>>>> android-10.0.0_r25 } ev_fdinfo[g_ev_count].fd.reset(fd.release()); @@ -152,17 +127,8 @@ int ev_get_epollfd(void) { return g_epoll_fd.get(); } -<<<<<<< HEAD -#ifdef TW_USE_MINUI_WITH_DATA -int ev_add_fd(int fd, ev_callback cb, void* data) { -#else -int ev_add_fd(int fd, ev_callback cb) { -#endif - if (ev_misc_count == MAX_MISC_FDS || cb == NULL) { -======= int ev_add_fd(android::base::unique_fd&& fd, ev_callback cb) { if (g_ev_misc_count == MAX_MISC_FDS || cb == nullptr) { ->>>>>>> android-10.0.0_r25 return -1; } @@ -171,20 +137,10 @@ int ev_add_fd(android::base::unique_fd&& fd, ev_callback cb) { ev.data.ptr = static_cast(&ev_fdinfo[g_ev_count]); int ret = epoll_ctl(g_epoll_fd, EPOLL_CTL_ADD, fd, &ev); if (!ret) { -<<<<<<< HEAD - ev_fdinfo[ev_count].fd = fd; - ev_fdinfo[ev_count].cb = std::move(cb); -#ifdef TW_USE_MINUI_WITH_DATA - ev_fdinfo[ev_count].data = data; -#endif - ev_count++; - ev_misc_count++; -======= ev_fdinfo[g_ev_count].fd.reset(fd.release()); ev_fdinfo[g_ev_count].cb = std::move(cb); g_ev_count++; g_ev_misc_count++; ->>>>>>> android-10.0.0_r25 } return ret; @@ -212,15 +168,7 @@ void ev_dispatch(void) { FdInfo* fdi = static_cast(g_polled_events[n].data.ptr); const ev_callback& cb = fdi->cb; if (cb) { -<<<<<<< HEAD -#ifdef TW_USE_MINUI_WITH_DATA - cb(fdi->fd, polledevents[n].events, fdi->data); -#else - cb(fdi->fd, polledevents[n].events); -#endif -======= cb(fdi->fd, g_polled_events[n].events); ->>>>>>> android-10.0.0_r25 } } } diff --git a/minui/graphics.cpp b/minui/graphics.cpp old mode 100644 new mode 100755 index 744cceb9..bb3c5f95 --- a/minui/graphics.cpp +++ b/minui/graphics.cpp @@ -23,18 +23,8 @@ #include -<<<<<<< HEAD -#ifdef BOARD_USE_CUSTOM_RECOVERY_FONT -#include BOARD_USE_CUSTOM_RECOVERY_FONT -#else -#include "font_10x18.h" -#endif - -#ifndef MSM_BSP -======= #include ->>>>>>> android-10.0.0_r25 #include "graphics_adf.h" #endif #include "graphics_drm.h" @@ -222,29 +212,7 @@ static inline uint32_t pixel_blend(uint8_t alpha, uint32_t pix) { return (out_r & 0xff) | (out_g & 0xff00) | (out_b & 0xff0000) | (gr_current & 0xff000000); } -<<<<<<< HEAD -// increments pixel pointer right, with current rotation. -static void incr_x16(uint16_t** p, int row_pixels) { - if (rotation % 2) { - *p = *p + (rotation == 1 ? 1 : -1) * row_pixels; - } else { - *p = *p + (rotation ? -1 : 1); - } -} - -// increments pixel pointer down, with current rotation. -static void incr_y16(uint16_t** p, int row_pixels) { - if (rotation % 2) { - *p = *p + (rotation == 1 ? -1 : 1); - } else { - *p = *p + (rotation ? -1 : 1) * row_pixels; - } -} - -// increments pixel pointer right, with current rotation. -======= // Increments pixel pointer right, with current rotation. ->>>>>>> android-10.0.0_r25 static void incr_x(uint32_t** p, int row_pixels) { if (rotation == GRRotation::LEFT) { *p = *p - row_pixels; @@ -270,31 +238,8 @@ static void incr_y(uint32_t** p, int row_pixels) { } } -<<<<<<< HEAD -// returns pixel pointer at given coordinates with rotation adjustment. -static uint16_t* pixel_at16(GRSurface* surf, int x, int y, int row_pixels) { - switch (rotation) { - case ROTATION_NONE: - return reinterpret_cast(surf->data) + y * row_pixels + x; - case ROTATION_RIGHT: - return reinterpret_cast(surf->data) + x * row_pixels + (surf->width - y); - case ROTATION_DOWN: - return reinterpret_cast(surf->data) + (surf->height - 1 - y) * row_pixels + - (surf->width - 1 - x); - case ROTATION_LEFT: - return reinterpret_cast(surf->data) + (surf->height - 1 - x) * row_pixels + y; - default: - printf("invalid rotation %d", rotation); - } - return nullptr; -} - -// returns pixel pointer at given coordinates with rotation adjustment. -static uint32_t* pixel_at(GRSurface* surf, int x, int y, int row_pixels) { -======= // Returns pixel pointer at given coordinates with rotation adjustment. static uint32_t* PixelAt(GRSurface* surface, int x, int y, int row_pixels) { ->>>>>>> android-10.0.0_r25 switch (rotation) { case GRRotation::NONE: return reinterpret_cast(surface->data()) + y * row_pixels + x; @@ -312,29 +257,8 @@ static uint32_t* PixelAt(GRSurface* surface, int x, int y, int row_pixels) { return nullptr; } -<<<<<<< HEAD -static void text_blend16(uint8_t* src_p, int src_row_bytes, uint16_t* dst_p, int dst_row_pixels, - int width, int height) { - uint8_t alpha_current = static_cast((alpha_mask & gr_current) >> 24); - for (int j = 0; j < height; ++j) { - uint8_t* sx = src_p; - uint16_t* px = dst_p; - for (int i = 0; i < width; ++i, incr_x16(&px, dst_row_pixels)) { - uint8_t a = *sx++; - if (alpha_current < 255) a = (static_cast(a) * alpha_current) / 255; - *px = pixel_blend16(a, *px); - } - src_p += src_row_bytes; - incr_y16(&dst_p, dst_row_pixels); - } -} - -static void text_blend(uint8_t* src_p, int src_row_bytes, uint32_t* dst_p, int dst_row_pixels, - int width, int height) { -======= static void TextBlend(const uint8_t* src_p, int src_row_bytes, uint32_t* dst_p, int dst_row_pixels, int width, int height) { ->>>>>>> android-10.0.0_r25 uint8_t alpha_current = static_cast((alpha_mask & gr_current) >> 24); for (int j = 0; j < height; ++j) { const uint8_t* sx = src_p; @@ -404,22 +328,6 @@ void gr_text(const GRFont* font, int x, int y, const char* s, bool bold) { } int row_pixels = gr_draw->row_bytes / gr_draw->pixel_bytes; -<<<<<<< HEAD - - uint8_t* src_p = font->texture->data + ((ch - ' ') * font->char_width) + - (bold ? font->char_height * font->texture->row_bytes : 0); - if (gr_draw->pixel_bytes == 2) { - uint16_t* dst_p = pixel_at16(gr_draw, x, y, row_pixels); - - text_blend16(src_p, font->texture->row_bytes, dst_p, row_pixels, font->char_width, - font->char_height); - } else { // not indenting AOSP original code - uint32_t* dst_p = pixel_at(gr_draw, x, y, row_pixels); - - text_blend(src_p, font->texture->row_bytes, dst_p, row_pixels, font->char_width, - font->char_height); - } -======= const uint8_t* src_p = font->texture->data() + ((ch - ' ') * font->char_width) + (bold ? font->char_height * font->texture->row_bytes : 0); uint32_t* dst_p = PixelAt(gr_draw, x, y, row_pixels); @@ -427,7 +335,6 @@ void gr_text(const GRFont* font, int x, int y, const char* s, bool bold) { TextBlend(src_p, font->texture->row_bytes, dst_p, row_pixels, font->char_width, font->char_height); ->>>>>>> android-10.0.0_r25 x += font->char_width; } } @@ -447,22 +354,9 @@ void gr_texticon(int x, int y, const GRSurface* icon) { if (outside(x, y) || outside(x + icon->width - 1, y + icon->height - 1)) return; int row_pixels = gr_draw->row_bytes / gr_draw->pixel_bytes; -<<<<<<< HEAD - uint8_t* src_p = icon->data; - if (gr_draw->pixel_bytes == 2) { - uint16_t* dst_p = pixel_at16(gr_draw, x, y, row_pixels); - - text_blend16(src_p, icon->row_bytes, dst_p, row_pixels, icon->width, icon->height); - return; - } - uint32_t* dst_p = pixel_at(gr_draw, x, y, row_pixels); - - text_blend(src_p, icon->row_bytes, dst_p, row_pixels, icon->width, icon->height); -======= const uint8_t* src_p = icon->data(); uint32_t* dst_p = PixelAt(gr_draw, x, y, row_pixels); TextBlend(src_p, icon->row_bytes, dst_p, row_pixels, icon->width, icon->height); ->>>>>>> android-10.0.0_r25 } void gr_convert_rgb_555(unsigned char r, unsigned char g, unsigned char b) @@ -536,27 +430,7 @@ void gr_fill(int x1, int y1, int x2, int y2) { if (outside(x1, y1) || outside(x2 - 1, y2 - 1)) return; int row_pixels = gr_draw->row_bytes / gr_draw->pixel_bytes; -<<<<<<< HEAD - if (gr_draw->pixel_bytes == 2) { - uint16_t* p = pixel_at16(gr_draw, x1, y1, row_pixels); - uint8_t alpha = static_cast(((gr_current & alpha_mask) >> 24)); - if (alpha > 0) { - for (int y = y1; y < y2; ++y) { - uint16_t* px = p; - for (int x = x1; x < x2; ++x) { - *px = pixel_blend16(alpha, *px); - incr_x16(&px, row_pixels); - } - incr_y16(&p, row_pixels); - } - } - return; - } - { // open brace to maintain separation between uint16_t p and uint32_t p - uint32_t* p = pixel_at(gr_draw, x1, y1, row_pixels); -======= uint32_t* p = PixelAt(gr_draw, x1, y1, row_pixels); ->>>>>>> android-10.0.0_r25 uint8_t alpha = static_cast(((gr_current & alpha_mask) >> 24)); if (alpha > 0) { for (int y = y1; y < y2; ++y) { @@ -740,49 +614,10 @@ int gr_init_font(const char* name, GRFont** dest) { return 0; } -<<<<<<< HEAD -static void gr_init_font(void) { - int res = gr_init_font("font", &gr_font); - if (res == 0) { - return; - } - - printf("failed to read font: res=%d\n", res); - - // fall back to the compiled-in font. - gr_font = static_cast(calloc(1, sizeof(*gr_font))); - gr_font->texture = static_cast(malloc(sizeof(*gr_font->texture))); - gr_font->texture->width = font.width; - gr_font->texture->height = font.height; - gr_font->texture->row_bytes = font.width; - gr_font->texture->pixel_bytes = 1; - - unsigned char* bits = static_cast(malloc(font.width * font.height)); - gr_font->texture->data = bits; - - unsigned char data; - unsigned char* in = font.rundata; - while ((data = *in++)) { - memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f); - bits += (data & 0x7f); - } - - gr_font->char_width = font.char_width; - gr_font->char_height = font.char_height; -} -#endif // TW_NO_MINUI_CUSTOM_FONTS - -======= ->>>>>>> android-10.0.0_r25 void gr_flip() { gr_draw = gr_backend->Flip(); } -<<<<<<< HEAD -int gr_init(void) -{ - gr_init_font(); -======= int gr_init() { // pixel_format needs to be set before loading any resources or initializing backends. std::string format = android::base::GetProperty("ro.minui.pixel_format", ""); @@ -801,7 +636,6 @@ int gr_init() { printf("Failed to init font: %d, continuing graphic backend initialization without font file\n", ret); } ->>>>>>> android-10.0.0_r25 auto backend = std::unique_ptr{ std::make_unique() }; gr_draw = backend->Init(); @@ -812,16 +646,6 @@ int gr_init() { } #endif -#ifndef MSM_BSP - if (!gr_draw) { - backend = std::make_unique(); - gr_draw = backend->Init(); - if (gr_draw) - printf("Using adf graphics.\n"); - } -#else - printf("Skipping adf graphics because TW_TARGET_USES_QCOM_BSP := true\n"); -#endif if (!gr_draw) { backend = std::make_unique(); @@ -835,13 +659,11 @@ int gr_init() { gr_draw = backend->Init(); if (gr_draw) printf("Using fbdev graphics.\n"); - } if (!gr_draw) { return -1; } - gr_backend = 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_adf.cpp b/minui/graphics_adf.cpp old mode 100644 new mode 100755 index df72e85c..8f1f33a3 --- a/minui/graphics_adf.cpp +++ b/minui/graphics_adf.cpp @@ -116,19 +116,6 @@ int MinuiBackendAdf::DeviceInit(adf_device* dev) { } GRSurface* MinuiBackendAdf::Init() { -<<<<<<< HEAD -#if defined(RECOVERY_ABGR) - format = DRM_FORMAT_ABGR8888; -#elif defined(RECOVERY_BGRA) - format = DRM_FORMAT_BGRA8888; -#elif defined(RECOVERY_RGBA) - format = DRM_FORMAT_RGBA8888; -#elif defined(RECOVERY_RGBX) - format = DRM_FORMAT_RGBX8888; -#else - format = DRM_FORMAT_RGB565; -#endif -======= PixelFormat pixel_format = gr_pixel_format(); if (pixel_format == PixelFormat::ABGR) { format = DRM_FORMAT_ABGR8888; @@ -139,7 +126,6 @@ GRSurface* MinuiBackendAdf::Init() { } else { format = DRM_FORMAT_RGB565; } ->>>>>>> android-10.0.0_r25 adf_id_t* dev_ids = nullptr; ssize_t n_dev_ids = adf_devices(&dev_ids); @@ -178,14 +164,8 @@ GRSurface* MinuiBackendAdf::Init() { return ret; } -<<<<<<< HEAD -void MinuiBackendAdf::Sync(__unused GRSurfaceAdf* surf) { -#ifdef HAS_LIBSYNC - static constexpr unsigned int warningTimeout = 3000; -======= void MinuiBackendAdf::Sync(GRSurfaceAdf* surf) { static constexpr unsigned int kWarningTimeout = 3000; ->>>>>>> android-10.0.0_r25 if (surf == nullptr) return; diff --git a/minui/graphics_drm.cpp b/minui/graphics_drm.cpp old mode 100644 new mode 100755 index b8d813e0..7b2eed15 --- a/minui/graphics_drm.cpp +++ b/minui/graphics_drm.cpp @@ -76,19 +76,6 @@ static int drm_format_to_bpp(uint32_t format) { std::unique_ptr GRSurfaceDrm::Create(int drm_fd, int width, int height) { uint32_t format; -<<<<<<< HEAD -#if defined(RECOVERY_ABGR) - format = DRM_FORMAT_RGBA8888; -#elif defined(RECOVERY_BGRA) - format = DRM_FORMAT_ARGB8888; -#elif defined(RECOVERY_RGBA) - format = DRM_FORMAT_ARGB8888; -#elif defined(RECOVERY_RGBX) - format = DRM_FORMAT_XBGR8888; -#else - format = DRM_FORMAT_RGB565; -#endif -======= PixelFormat pixel_format = gr_pixel_format(); // PixelFormat comes in byte order, whereas DRM_FORMAT_* uses little-endian // (external/libdrm/include/drm/drm_fourcc.h). Note that although drm_fourcc.h also defines a @@ -103,7 +90,6 @@ std::unique_ptr GRSurfaceDrm::Create(int drm_fd, int width, int he } else { format = DRM_FORMAT_RGB565; } ->>>>>>> android-10.0.0_r25 drm_mode_create_dumb create_dumb = {}; create_dumb.height = height; diff --git a/minui/include/minui/minui.h b/minui/include/minui/minui.h old mode 100644 new mode 100755 index 9c366360..071403ec --- a/minui/include/minui/minui.h +++ b/minui/include/minui/minui.h @@ -16,13 +16,10 @@ #pragma once -<<<<<<< HEAD #ifndef TW_USE_MINUI_21 -======= #include #include ->>>>>>> android-10.0.0_r25 #include #include @@ -128,7 +125,6 @@ void gr_clear(); void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); void gr_fill(int x1, int y1, int x2, int y2); -<<<<<<< HEAD void gr_texticon(int x, int y, GRSurface* icon); #ifdef TW_NO_MINUI_CUSTOM_FONTS void gr_text(int x, int y, const char *s, bool bold); @@ -136,22 +132,15 @@ int gr_measure(const char *s); void gr_font_size(int *x, int *y); void gr_set_font(__attribute__ ((unused))const char* name); #else -======= void gr_texticon(int x, int y, const GRSurface* icon); ->>>>>>> android-10.0.0_r25 const GRFont* gr_sys_font(); int gr_init_font(const char* name, GRFont** dest); void gr_text(const GRFont* font, int x, int y, const char* s, bool bold); // Returns -1 if font is nullptr. int gr_measure(const GRFont* font, const char* s); -<<<<<<< HEAD -void gr_font_size(const GRFont* font, int* x, int* y); -#endif -======= // Returns -1 if font is nullptr. int gr_font_size(const GRFont* font, int* x, int* y); ->>>>>>> android-10.0.0_r25 void gr_blit(const GRSurface* source, int sx, int sy, int w, int h, int dx, int dy); unsigned int gr_get_width(const GRSurface* surface); @@ -182,12 +171,9 @@ using ev_set_key_callback = std::function; #ifdef TW_USE_MINUI_WITH_OPTIONAL_TOUCH_EVENTS int ev_init(ev_callback input_cb, bool allow_touch_inputs = false); -<<<<<<< HEAD -======= void ev_exit(); int ev_add_fd(android::base::unique_fd&& fd, ev_callback cb); void ev_iterate_available_keys(const std::function& f); ->>>>>>> android-10.0.0_r25 void ev_iterate_touch_inputs(const std::function& action); #else int ev_init(ev_callback input_cb); @@ -254,8 +240,6 @@ std::vector get_locales_in_png(const std::string& png_name); // Free a surface allocated by any of the res_create_*_surface() // functions. void res_free_surface(GRSurface* surface); -<<<<<<< HEAD - #else //ifndef TW_USE_MINUI_21 // This the old minui21/minui.h for compatibility with building TWRP @@ -348,5 +332,3 @@ void gr_clear(); #endif // ifndef TW_USE_MINUI_21 #endif // ifndef _MINUI_H_ -======= ->>>>>>> android-10.0.0_r25 diff --git a/minui/resources.cpp b/minui/resources.cpp old mode 100644 new mode 100755 index 83798856..abcffcc6 --- a/minui/resources.cpp +++ b/minui/resources.cpp @@ -33,12 +33,7 @@ #include #include -<<<<<<< HEAD -//#include // does not exist in 6.0 -//#include // does not exist in 6.0 -======= #include ->>>>>>> android-10.0.0_r25 #include #include "minui/minui.h" @@ -68,13 +63,6 @@ std::unique_ptr GRSurface::Clone() const { return result; } -<<<<<<< HEAD -PngHandler::PngHandler(const std::string& name) : error_code_(0), png_fp_(nullptr, fclose) { - char res_path[PATH_MAX]; - sprintf(res_path, "/res/images/%s.png", name.c_str()); - //std::string res_path = sprintf("/res/images/%s.png", name.c_str()); - png_fp_.reset(fopen(res_path, "rbe")); -======= PngHandler::PngHandler(const std::string& name) { std::string res_path = g_resource_dir + "/" + name + ".png"; png_fp_.reset(fopen(res_path.c_str(), "rbe")); @@ -82,7 +70,6 @@ PngHandler::PngHandler(const std::string& name) { if (!png_fp_) { png_fp_.reset(fopen(name.c_str(), "rbe")); } ->>>>>>> android-10.0.0_r25 if (!png_fp_) { error_code_ = -1; return; diff --git a/minuitwrp/Android.mk b/minuitwrp/Android.mk index 2ca2091e..99f9a237 100644 --- a/minuitwrp/Android.mk +++ b/minuitwrp/Android.mk @@ -201,7 +201,7 @@ LOCAL_STATIC_LIBRARIES += libpixelflinger_twrp ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 25; echo $$?),0) LOCAL_SHARED_LIBRARIES += libcutils liblog libutils endif -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE := libminuitwrp include $(BUILD_SHARED_LIBRARY) diff --git a/minuitwrp/graphics.cpp b/minuitwrp/graphics.cpp old mode 100644 new mode 100755 index 47ff3b91..8abf8eb7 --- a/minuitwrp/graphics.cpp +++ b/minuitwrp/graphics.cpp @@ -37,6 +37,7 @@ #include "graphics.h" // For std::min and std::max #include +#include "truetype.hpp" struct GRFont { GRSurface* texture; @@ -70,25 +71,25 @@ int gr_textEx_scaleW(int x, int y, const char *s, void* pFont, int max_width, in if (!s || strlen(s) == 0 || !font) return 0; - measured_height = gr_ttf_getMaxFontHeight(font); + measured_height = twrpTruetype::gr_ttf_getMaxFontHeight(font); if (scale) { - measured_width = gr_ttf_measureEx(s, vfont); + measured_width = twrpTruetype::gr_ttf_measureEx(s, vfont); if (measured_width > max_width) { // Adjust font size down until the text fits - void *new_font = gr_ttf_scaleFont(vfont, max_width, measured_width); + void *new_font = twrpTruetype::gr_ttf_scaleFont(vfont, max_width, measured_width); if (!new_font) { printf("gr_textEx_scaleW new_font is NULL\n"); return 0; } - measured_width = gr_ttf_measureEx(s, new_font); + measured_width = twrpTruetype::gr_ttf_measureEx(s, new_font); // These next 2 lines adjust the y point based on the new font's height - new_height = gr_ttf_getMaxFontHeight(new_font); + new_height = twrpTruetype::gr_ttf_getMaxFontHeight(new_font); y_scale = (measured_height - new_height) / 2; vfont = new_font; } } else - measured_width = gr_ttf_measureEx(s, vfont); + measured_width = twrpTruetype::gr_ttf_measureEx(s, vfont); int x_adj = measured_width; if (measured_width > max_width) @@ -107,7 +108,7 @@ int gr_textEx_scaleW(int x, int y, const char *s, void* pFont, int max_width, in else if (placement == BOTTOM_LEFT || placement == BOTTOM_RIGHT) y -= measured_height; } - return gr_ttf_textExWH(gl, x, y + y_scale, s, vfont, measured_width + x, -1, gr_draw); + return twrpTruetype::gr_ttf_textExWH(gl, x, y + y_scale, s, vfont, measured_width + x, -1, gr_draw); } void gr_clip(int x, int y, int w, int h) diff --git a/minuitwrp/truetype.cpp b/minuitwrp/truetype.cpp old mode 100644 new mode 100755 index 0416b0e9..3dffbe41 --- a/minuitwrp/truetype.cpp +++ b/minuitwrp/truetype.cpp @@ -1,3 +1,21 @@ +/* + Copyright 2012 to 2020 TeamWin + This file is part of TWRP/TeamWin Recovery Project. + + TWRP is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + TWRP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TWRP. If not, see . +*/ + #include #include #include @@ -5,856 +23,631 @@ #include #include -#include "minui.h" - -#include -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H - -#include #include -// For std::min and std::max #include - -#define STRING_CACHE_MAX_ENTRIES 400 -#define STRING_CACHE_TRUNCATE_ENTRIES 150 - -typedef struct -{ - int size; - int dpi; - char *path; -} TrueTypeFontKey; - -typedef struct -{ - int type; - int refcount; - int size; - int dpi; - int max_height; - int base; - FT_Face face; - Hashmap *glyph_cache; - Hashmap *string_cache; - struct StringCacheEntry *string_cache_head; - struct StringCacheEntry *string_cache_tail; - pthread_mutex_t mutex; - TrueTypeFontKey *key; -} TrueTypeFont; - -typedef struct -{ - FT_BBox bbox; - FT_BitmapGlyph glyph; -} TrueTypeCacheEntry; - -typedef struct -{ - char *text; - int max_width; -} StringCacheKey; - -struct StringCacheEntry -{ - GGLSurface surface; - int rendered_bytes; // number of bytes from C string rendered, not number of UTF8 characters! - StringCacheKey *key; - struct StringCacheEntry *prev; - struct StringCacheEntry *next; -}; - -typedef struct StringCacheEntry StringCacheEntry; - -typedef struct -{ - FT_Library ft_library; - Hashmap *fonts; - pthread_mutex_t mutex; -} FontData; +#include +#include "truetype.hpp" static FontData font_data = { - .ft_library = NULL, - .fonts = NULL, - .mutex = PTHREAD_MUTEX_INITIALIZER, + .ft_library = NULL, + .mutex = PTHREAD_MUTEX_INITIALIZER }; -#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) -#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) +twrpTruetype::twrpTruetype(void) { -// 32bit FNV-1a hash algorithm -// http://isthe.com/chongo/tech/comp/fnv/#FNV-1a -static const uint32_t FNV_prime = 16777619U; -static const uint32_t offset_basis = 2166136261U; - -static uint32_t fnv_hash(void *data, uint32_t len) -{ - uint8_t *d8 = (uint8_t *)data; - uint32_t *d32 = (uint32_t *)data; - uint32_t i, max; - uint32_t hash = offset_basis; - - max = len/4; - - // 32 bit data - for(i = 0; i < max; ++i) - { - hash ^= *d32++; - hash *= FNV_prime; - } - - // last bits - for(i *= 4; i < len; ++i) - { - hash ^= (uint32_t) d8[i]; - hash *= FNV_prime; - } - return hash; } -static inline uint32_t fnv_hash_add(uint32_t cur_hash, uint32_t word) -{ - cur_hash ^= word; - cur_hash *= FNV_prime; - return cur_hash; +int twrpTruetype::utf8_to_unicode(const char* pIn, unsigned int *pOut) { + int utf_bytes = 1; + unsigned int unicode = 0; + unsigned char tmp; + tmp = (unsigned char)*pIn++; + if (tmp < 0x80) + { + *pOut = tmp; + } + else + { + unsigned int high_bit_mask = 0x3F; + unsigned int high_bit_shift = 0; + int total_bits = 0; + while((tmp & 0xC0) == 0xC0) + { + utf_bytes ++; + if(utf_bytes > 6) + { + *pOut = tmp; + return 1; + } + tmp = 0xFF & (tmp << 1); + total_bits += 6; + high_bit_mask >>= 1; + high_bit_shift++; + unicode <<= 6; + unicode |= (*pIn++) & 0x3F; + } + unicode |= ((tmp >> high_bit_shift) & high_bit_mask) << total_bits; + *pOut = unicode; + } + + return utf_bytes; } -int utf8_to_unicode(const char* pIn, unsigned int *pOut) -{ - int utf_bytes = 1; - unsigned int unicode = 0; - unsigned char tmp; - tmp = (unsigned char)*pIn++; - if (tmp < 0x80) - { - *pOut = tmp; - } - else - { - unsigned int high_bit_mask = 0x3F; - unsigned int high_bit_shift = 0; - int total_bits = 0; - while((tmp & 0xC0) == 0xC0) - { - utf_bytes ++; - if(utf_bytes > 6) - { - *pOut = tmp; - return 1; - } - tmp = 0xFF & (tmp << 1); - total_bits += 6; - high_bit_mask >>= 1; - high_bit_shift++; - unicode <<= 6; - unicode |= (*pIn++) & 0x3F; - } - unicode |= ((tmp >> high_bit_shift) & high_bit_mask) << total_bits; - *pOut = unicode; - } +void* twrpTruetype::gr_ttf_loadFont(const char *filename, int size, int dpi) { + int error; + TrueTypeFont* res = nullptr; + TrueTypeFontKey* key; - return utf_bytes; -} + pthread_mutex_lock(&font_data.mutex); -static bool gr_ttf_string_cache_equals(void *keyA, void *keyB) -{ - StringCacheKey *a = (StringCacheKey *)keyA; - StringCacheKey *b = (StringCacheKey *)keyB; - return a->max_width == b->max_width && strcmp(a->text, b->text) == 0; -} + TrueTypeFontKey k = { + .size = size, + .dpi = dpi, + .path = (char*)filename + }; -static int gr_ttf_string_cache_hash(void *key) -{ - StringCacheKey *k = (StringCacheKey *)key; - return fnv_hash(k->text, strlen(k->text)); -} + TrueTypeFontMap::iterator ttfIter = font_data.fonts.find(k); -static bool gr_ttf_font_cache_equals(void *keyA, void *keyB) -{ - TrueTypeFontKey *a = (TrueTypeFontKey *)keyA; - TrueTypeFontKey *b = (TrueTypeFontKey *)keyB; - return (a->size == b->size) && (a->dpi == b->dpi) && !strcmp(a->path, b->path); -} + if (ttfIter != font_data.fonts.end()) + { + res = ttfIter->second; + ++res->refcount; + goto exit; + } -static int gr_ttf_font_cache_hash(void *key) -{ - TrueTypeFontKey *k = (TrueTypeFontKey *)key; + if(!font_data.ft_library) + { + error = FT_Init_FreeType(&font_data.ft_library); + if(error) + { + fprintf(stderr, "Failed to init libfreetype! %d\n", error); + goto exit; + } + } - uint32_t hash = fnv_hash(k->path, strlen(k->path)); - hash = fnv_hash_add(hash, k->size); - hash = fnv_hash_add(hash, k->dpi); - return hash; -} + FT_Face face; + error = FT_New_Face(font_data.ft_library, filename, 0, &face); + if(error) + { + fprintf(stderr, "Failed to load truetype face %s: %d\n", filename, error); + goto exit; + } -void *gr_ttf_loadFont(const char *filename, int size, int dpi) -{ - int error; - TrueTypeFont *res = NULL; - TrueTypeFontKey *key = NULL; + error = FT_Set_Char_Size(face, 0, size*16, dpi, dpi); + if(error) + { + fprintf(stderr, "Failed to set truetype face size to %d, dpi %d: %d\n", size, dpi, error); + FT_Done_Face(face); + goto exit; + } - pthread_mutex_lock(&font_data.mutex); + res = new TrueTypeFont; + res->type = FONT_TYPE_TTF; + res->size = size; + res->dpi = dpi; + res->face = face; + res->max_height = -1; + res->base = -1; + res->refcount = 1; - if(font_data.fonts) - { - TrueTypeFontKey k = { - .size = size, - .dpi = dpi, - .path = (char*)filename - }; + pthread_mutex_init(&res->mutex, 0); - res = (TrueTypeFont *)hashmapGet(font_data.fonts, &k); - if(res) - { - ++res->refcount; - goto exit; - } - } + key = new TrueTypeFontKey; + key->path = strdup(filename); + key->size = size; + key->dpi = dpi; - if(!font_data.ft_library) - { - error = FT_Init_FreeType(&font_data.ft_library); - if(error) - { - fprintf(stderr, "Failed to init libfreetype! %d\n", error); - goto exit; - } - } - - FT_Face face; - error = FT_New_Face(font_data.ft_library, filename, 0, &face); - if(error) - { - fprintf(stderr, "Failed to load truetype face %s: %d\n", filename, error); - goto exit; - } - - error = FT_Set_Char_Size(face, 0, size*16, dpi, dpi); - if(error) - { - fprintf(stderr, "Failed to set truetype face size to %d, dpi %d: %d\n", size, dpi, error); - FT_Done_Face(face); - goto exit; - } - - res = (TrueTypeFont *)malloc(sizeof(TrueTypeFont)); - memset(res, 0, sizeof(TrueTypeFont)); - res->type = FONT_TYPE_TTF; - res->size = size; - res->dpi = dpi; - res->face = face; - res->max_height = -1; - res->base = -1; - res->refcount = 1; - res->glyph_cache = hashmapCreate(32, hashmapIntHash, hashmapIntEquals); - res->string_cache = hashmapCreate(128, gr_ttf_string_cache_hash, gr_ttf_string_cache_equals); - pthread_mutex_init(&res->mutex, 0); - - if(!font_data.fonts) - font_data.fonts = hashmapCreate(4, gr_ttf_font_cache_hash, gr_ttf_font_cache_equals); - - key = (TrueTypeFontKey *)malloc(sizeof(TrueTypeFontKey)); - memset(key, 0, sizeof(TrueTypeFontKey)); - key->path = strdup(filename); - key->size = size; - key->dpi = dpi; - - res->key = key; - - hashmapPut(font_data.fonts, key, res); + res->key = key; + font_data.fonts[*key] = res; exit: - pthread_mutex_unlock(&font_data.mutex); - return res; + pthread_mutex_unlock(&font_data.mutex); + return res; } -void *gr_ttf_scaleFont(void *font, int max_width, int measured_width) -{ - if (!font) - return NULL; +void* twrpTruetype::gr_ttf_scaleFont(void *font, int max_width, int measured_width) { + if (!font) + return nullptr; - TrueTypeFont *f = (TrueTypeFont *)font; - float scale_value = (float)(max_width) / (float)(measured_width); - int new_size = ((int)((float)f->size * scale_value)) - 1; - if (new_size < 1) - new_size = 1; - const char* file = f->key->path; - int dpi = f->dpi; - return gr_ttf_loadFont(file, new_size, dpi); + TrueTypeFont *f = (TrueTypeFont *)font; + float scale_value = (float)(max_width) / (float)(measured_width); + int new_size = ((int)((float)f->size * scale_value)) - 1; + if (new_size < 1) + new_size = 1; + const char* file = f->key->path; + int dpi = f->dpi; + return gr_ttf_loadFont(file, new_size, dpi); } -static bool gr_ttf_freeFontCache(void *key, void *value, void *context __unused) +static bool gr_ttf_freeFontCache(void *value, void *context __unused) { - TrueTypeCacheEntry *e = (TrueTypeCacheEntry *)value; - FT_Done_Glyph((FT_Glyph)e->glyph); - free(e); - free(key); - return true; + TrueTypeCacheEntry *e = (TrueTypeCacheEntry *)value; + FT_Done_Glyph((FT_Glyph)e->glyph); + free(e); + return true; } -static bool gr_ttf_freeStringCache(void *key, void *value, void *context __unused) -{ - StringCacheKey *k = (StringCacheKey *)key; - free(k->text); - free(k); +bool twrpTruetype::gr_ttf_freeStringCache(void *key, void *value, void *context __unused) { + StringCacheKey *k = (StringCacheKey *)key; + delete k->text; + delete k; - StringCacheEntry *e = (StringCacheEntry *)value; - free(e->surface.data); - free(e); - return true; + StringCacheEntry *e = (StringCacheEntry *)value; + delete e->surface.data; + delete e; + return true; } -void gr_ttf_freeFont(void *font) -{ - pthread_mutex_lock(&font_data.mutex); +void twrpTruetype::gr_ttf_freeFont(void *font) { + pthread_mutex_lock(&font_data.mutex); - TrueTypeFont *d = (TrueTypeFont *)font; + TrueTypeFont *d = (TrueTypeFont *)font; + if(--d->refcount == 0) + { + delete d->key->path; + delete d->key; - if(--d->refcount == 0) - { - hashmapRemove(font_data.fonts, d->key); + FT_Done_Face(d->face); - if(hashmapSize(font_data.fonts) == 0) - { - hashmapFree(font_data.fonts); - font_data.fonts = NULL; - } + StringCacheMap::iterator stringCacheEntryIt = d->string_cache.begin(); + while (stringCacheEntryIt != d->string_cache.end()) { + gr_ttf_freeStringCache(stringCacheEntryIt->second->key, stringCacheEntryIt->second, NULL); + stringCacheEntryIt = d->string_cache.erase(stringCacheEntryIt); + } - free(d->key->path); - free(d->key); + TrueTypeCacheEntryMap::iterator ttcIt = d->glyph_cache.begin(); + while(ttcIt != d->glyph_cache.end()) { + gr_ttf_freeFontCache(ttcIt->second, NULL); + ttcIt = d->glyph_cache.erase(ttcIt); + } - FT_Done_Face(d->face); - hashmapForEach(d->string_cache, gr_ttf_freeStringCache, NULL); - hashmapFree(d->string_cache); - hashmapForEach(d->glyph_cache, gr_ttf_freeFontCache, NULL); - hashmapFree(d->glyph_cache); - pthread_mutex_destroy(&d->mutex); - free(d); - } + pthread_mutex_destroy(&d->mutex); - pthread_mutex_unlock(&font_data.mutex); + TrueTypeFontMap::iterator trueTypeFontIt = font_data.fonts.find(*(d->key)); + delete d; + font_data.fonts.erase(trueTypeFontIt); + + } + + pthread_mutex_unlock(&font_data.mutex); } -static TrueTypeCacheEntry *gr_ttf_glyph_cache_peek(TrueTypeFont *font, int char_index) -{ - return (TrueTypeCacheEntry *)hashmapGet(font->glyph_cache, &char_index); +TrueTypeCacheEntry* twrpTruetype::gr_ttf_glyph_cache_peek(TrueTypeFont *font, int char_index) { + TrueTypeCacheEntryMap::iterator glyphCacheItr = font->glyph_cache.find(char_index); + + if(glyphCacheItr != font->glyph_cache.end()) { + return font->glyph_cache[char_index]; + } + return nullptr; } -static TrueTypeCacheEntry *gr_ttf_glyph_cache_get(TrueTypeFont *font, int char_index) -{ - TrueTypeCacheEntry *res = (TrueTypeCacheEntry *)hashmapGet(font->glyph_cache, &char_index); - if(!res) - { - int error = FT_Load_Glyph(font->face, char_index, FT_LOAD_RENDER); - if(error) - { - fprintf(stderr, "Failed to load glyph idx %d: %d\n", char_index, error); - return NULL; - } +TrueTypeCacheEntry* twrpTruetype::gr_ttf_glyph_cache_get(TrueTypeFont *font, int char_index) { + TrueTypeCacheEntryMap::iterator glyphCacheItr = font->glyph_cache.find(char_index); + TrueTypeCacheEntry* res = nullptr; + if(glyphCacheItr == font->glyph_cache.end()) + { + int error = FT_Load_Glyph(font->face, char_index, FT_LOAD_RENDER); + if(error) + { + fprintf(stderr, "Failed to load glyph idx %d: %d\n", char_index, error); + return NULL; + } - FT_BitmapGlyph glyph; - error = FT_Get_Glyph(font->face->glyph, (FT_Glyph*)&glyph); - if(error) - { - fprintf(stderr, "Failed to copy glyph %d: %d\n", char_index, error); - return NULL; - } + FT_BitmapGlyph glyph; + error = FT_Get_Glyph(font->face->glyph, (FT_Glyph*)&glyph); + if(error) + { + fprintf(stderr, "Failed to copy glyph %d: %d\n", char_index, error); + return NULL; + } - res = (TrueTypeCacheEntry *)malloc(sizeof(TrueTypeCacheEntry)); - memset(res, 0, sizeof(TrueTypeCacheEntry)); - res->glyph = glyph; - FT_Glyph_Get_CBox((FT_Glyph)glyph, FT_GLYPH_BBOX_PIXELS, &res->bbox); + res = new TrueTypeCacheEntry; + res->glyph = glyph; + FT_Glyph_Get_CBox((FT_Glyph)glyph, FT_GLYPH_BBOX_PIXELS, &res->bbox); + font->glyph_cache[char_index] = res; + } + else { + res = glyphCacheItr->second; + } - int *key = (int *)malloc(sizeof(int)); - *key = char_index; - - hashmapPut(font->glyph_cache, key, res); - } - - return res; + return res; } -static int gr_ttf_copy_glyph_to_surface(GGLSurface *dest, FT_BitmapGlyph glyph, int offX, int offY, int base) -{ - unsigned y; - uint8_t *src_itr = glyph->bitmap.buffer; - uint8_t *dest_itr = dest->data; +int twrpTruetype::gr_ttf_copy_glyph_to_surface(GGLSurface *dest, FT_BitmapGlyph glyph, int offX, int offY, int base) { + unsigned y; + uint8_t *src_itr = glyph->bitmap.buffer; + uint8_t *dest_itr = dest->data; - if(glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) - { - fprintf(stderr, "Unsupported pixel mode in FT_BitmapGlyph %d\n", glyph->bitmap.pixel_mode); - return -1; - } + if(glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY) + { + fprintf(stderr, "Unsupported pixel mode in FT_BitmapGlyph %d\n", glyph->bitmap.pixel_mode); + return -1; + } - dest_itr += (offY + base - glyph->top)*dest->stride + (offX + glyph->left); + dest_itr += (offY + base - glyph->top)*dest->stride + (offX + glyph->left); - // FIXME: if glyph->left is negative and everything else is 0 (e.g. letter 'j' in Roboto-Regular), - // the result might end up being before the buffer - I'm not sure how to properly handle this. - if(dest_itr < dest->data) - dest_itr = dest->data; + // FIXME: if glyph->left is negative and everything else is 0 (e.g. letter 'j' in Roboto-Regular), + // the result might end up being before the buffer - I'm not sure how to properly handle this. + if(dest_itr < dest->data) + dest_itr = dest->data; - for(y = 0; y < glyph->bitmap.rows; ++y) - { - memcpy(dest_itr, src_itr, glyph->bitmap.width); - src_itr += glyph->bitmap.pitch; - dest_itr += dest->stride; - } - return 0; + for(y = 0; y < glyph->bitmap.rows; ++y) + { + memcpy(dest_itr, src_itr, glyph->bitmap.width); + src_itr += glyph->bitmap.pitch; + dest_itr += dest->stride; + } + return 0; } -static void gr_ttf_calcMaxFontHeight(TrueTypeFont *f) -{ - char c; - int char_idx; - int error; - FT_Glyph glyph; - FT_BBox bbox; - FT_BBox bbox_glyph; - TrueTypeCacheEntry *ent; +void twrpTruetype::gr_ttf_calcMaxFontHeight(TrueTypeFont *f) { + char c; + int char_idx; + int error; + FT_Glyph glyph; + FT_BBox bbox; + FT_BBox bbox_glyph; + TrueTypeCacheEntry *ent; - bbox.yMin = bbox_glyph.yMin = LONG_MAX; - bbox.yMax = bbox_glyph.yMax = LONG_MIN; + bbox.yMin = bbox_glyph.yMin = LONG_MAX; + bbox.yMax = bbox_glyph.yMax = LONG_MIN; - for(c = '!'; c <= '~'; ++c) - { - char_idx = FT_Get_Char_Index(f->face, c); - ent = gr_ttf_glyph_cache_peek(f, char_idx); - if(ent) - { - bbox.yMin = MIN(bbox.yMin, ent->bbox.yMin); - bbox.yMax = MAX(bbox.yMax, ent->bbox.yMax); - } - else - { - error = FT_Load_Glyph(f->face, char_idx, 0); - if(error) - continue; + for(c = '!'; c <= '~'; ++c) + { + char_idx = FT_Get_Char_Index(f->face, c); + ent = gr_ttf_glyph_cache_peek(f, char_idx); + if(ent) + { + bbox.yMin = MIN(bbox.yMin, ent->bbox.yMin); + bbox.yMax = MAX(bbox.yMax, ent->bbox.yMax); + } + else + { + error = FT_Load_Glyph(f->face, char_idx, 0); + if(error) + continue; - error = FT_Get_Glyph(f->face->glyph, &glyph); - if(error) - continue; + error = FT_Get_Glyph(f->face->glyph, &glyph); + if(error) + continue; - FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &bbox_glyph); - bbox.yMin = MIN(bbox.yMin, bbox_glyph.yMin); - bbox.yMax = MAX(bbox.yMax, bbox_glyph.yMax); + FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_PIXELS, &bbox_glyph); + bbox.yMin = MIN(bbox.yMin, bbox_glyph.yMin); + bbox.yMax = MAX(bbox.yMax, bbox_glyph.yMax); - FT_Done_Glyph(glyph); - } - } + FT_Done_Glyph(glyph); + } + } - if(bbox.yMin > bbox.yMax) - bbox.yMin = bbox.yMax = 0; + if(bbox.yMin > bbox.yMax) + bbox.yMin = bbox.yMax = 0; - f->max_height = bbox.yMax - bbox.yMin; - f->base = bbox.yMax; + f->max_height = bbox.yMax - bbox.yMin; + f->base = bbox.yMax; - // FIXME: twrp fonts have some padding on top, I'll add it here - // Should be fixed in the themes - f->max_height += f->size / 4; - f->base += f->size / 4; + // FIXME: twrp fonts have some padding on top, I'll add it here + // Should be fixed in the themes + f->max_height += f->size / 4; + f->base += f->size / 4; } // returns number of bytes from const char *text rendered to fit max_width, not number of UTF8 characters! -static int gr_ttf_render_text(TrueTypeFont *font, GGLSurface *surface, const char *text, int max_width) -{ - TrueTypeFont *f = font; - TrueTypeCacheEntry *ent; - int bytes_rendered = 0, total_w = 0; - int utf_bytes = 0; - unsigned int unicode = 0; - int i, x, diff, char_idx, prev_idx = 0; - int height; - FT_Vector delta; - uint8_t *data = NULL; - const char *text_itr = text; - int *char_idxs; - int char_idxs_len = 0; +int twrpTruetype::gr_ttf_render_text(TrueTypeFont *font, GGLSurface *surface, const char *text, int max_width) { + TrueTypeFont *f = font; + TrueTypeCacheEntry *ent; + int bytes_rendered = 0, total_w = 0; + int utf_bytes = 0; + unsigned int unicode = 0; + int i, x, diff, char_idx, prev_idx = 0; + int height; + FT_Vector delta; + uint8_t *data = NULL; + const char *text_itr = text; + int *char_idxs; + int char_idxs_len = 0; - char_idxs = (int *)malloc(strlen(text) * sizeof(int)); + char_idxs = new int[strlen(text)]; - while(*text_itr) - { - utf_bytes = utf8_to_unicode(text_itr, &unicode); - text_itr += utf_bytes; - bytes_rendered += utf_bytes; + while(*text_itr) + { + utf_bytes = utf8_to_unicode(text_itr, &unicode); + text_itr += utf_bytes; + bytes_rendered += utf_bytes; - char_idx = FT_Get_Char_Index(f->face, unicode); - char_idxs[char_idxs_len] = char_idx; + char_idx = FT_Get_Char_Index(f->face, unicode); + char_idxs[char_idxs_len] = char_idx; + ent = gr_ttf_glyph_cache_get(f, char_idx); + if(ent) + { + diff = ent->glyph->root.advance.x >> 16; - ent = gr_ttf_glyph_cache_get(f, char_idx); - if(ent) - { - diff = ent->glyph->root.advance.x >> 16; + if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) + { + FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); + diff += delta.x >> 6; + } - if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) - { - FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); - diff += delta.x >> 6; - } + if(max_width != -1 && total_w + diff > max_width) + break; - if(max_width != -1 && total_w + diff > max_width) - break; + total_w += diff; + } + prev_idx = char_idx; + ++char_idxs_len; + } - total_w += diff; - } - prev_idx = char_idx; - ++char_idxs_len; - } + if(font->max_height == -1) + gr_ttf_calcMaxFontHeight(font); - if(font->max_height == -1) - gr_ttf_calcMaxFontHeight(font); + if(font->max_height == -1) + { + delete [] char_idxs; + return -1; + } - if(font->max_height == -1) - { - free(char_idxs); - return -1; - } + height = font->max_height; - height = font->max_height; + data = new uint8_t[total_w * height]; + x = 0; + prev_idx = 0; - data = (uint8_t *)malloc(total_w*height); - memset(data, 0, total_w*height); - x = 0; - prev_idx = 0; + surface->version = sizeof(*surface); + surface->width = total_w; + surface->height = height; + surface->stride = total_w; + surface->data = (GGLubyte*)data; + surface->format = GGL_PIXEL_FORMAT_A_8; - surface->version = sizeof(*surface); - surface->width = total_w; - surface->height = height; - surface->stride = total_w; - surface->data = (GGLubyte*)data; - surface->format = GGL_PIXEL_FORMAT_A_8; + for(i = 0; i < char_idxs_len; ++i) + { + char_idx = char_idxs[i]; + if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) + { + FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); + x += delta.x >> 6; + } - for(i = 0; i < char_idxs_len; ++i) - { - char_idx = char_idxs[i]; - if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) - { - FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); - x += delta.x >> 6; - } + ent = gr_ttf_glyph_cache_get(f, char_idx); + if(ent) + { + gr_ttf_copy_glyph_to_surface(surface, ent->glyph, x, 0, font->base); + x += ent->glyph->root.advance.x >> 16; + } - ent = gr_ttf_glyph_cache_get(f, char_idx); - if(ent) - { - gr_ttf_copy_glyph_to_surface(surface, ent->glyph, x, 0, font->base); - x += ent->glyph->root.advance.x >> 16; - } + prev_idx = char_idx; + } - prev_idx = char_idx; - } - - free(char_idxs); - return bytes_rendered; + delete [] char_idxs; + return bytes_rendered; } -static StringCacheEntry *gr_ttf_string_cache_peek(TrueTypeFont *font, const char *text, int max_width) -{ - StringCacheKey k = { - .text = (char*)text, - .max_width = max_width - }; - - return (StringCacheEntry *)hashmapGet(font->string_cache, &k); +StringCacheEntry* twrpTruetype::gr_ttf_string_cache_peek(TrueTypeFont *font, + const char *text, + __attribute__((unused)) int max_width) { + StringCacheKey k = { + .text = (char*)text, + .max_width = max_width + }; + StringCacheMap::iterator stringCacheItr = font->string_cache.find(k); + if (stringCacheItr != font->string_cache.end()) { + return stringCacheItr->second; + } + else { + return nullptr; + } } -static StringCacheEntry *gr_ttf_string_cache_get(TrueTypeFont *font, const char *text, int max_width) -{ - StringCacheEntry *res; - StringCacheKey k = { - .text = (char*)text, - .max_width = max_width - }; +StringCacheEntry* twrpTruetype::gr_ttf_string_cache_get(TrueTypeFont *font, const char *text, int max_width) { + StringCacheEntry *res = nullptr; - res = (StringCacheEntry *)hashmapGet(font->string_cache, &k); - if(!res) - { - res = (StringCacheEntry *)malloc(sizeof(StringCacheEntry)); - memset(res, 0, sizeof(StringCacheEntry)); - res->rendered_bytes = gr_ttf_render_text(font, &res->surface, text, max_width); - if(res->rendered_bytes < 0) - { - free(res); - return NULL; - } + StringCacheKey k = { + .text = (char*)text, + .max_width = max_width + }; - StringCacheKey *new_key = (StringCacheKey *)malloc(sizeof(StringCacheKey)); - memset(new_key, 0, sizeof(StringCacheKey)); - new_key->max_width = max_width; - new_key->text = strdup(text); + StringCacheMap::iterator stringCacheItr = font->string_cache.find(k); + if (stringCacheItr == font->string_cache.end()) + { + res = new StringCacheEntry; + res->rendered_bytes = gr_ttf_render_text(font, &res->surface, text, max_width); + if(res->rendered_bytes < 0) + { + delete res; + return nullptr; + } - res->key = new_key; + StringCacheKey *new_key = new StringCacheKey; + new_key->max_width = max_width; + new_key->text = strdup(text); + res->key = new_key; + font->string_cache[k] = res; + } + else + { + res = stringCacheItr->second; - if(font->string_cache_tail) - { - res->prev = font->string_cache_tail; - res->prev->next = res; - } - else - font->string_cache_head = res; - font->string_cache_tail = res; + // truncate old entries + if (font->string_cache.size() >= STRING_CACHE_MAX_ENTRIES) + { + StringCacheEntry *ent; + for(int i = 0; i < STRING_CACHE_TRUNCATE_ENTRIES; ++i) + { + StringCacheMap::iterator stringTruncCacheItr = font->string_cache.find(k); - hashmapPut(font->string_cache, new_key, res); - } - else if(res->next) - { - // move this entry to the tail of the linked list - // if it isn't already there - if(res->prev) - res->prev->next = res->next; - - res->next->prev = res->prev; - - if(!res->prev) - font->string_cache_head = res->next; - - res->next = NULL; - res->prev = font->string_cache_tail; - res->prev->next = res; - font->string_cache_tail = res; - - // truncate old entries - if(hashmapSize(font->string_cache) >= STRING_CACHE_MAX_ENTRIES) - { - printf("Truncating string cache entries.\n"); - int i; - StringCacheEntry *ent; - for(i = 0; i < STRING_CACHE_TRUNCATE_ENTRIES; ++i) - { - ent = font->string_cache_head; - font->string_cache_head = ent->next; - font->string_cache_head->prev = NULL; - - hashmapRemove(font->string_cache, ent->key); - - gr_ttf_freeStringCache(ent->key, ent, NULL); - } - } - } - return res; + if (stringTruncCacheItr != font->string_cache.end()) { + ent = stringTruncCacheItr->second; + gr_ttf_freeStringCache(ent->key, ent, nullptr); + font->string_cache.erase(stringTruncCacheItr); + } + } + } + } + return res; } -int gr_ttf_measureEx(const char *s, void *font) -{ - TrueTypeFont *f = (TrueTypeFont *)font; - int res = -1; +int twrpTruetype::gr_ttf_measureEx(const char *s, void *font) { + TrueTypeFont *f = (TrueTypeFont *)font; + int res = -1; - pthread_mutex_lock(&f->mutex); - StringCacheEntry *e = gr_ttf_string_cache_get(f, s, -1); - if(e) - res = e->surface.width; - pthread_mutex_unlock(&f->mutex); + pthread_mutex_lock(&f->mutex); + StringCacheEntry *e = gr_ttf_string_cache_get(f, s, -1); + if(e) + res = e->surface.width; + pthread_mutex_unlock(&f->mutex); - return res; + return res; } -int gr_ttf_maxExW(const char *s, void *font, int max_width) -{ - TrueTypeFont *f = (TrueTypeFont *)font; - TrueTypeCacheEntry *ent; - int max_bytes = 0, total_w = 0; - int utf_bytes, prev_utf_bytes = 0; - unsigned int unicode = 0; - int char_idx, prev_idx = 0; - FT_Vector delta; - StringCacheEntry *e; +int twrpTruetype::gr_ttf_maxExW(const char *s, void *font, int max_width) { + TrueTypeFont *f = (TrueTypeFont *)font; + TrueTypeCacheEntry *ent; + int max_bytes = 0, total_w = 0; + int utf_bytes, prev_utf_bytes = 0; + unsigned int unicode = 0; + int char_idx, prev_idx = 0; + FT_Vector delta; + StringCacheEntry *e; - pthread_mutex_lock(&f->mutex); + pthread_mutex_lock(&f->mutex); - e = gr_ttf_string_cache_peek(f, s, max_width); - if(e) - { - max_bytes = e->rendered_bytes; - pthread_mutex_unlock(&f->mutex); - return max_bytes; - } + e = gr_ttf_string_cache_peek(f, s, max_width); + if(e) + { + max_bytes = e->rendered_bytes; + pthread_mutex_unlock(&f->mutex); + return max_bytes; + } - while(*s) - { - utf_bytes = utf8_to_unicode(s, &unicode); - s += utf_bytes; + while(*s) + { + utf_bytes = utf8_to_unicode(s, &unicode); + s += utf_bytes; - char_idx = FT_Get_Char_Index(f->face, unicode); - if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) - { - FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); - total_w += delta.x >> 6; - } - prev_idx = char_idx; + char_idx = FT_Get_Char_Index(f->face, unicode); + if(FT_HAS_KERNING(f->face) && prev_idx && char_idx) + { + FT_Get_Kerning(f->face, prev_idx, char_idx, FT_KERNING_DEFAULT, &delta); + total_w += delta.x >> 6; + } + prev_idx = char_idx; - if(total_w > max_width) - { - max_bytes -= prev_utf_bytes; - break; - } - prev_utf_bytes = utf_bytes; + if(total_w > max_width) + { + max_bytes -= prev_utf_bytes; + break; + } + prev_utf_bytes = utf_bytes; + ent = gr_ttf_glyph_cache_get(f, char_idx); + if(!ent) + continue; - ent = gr_ttf_glyph_cache_get(f, char_idx); - if(!ent) - continue; - - total_w += ent->glyph->root.advance.x >> 16; - max_bytes += utf_bytes; - } - pthread_mutex_unlock(&f->mutex); - return max_bytes; + total_w += ent->glyph->root.advance.x >> 16; + max_bytes += utf_bytes; + } + pthread_mutex_unlock(&f->mutex); + return max_bytes; } -int gr_ttf_textExWH(void *context, int x, int y, - const char *s, void *pFont, - int max_width, int max_height, - const gr_surface gr_draw_surface) -{ - GGLContext *gl = (GGLContext *)context; - TrueTypeFont *font = (TrueTypeFont *)pFont; - const GRSurface *gr_draw = (const GRSurface*) gr_draw_surface; +int twrpTruetype::gr_ttf_textExWH(void *context, int x, int y, + const char *s, void *pFont, + int max_width, int max_height, + const gr_surface gr_draw_surface) { + GGLContext *gl = (GGLContext *)context; + TrueTypeFont *font = (TrueTypeFont *)pFont; + const GRSurface *gr_draw = (const GRSurface*) gr_draw_surface; - // not actualy max width, but max_width + x - if(max_width != -1) - { - max_width -= x; - if(max_width <= 0) - return 0; - } + // not actualy max width, but max_width + x + if(max_width != -1) + { + max_width -= x; + if(max_width <= 0) + return 0; + } - pthread_mutex_lock(&font->mutex); + pthread_mutex_lock(&font->mutex); - StringCacheEntry *e = gr_ttf_string_cache_get(font, s, max_width); - if(!e) - { - pthread_mutex_unlock(&font->mutex); - return -1; - } + StringCacheEntry *e = gr_ttf_string_cache_get(font, s, max_width); + if(!e) + { + pthread_mutex_unlock(&font->mutex); + return -1; + } #if TW_ROTATION != 0 - // Do not perform relatively expensive operation if not needed - GGLSurface string_surface_rotated; - string_surface_rotated.version = sizeof(string_surface_rotated); - // Skip the **(TW_ROTATION == 0)** || (TW_ROTATION == 180) check - // because we are under a TW_ROTATION != 0 conditional compilation statement - string_surface_rotated.width = (TW_ROTATION == 180) ? e->surface.width : e->surface.height; - string_surface_rotated.height = (TW_ROTATION == 180) ? e->surface.height : e->surface.width; - string_surface_rotated.stride = string_surface_rotated.width; - string_surface_rotated.format = e->surface.format; - // e->surface.format is GGL_PIXEL_FORMAT_A_8 (grayscale) - string_surface_rotated.data = (GGLubyte*) malloc(string_surface_rotated.stride * string_surface_rotated.height * 1); - surface_ROTATION_transform((gr_surface) &string_surface_rotated, (const gr_surface) &e->surface, 1); + // Do not perform relatively expensive operation if not needed + GGLSurface string_surface_rotated; + string_surface_rotated.version = sizeof(string_surface_rotated); + // Skip the **(TW_ROTATION == 0)** || (TW_ROTATION == 180) check + // because we are under a TW_ROTATION != 0 conditional compilation statement + string_surface_rotated.width = (TW_ROTATION == 180) ? e->surface.width : e->surface.height; + string_surface_rotated.height = (TW_ROTATION == 180) ? e->surface.height : e->surface.width; + string_surface_rotated.stride = string_surface_rotated.width; + string_surface_rotated.format = e->surface.format; + // e->surface.format is GGL_PIXEL_FORMAT_A_8 (grayscale) + string_surface_rotated.data = new GGLubyte[string_surface_rotated.stride * string_surface_rotated.height * 1]; + surface_ROTATION_transform((gr_surface) &string_surface_rotated, (const gr_surface) &e->surface, 1); #endif - int y_bottom = y + e->surface.height; - int res = e->rendered_bytes; + int y_bottom = y + e->surface.height; + int res = e->rendered_bytes; - if(max_height != -1 && max_height < y_bottom) - { - y_bottom = max_height; - if(y_bottom <= y) - { - pthread_mutex_unlock(&font->mutex); - return 0; - } - } + if(max_height != -1 && max_height < y_bottom) + { + y_bottom = max_height; + if(y_bottom <= y) + { + pthread_mutex_unlock(&font->mutex); + return 0; + } + } - // Figuring out display coordinates works for TW_ROTATION == 0 too, - // and isn't as expensive as allocating and rotating another surface, - // so we do this anyway. - int x0_disp, y0_disp, x1_disp, y1_disp; - int l_disp, r_disp, t_disp, b_disp; + // Figuring out display coordinates works for TW_ROTATION == 0 too, + // and isn't as expensive as allocating and rotating another surface, + // so we do this anyway. + int x0_disp, y0_disp, x1_disp, y1_disp; + int l_disp, r_disp, t_disp, b_disp; - x0_disp = ROTATION_X_DISP(x, y, gr_draw); - y0_disp = ROTATION_Y_DISP(x, y, gr_draw); - x1_disp = ROTATION_X_DISP(x + e->surface.width, y_bottom, gr_draw); - y1_disp = ROTATION_Y_DISP(x + e->surface.width, y_bottom, gr_draw); - l_disp = std::min(x0_disp, x1_disp); - r_disp = std::max(x0_disp, x1_disp); - t_disp = std::min(y0_disp, y1_disp); - b_disp = std::max(y0_disp, y1_disp); + x0_disp = ROTATION_X_DISP(x, y, gr_draw); + y0_disp = ROTATION_Y_DISP(x, y, gr_draw); + x1_disp = ROTATION_X_DISP(x + e->surface.width, y_bottom, gr_draw); + y1_disp = ROTATION_Y_DISP(x + e->surface.width, y_bottom, gr_draw); + l_disp = std::min(x0_disp, x1_disp); + r_disp = std::max(x0_disp, x1_disp); + t_disp = std::min(y0_disp, y1_disp); + b_disp = std::max(y0_disp, y1_disp); #if TW_ROTATION != 0 - gl->bindTexture(gl, &string_surface_rotated); + gl->bindTexture(gl, &string_surface_rotated); #else - gl->bindTexture(gl, &e->surface); + gl->bindTexture(gl, &e->surface); #endif - gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); - gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texEnvi(gl, GGL_TEXTURE_ENV, GGL_TEXTURE_ENV_MODE, GGL_REPLACE); + gl->texGeni(gl, GGL_S, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); + gl->texGeni(gl, GGL_T, GGL_TEXTURE_GEN_MODE, GGL_ONE_TO_ONE); - gl->enable(gl, GGL_TEXTURE_2D); - gl->texCoord2i(gl, -l_disp, -t_disp); - gl->recti(gl, l_disp, t_disp, r_disp, b_disp); - gl->disable(gl, GGL_TEXTURE_2D); + gl->enable(gl, GGL_TEXTURE_2D); + gl->texCoord2i(gl, -l_disp, -t_disp); + gl->recti(gl, l_disp, t_disp, r_disp, b_disp); + gl->disable(gl, GGL_TEXTURE_2D); #if TW_ROTATION != 0 - free(string_surface_rotated.data); + delete [] string_surface_rotated.data; #endif - pthread_mutex_unlock(&font->mutex); - return res; + pthread_mutex_unlock(&font->mutex); + return res; } -int gr_ttf_getMaxFontHeight(void *font) -{ - int res; - TrueTypeFont *f = (TrueTypeFont *)font; +int twrpTruetype::gr_ttf_getMaxFontHeight(void *font) { + int res; + TrueTypeFont *f = (TrueTypeFont *)font; - pthread_mutex_lock(&f->mutex); + pthread_mutex_lock(&f->mutex); - if(f->max_height == -1) - gr_ttf_calcMaxFontHeight(f); - res = f->max_height; + if(f->max_height == -1) + gr_ttf_calcMaxFontHeight(f); + res = f->max_height; - pthread_mutex_unlock(&f->mutex); - return res; -} - -static bool gr_ttf_dump_stats_count_string_cache(void *key __unused, void *value, void *context) -{ - int *string_cache_size = (int *)context; - StringCacheEntry *e = (StringCacheEntry *)value; - *string_cache_size += e->surface.height*e->surface.width + sizeof(StringCacheEntry); - return true; -} - -static bool gr_ttf_dump_stats_font(void *key, void *value, void *context) -{ - TrueTypeFontKey *k = (TrueTypeFontKey *)key; - TrueTypeFont *f = (TrueTypeFont *)value; - int *total_string_cache_size = (int *)context; - int string_cache_size = 0; - - pthread_mutex_lock(&f->mutex); - - hashmapForEach(f->string_cache, gr_ttf_dump_stats_count_string_cache, &string_cache_size); - - printf(" Font %s (size %d, dpi %d):\n" - " refcount: %d\n" - " max_height: %d\n" - " base: %d\n" - " glyph_cache: %zu entries\n" - " string_cache: %zu entries (%.2f kB)\n", - k->path, k->size, k->dpi, - f->refcount, f->max_height, f->base, - hashmapSize(f->glyph_cache), - hashmapSize(f->string_cache), ((double)string_cache_size)/1024); - - pthread_mutex_unlock(&f->mutex); - - *total_string_cache_size += string_cache_size; - return true; -} - -void gr_ttf_dump_stats(void) -{ - pthread_mutex_lock(&font_data.mutex); - - printf("TrueType fonts system stats: "); - if(!font_data.fonts) - printf("no truetype fonts loaded.\n"); - else - { - int total_string_cache_size = 0; - printf("%zu fonts loaded.\n", hashmapSize(font_data.fonts)); - hashmapForEach(font_data.fonts, gr_ttf_dump_stats_font, &total_string_cache_size); - printf(" Total string cache size: %.2f kB\n", ((double)total_string_cache_size)/1024); - } - - pthread_mutex_unlock(&font_data.mutex); + pthread_mutex_unlock(&f->mutex); + return res; } diff --git a/minuitwrp/truetype.hpp b/minuitwrp/truetype.hpp new file mode 100755 index 00000000..e0d7a2f1 --- /dev/null +++ b/minuitwrp/truetype.hpp @@ -0,0 +1,121 @@ +/* + Copyright 2013 to 2020 TeamWin + TWRP is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + TWRP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with TWRP. If not, see . +*/ + +#ifndef _TWRP_TRUETYPE_HPP +#define _TWRP_TRUETYPE_HPP + +#include +#include +#include FT_FREETYPE_H +#include FT_GLYPH_H +#include +#include "minui.h" + +struct TrueTypeFontKey { + int size; + int dpi; + char *path; + + bool operator<(const TrueTypeFontKey &ttfk) const { + return size < ttfk.size || (size == ttfk.size && dpi < ttfk.dpi) || (size == ttfk.size && dpi == ttfk.dpi + && std::strcmp(path, ttfk.path) < 0) || (size == ttfk.size && std::strcmp(path, ttfk.path) > 0); + } +}; + +typedef struct TrueTypeFontKey TrueTypeFontKey; + +typedef struct { + FT_BBox bbox; + FT_BitmapGlyph glyph; +} TrueTypeCacheEntry; + +struct StringCacheKey { + char *text; + int max_width; + + bool operator<(const StringCacheKey &sck) const { + return max_width < sck.max_width || (max_width == sck.max_width + && std::strcmp(text, sck.text) < 0) || (max_width == sck.max_width && std::strcmp(text, sck.text) > 0); + } +}; + +typedef struct StringCacheKey StringCacheKey; + +typedef struct StringCacheEntry { + GGLSurface surface; + int rendered_bytes; // number of bytes from C string rendered, not number of UTF8 characters! + StringCacheKey *key; +} StringCacheEntry; + +typedef struct { + int type; + int refcount; + int size; + int dpi; + int max_height; + int base; + FT_Face face; + std::map glyph_cache; + std::map string_cache; + pthread_mutex_t mutex; + TrueTypeFontKey *key; +} TrueTypeFont; + +typedef struct { + FT_Library ft_library; + std::map fonts; + pthread_mutex_t mutex; +} FontData; + +typedef std::map StringCacheMap; +typedef std::map TrueTypeCacheEntryMap; +typedef std::map TrueTypeFontMap; + +#define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) +#define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) + +// 32bit FNV-1a hash algorithm +// http://isthe.com/chongo/tech/comp/fnv/#FNV-1a +static const uint32_t FNV_prime = 16777619U; +static const uint32_t offset_basis = 2166136261U; + +#define STRING_CACHE_MAX_ENTRIES 400 +#define STRING_CACHE_TRUNCATE_ENTRIES 150 + +class twrpTruetype { +public: + twrpTruetype(); + static int utf8_to_unicode(const char* pIn, unsigned int *pOut); + static void* gr_ttf_loadFont(const char *filename, int size, int dpi); + static void* gr_ttf_scaleFont(void *font, int max_width, int measured_width); + static bool gr_ttf_freeStringCache(void *key, void *value, void *context __unused); + static void gr_ttf_freeFont(void *font); + static TrueTypeCacheEntry* gr_ttf_glyph_cache_peek(TrueTypeFont *font, int char_index); + static TrueTypeCacheEntry* gr_ttf_glyph_cache_get(TrueTypeFont *font, int char_index); + static int gr_ttf_copy_glyph_to_surface(GGLSurface *dest, FT_BitmapGlyph glyph, int offX, int offY, int base); + static void gr_ttf_calcMaxFontHeight(TrueTypeFont *f); + static int gr_ttf_render_text(TrueTypeFont *font, GGLSurface *surface, const char *text, int max_width); + static StringCacheEntry* gr_ttf_string_cache_peek(TrueTypeFont *font, const char *text, __attribute__((unused)) int max_width); + static StringCacheEntry* gr_ttf_string_cache_get(TrueTypeFont *font, const char *text, int max_width); + static int gr_ttf_measureEx(const char *s, void *font); + static int gr_ttf_maxExW(const char *s, void *font, int max_width); + static int gr_ttf_textExWH(void *context, int x, int y, + const char *s, void *pFont, + int max_width, int max_height, + const gr_surface gr_draw_surface); + static int gr_ttf_getMaxFontHeight(void *font); +}; +#endif // _TWRP_TRUETYPE_HPP diff --git a/minzip/Zip.c b/minzip/Zip.c old mode 100644 new mode 100755 diff --git a/mmcutils/Android.mk b/mmcutils/Android.mk index 119b40fc..40cda36b 100644 --- a/mmcutils/Android.mk +++ b/mmcutils/Android.mk @@ -7,7 +7,7 @@ LOCAL_SRC_FILES := \ mmcutils.c LOCAL_MODULE := libmmcutils -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_STATIC_LIBRARY) @@ -18,7 +18,7 @@ LOCAL_SRC_FILES := \ mmcutils.c LOCAL_MODULE := libmmcutils -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional include $(BUILD_SHARED_LIBRARY) diff --git a/mtdutils/Android.mk b/mtdutils/Android.mk index 87ac0812..b952e362 100644 --- a/mtdutils/Android.mk +++ b/mtdutils/Android.mk @@ -48,14 +48,14 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := bml_over_mtd.c LOCAL_C_INCLUDES += $(commands_recovery_local_path)/mtdutils LOCAL_MODULE := libbml_over_mtd -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_CFLAGS += -Dmain=bml_over_mtd_main include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_SRC_FILES := bml_over_mtd.c LOCAL_MODULE := bml_over_mtd -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := UTILITY_EXECUTABLES LOCAL_MODULE_PATH := $(PRODUCT_OUT)/utilities LOCAL_UNSTRIPPED_PATH := $(PRODUCT_OUT)/symbols/utilities diff --git a/mtp/ffs/Android.mk b/mtp/ffs/Android.mk old mode 100644 new mode 100755 index 9e75e0d3..740afcb1 --- a/mtp/ffs/Android.mk +++ b/mtp/ffs/Android.mk @@ -5,14 +5,17 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtwrpmtp-ffs LOCAL_MODULE_TAGS := optional -LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -DMTP_DEVICE -DMTP_HOST -fno-strict-aliasing -Wno-unused-variable -Wno-format -Wno-unused-parameter -Wno-unused-private-field -LOCAL_C_INCLUDES += $(LOCAL_PATH) bionic frameworks/base/include system/core/include bionic/libc/private/ bootable/recovery/twrplibusbhost/include -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0) - LOCAL_C_INCLUDES += external/stlport/stlport - LOCAL_SHARED_LIBRARIES += libstlport -else - LOCAL_SHARED_LIBRARIES += libc++ -endif +LOCAL_CFLAGS = -D_FILE_OFFSET_BITS=64 -DMTP_DEVICE -DMTP_HOST -fno-strict-aliasing \ + -Wno-unused-variable -Wno-format -Wno-unused-parameter -Wno-unused-private-field \ + -Wno-implicit-fallthrough +LOCAL_C_INCLUDES += $(LOCAL_PATH) bionic \ + frameworks/base/include \ + system/core/include \ + bionic/libc/private/ \ + bootable/recovery/twrplibusbhost/include \ + bootable/recovery/install/include + +LOCAL_SHARED_LIBRARIES += libc++ libaosprecovery LOCAL_SRC_FILES = \ MtpDataPacket.cpp \ @@ -54,7 +57,6 @@ LOCAL_SHARED_LIBRARIES += libz \ libdl \ libcutils \ libutils \ - libaosprecovery \ libselinux \ libbase diff --git a/mtp/ffs/MtpStorage.h b/mtp/ffs/MtpStorage.h index 9d6d2911..8d12b07d 100755 --- a/mtp/ffs/MtpStorage.h +++ b/mtp/ffs/MtpStorage.h @@ -23,7 +23,7 @@ #include "MtpTypes.h" #include "mtp.h" #include "btree.hpp" -#include "../../tw_atomic.hpp" +#include "tw_atomic.hpp" class MtpDatabase; diff --git a/openaes/Android.mk b/openaes/Android.mk index ef6fcb0b..a628784a 100644 --- a/openaes/Android.mk +++ b/openaes/Android.mk @@ -9,7 +9,7 @@ ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true) $(commands_recovery_local_path)/openaes/inc LOCAL_CFLAGS:= -g -c -W LOCAL_MODULE:=openaes - LOCAL_MODULE_TAGS:= eng + LOCAL_MODULE_TAGS:= optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_SHARED_LIBRARIES = libopenaes libc @@ -18,7 +18,7 @@ ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true) # Build shared library include $(CLEAR_VARS) LOCAL_MODULE := libopenaes - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES := \ $(commands_recovery_local_path)/openaes/src/isaac \ $(commands_recovery_local_path)/openaes/inc @@ -29,7 +29,7 @@ ifneq ($(TW_EXCLUDE_ENCRYPTED_BACKUPS), true) # Build static library include $(CLEAR_VARS) LOCAL_MODULE := libopenaes_static - LOCAL_MODULE_TAGS := eng + LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES := \ $(commands_recovery_local_path)/openaes/src/isaac \ $(commands_recovery_local_path)/openaes/inc diff --git a/openrecoveryscript.cpp b/openrecoveryscript.cpp index 1de08707..120dfca5 100755 --- a/openrecoveryscript.cpp +++ b/openrecoveryscript.cpp @@ -44,14 +44,14 @@ #include "openrecoveryscript.hpp" #include "progresstracking.hpp" #include "variables.h" -#include "adb_install.h" +#include "install/adb_install.h" #include "data.hpp" -#include "adb_install.h" #include "fuse_sideload.h" #include "gui/gui.hpp" #include "gui/pages.hpp" #include "orscmd/orscmd.h" #include "twinstall.h" +#include "install/adb_install.h" extern "C" { #include "gui/gui.h" #include "cutils/properties.h" @@ -253,8 +253,8 @@ int OpenRecoveryScript::run_script_file(void) { gui_msg(Msg("set_restore_opt=Setting restore options: '{1}':")(value2)); line_len = strlen(value2); for (i=0; i>>>>>> android-10.0.0_r25 "rangeset.cpp", ], @@ -69,6 +61,7 @@ cc_library_static { "libext4_utils", "libfs_mgr", "libselinux", + "libziparchive", ], }, }, diff --git a/otautil/Android.mk b/otautil/Android.mk deleted file mode 100644 index feb468de..00000000 --- a/otautil/Android.mk +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (C) 2016 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - SysUtil.cpp \ - DirUtil.cpp \ - ZipUtil.cpp \ - ThermalUtil.cpp - -LOCAL_STATIC_LIBRARIES := \ - libselinux \ - libbase - -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 26; echo $$?),0) -# Android 8.1 header -LOCAL_C_INCLUDES += \ - system/core/libziparchive/include -endif - -LOCAL_MODULE := libotautil -LOCAL_CFLAGS := \ - -Werror \ - -Wall - -LOCAL_C_INCLUDES := include - -include $(BUILD_STATIC_LIBRARY) diff --git a/otautil/include/otautil/logging.h b/otautil/include/otautil/logging.h old mode 100644 new mode 100755 index 57125e4f..60834978 --- a/otautil/include/otautil/logging.h +++ b/otautil/include/otautil/logging.h @@ -21,15 +21,10 @@ #include #include -<<<<<<< HEAD:rotate_logs.h -//#include -#include /* private pmsg functions */ -======= #include #include #include ->>>>>>> android-10.0.0_r25:otautil/include/otautil/logging.h static constexpr int KEEP_LOG_COUNT = 10; diff --git a/otautil/include/otautil/roots.h b/otautil/include/otautil/roots.h index a2c51e27..482f3d05 100644 --- a/otautil/include/otautil/roots.h +++ b/otautil/include/otautil/roots.h @@ -22,8 +22,6 @@ using Volume = android::fs_mgr::FstabEntry; -typedef struct fstab_rec Volume; - // Load and parse volume data from /etc/recovery.fstab. void load_volume_table(); diff --git a/partition.cpp b/partition.cpp index beb4a81d..581593ca 100644 --- a/partition.cpp +++ b/partition.cpp @@ -667,7 +667,7 @@ void TWPartition::Setup_Data_Partition(bool Display_Error) { LOGINFO("Trying wrapped key.\n"); property_set("fbe.data.wrappedkey", "true"); if (!Decrypt_FBE_DE()) { - LOGINFO("Unable to decrypt device\n"); + LOGERR("Unable to decrypt FBE device\n"); } } } @@ -932,6 +932,7 @@ void TWPartition::Apply_TW_Flag(const unsigned flag, const char* str, const bool break; case TWFLAG_KEYDIRECTORY: Key_Directory = str; + break; default: // Should not get here LOGINFO("Flag identified for processing, but later unmatched: %i\n", flag); @@ -1128,7 +1129,6 @@ void TWPartition::Setup_Data_Media() { DataManager::SetValue("tw_has_internal", 1); DataManager::SetValue("tw_has_data_media", 1); backup_exclusions.add_absolute_dir("/data/data/com.google.android.music/files"); - backup_exclusions.add_absolute_dir("/data/per_boot"); // DJ9,14Jan2020 - exclude this dir to prevent "error 255" on AOSP ROMs that create and lock it wipe_exclusions.add_absolute_dir(Mount_Point + "/misc/vold"); // adopted storage keys ExcludeAll(Mount_Point + "/.layout_version"); ExcludeAll(Mount_Point + "/system/storage.xml"); diff --git a/partitionmanager.cpp b/partitionmanager.cpp index b2654698..19c527fe 100755 --- a/partitionmanager.cpp +++ b/partitionmanager.cpp @@ -515,7 +515,7 @@ int TWPartitionManager::Mount_By_Path(string Path, bool Display_Error) { bool found = false; string Local_Path = TWFunc::Get_Root_Path(Path); - if (Local_Path == "/tmp" || Local_Path == "/" || Local_Path == "/etc") + if (Local_Path == "/tmp" || Local_Path == "/") return true; // Iterate through all partitions @@ -799,7 +799,6 @@ int TWPartitionManager::Run_Backup(bool adbbackup) { string Backup_Name, Backup_List, backup_path; unsigned long long total_bytes = 0, free_space = 0; TWPartition* storage = NULL; - std::vector::iterator subpart; struct tm *t; time_t seconds, total_start, total_stop; size_t start_pos = 0, end_pos = 0; @@ -2960,7 +2959,7 @@ void TWPartitionManager::read_uevent() { int len = recv(uevent_pfd.fd, buf, sizeof(buf), MSG_DONTWAIT); if (len == -1) { - LOGINFO("recv error on uevent\n"); + LOGERR("recv error on uevent\n"); return; } /*int i = 0; // Print all uevent output for test /debug diff --git a/partitions.hpp b/partitions.hpp old mode 100644 new mode 100755 diff --git a/pigz/Android.mk b/pigz/Android.mk index 89f9635d..ad7f39dd 100644 --- a/pigz/Android.mk +++ b/pigz/Android.mk @@ -3,7 +3,7 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := pigz -LOCAL_MODULE_TAGS := eng optional +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin LOCAL_CFLAGS := diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk old mode 100644 new mode 100755 index d3307999..87496af5 --- a/prebuilt/Android.mk +++ b/prebuilt/Android.mk @@ -18,17 +18,27 @@ RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/bu ifneq ($(TW_USE_TOOLBOX), true) RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/busybox else - RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sh + else + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/sh + endif RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrypto.so ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 23; echo $$?),0) - RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/grep + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/grep + else + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/grep + endif LOCAL_POST_INSTALL_CMD += $(hide) if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep" ]; then \ - rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; fi; ln -sr $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; \ + rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/egrep; \ if [ -e "$(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep" ]; then \ - rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; fi; ln -sr $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; - RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toybox + rm $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; fi; ln -s $(TARGET_RECOVERY_ROOT_OUT)/sbin/grep $(TARGET_RECOVERY_ROOT_OUT)/sbin/fgrep; + # RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toybox ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 23; echo $$?),0) - RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dd + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dd + endif endif ifneq ($(wildcard external/zip/Android.mk),) RELINK_SOURCE_FILES += $(TARGET_OUT_OPTIONAL_EXECUTABLES)/zip @@ -49,7 +59,11 @@ RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fsck.fat RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fatlabel RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.fat ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 27; echo $$?),0) - RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/adbd + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -le 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/adbd + else + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/adbd + endif endif RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) @@ -66,15 +80,42 @@ ifeq ($(TARGET_ARCH), x86_64) RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker64 endif ifeq ($(TARGET_ARCH), arm64) - RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker64 + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/linker64 + else + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/linker64 + endif endif #RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/twrpmtp -RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc.so +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libc.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libdl.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libm.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbacktrace.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libbootloader_message.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfs_mgr.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libfscrypt.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libgsi.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libkeyutils.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblogwrap.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/liblp.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libprocessgroup_setup.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libadbd_services.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libcap.so + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libminijail.so + # RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/lib64/libinit.so + RELINK_SOURCE_FILES += $(TARGET_ROOT_OUT)/../system/lib64/libdl_android.so +else + RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libc.so + RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdl.so + RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libm.so +endif RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcutils.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libcrecovery.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libusbhost.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libutils.so -RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libdl.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_com_err.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2_e2p.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libext2fs.so @@ -94,12 +135,13 @@ ifneq ($(wildcard external/e2fsprogs/lib/blkid/Android.*),) endif RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libpng.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/liblog.so -RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libm.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libstdc++.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libz.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminuitwrp.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminadbd.so -RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminzip.so +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libminzip.so +endif RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmtdutils.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtar.so RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libtwadbbu.so @@ -150,7 +192,11 @@ endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0) RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libmincrypttwrp.so endif -RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toolbox +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/system/bin/toolbox +else + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/toolbox +endif ifneq ($(TW_OEM_BUILD),true) RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/twrp @@ -290,9 +336,17 @@ ifeq ($(TARGET_USERIMAGES_USE_F2FS), true) RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs RELINK_SOURCE_FILES += $(TARGET_OUT_SHARED_LIBRARIES)/libf2fs.so else ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.f2fs + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/make_f2fs + else + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.f2fs + endif ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 28; echo $$?),0) - RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/sload.f2fs + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 29; echo $$?),0) + RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/sload_f2fs + else + RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/sload.f2fs + endif endif else ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 24; echo $$?),0) RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mkfs.f2fs @@ -405,24 +459,30 @@ ifneq ($(TW_USE_TOOLBOX), true) TW_BB_SYMLINKS := busybox_symlinks endif -TWRP_AUTOGEN := $(intermediates)/teamwin -GEN := $(intermediates)/teamwin -$(GEN): $(RELINK) $(TW_BB_SYMLINKS) toolbox_symlinks -$(GEN): $(RELINK_SOURCE_FILES) $(call intermediates-dir-for,EXECUTABLES,init)/init - $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/sbin $(RELINK_SOURCE_FILES) +# GEN := $(intermediates)/teamwin +# $(GEN): $(RELINK) $(TW_BB_SYMLINKS) toolbox_symlinks -LOCAL_GENERATED_SOURCES := $(GEN) -LOCAL_SRC_FILES := teamwin $(GEN) -include $(BUILD_PREBUILT) - -#permissive.sh +#relink recovery executables linker to /sbin include $(CLEAR_VARS) -LOCAL_MODULE := permissive.sh -LOCAL_MODULE_TAGS := eng +LOCAL_MODULE := relink +LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin -LOCAL_SRC_FILES := $(LOCAL_MODULE) -include $(BUILD_PREBUILT) +LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT)/sbin $(RELINK_SOURCE_FILES) +LOCAL_REQUIRED_MODULES := linker toolbox_symlinks adbd libdl_android +include $(BUILD_PHONY_PACKAGE) + +#relink init +include $(CLEAR_VARS) +LOCAL_MODULE := relink_init +LOCAL_MODULE_TAGS := optional +LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT) +RELINK_INIT := $(TARGET_RECOVERY_ROOT_OUT)/system/bin/init +LOCAL_POST_INSTALL_CMD += $(RELINK) $(TARGET_RECOVERY_ROOT_OUT) $(RELINK_INIT) && \ + ln -sf ../init $(TARGET_RECOVERY_ROOT_OUT)/sbin/ueventd +LOCAL_REQUIRED_MODULES := init_second_stage.recovery +include $(BUILD_PHONY_PACKAGE) #mke2fs.conf ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 26; echo $$?),0) @@ -542,16 +602,16 @@ ifeq ($(TW_INCLUDE_DUMLOCK), true) include $(BUILD_PREBUILT) endif -ifeq ($(TW_USE_TOOLBOX), true) - include $(CLEAR_VARS) - LOCAL_MODULE := mkshrc_twrp - LOCAL_MODULE_STEM := mkshrc - LOCAL_MODULE_TAGS := eng - LOCAL_MODULE_CLASS := ETC - LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc - LOCAL_SRC_FILES := $(LOCAL_MODULE) - include $(BUILD_PREBUILT) -endif +#ifeq ($(TW_USE_TOOLBOX), true) +# include $(CLEAR_VARS) +# LOCAL_MODULE := mkshrc_twrp +# LOCAL_MODULE_STEM := mkshrc +# LOCAL_MODULE_TAGS := eng +# LOCAL_MODULE_CLASS := ETC +# LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/etc +# LOCAL_SRC_FILES := $(LOCAL_MODULE) +# include $(BUILD_PREBUILT) +#endif #TWRP App "placeholder" include $(CLEAR_VARS) diff --git a/prebuilt/permissive.sh b/prebuilt/permissive.sh deleted file mode 100755 index f1046f94..00000000 --- a/prebuilt/permissive.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/sbin/sh - -# We use this shell script because the script will follow symlinks and -# different trees will use different binaries to supply the setenforce -# tool. Before M we use toolbox, M and beyond will use toybox. The init -# binary and init.rc will not follow symlinks. - -setenforce 0 diff --git a/prebuilt/relink b/prebuilt/relink new file mode 100644 index 00000000..e69de29b diff --git a/prebuilt/relink.sh b/prebuilt/relink.sh index 2dd56147..3fa627f9 100755 --- a/prebuilt/relink.sh +++ b/prebuilt/relink.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash -x process_file() { @@ -8,10 +8,10 @@ process_file() cp -f -p $src $src.tmp src=$2.tmp else - cp -f -p $src $dst + cp -f -p --remove-destination $src $dst fi - sed "s|/system/bin/linker64\x0|/sbin/linker64\x0\x0\x0\x0\x0\x0\x0|g" $src | sed "s|/system/bin/linker\x0|/sbin/linker\x0\x0\x0\x0\x0\x0\x0|g" | sed "s|/system/bin/sh\x0|/sbin/sh\x0\x0\x0\x0\x0\x0\x0|g" | sed "s|/system/lib64\x0|/sbin\x0\x0\x0\x0\x0\x0\x0\x0\x0|g" | sed "s|/system/lib\x0|/sbin\x0\x0\x0\x0\x0\x0\x0|g" > $dst + sed "s|/system/bin/linker64\x0|/sbin/linker64\x0\x0\x0\x0\x0\x0\x0|g" $src | sed "s|/system/bin/linker\x0|/sbin/linker\x0\x0\x0\x0\x0\x0\x0|g" | sed "s|/system/bin/sh\x0|/sbin/sh\x0\x0\x0\x0\x0\x0\x0|g" > $dst if [ $1 == $(dirname $2) ]; then rm -f $src diff --git a/prebuilt/relink_init b/prebuilt/relink_init new file mode 100644 index 00000000..e69de29b diff --git a/recovery_ui/include/recovery_ui/device.h b/recovery_ui/include/recovery_ui/device.h old mode 100644 new mode 100755 index 7c76cdb0..c85da2ad --- a/recovery_ui/include/recovery_ui/device.h +++ b/recovery_ui/include/recovery_ui/device.h @@ -22,9 +22,9 @@ #include #include #include - +#include "ui.h" // Forward declaration to avoid including "ui.h". -class RecoveryUI; +// class RecoveryUI; class Device { public: diff --git a/rotate_logs.cpp b/rotate_logs.cpp deleted file mode 100644 index 76b7f4b0..00000000 --- a/rotate_logs.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "rotate_logs.h" - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include /* private pmsg functions */ - -static const std::string LAST_KMSG_FILTER = "recovery/last_kmsg"; -static const std::string LAST_LOG_FILTER = "recovery/last_log"; - -ssize_t logbasename(log_id_t /* id */, char /* prio */, const char* filename, const char* /* buf */, - size_t len, void* arg) { - bool* do_rotate = static_cast(arg); - if (LAST_KMSG_FILTER.find(filename) != std::string::npos || - LAST_LOG_FILTER.find(filename) != std::string::npos) { - *do_rotate = true; - } - return len; -} - -ssize_t logrotate(log_id_t id, char prio, const char* filename, const char* buf, size_t len, - void* arg) { - bool* do_rotate = static_cast(arg); - if (!*do_rotate) { - return __android_log_pmsg_file_write(id, prio, filename, buf, len); - } - - std::string name(filename); - size_t dot = name.find_last_of('.'); - std::string sub = name.substr(0, dot); - - if (LAST_KMSG_FILTER.find(sub) == std::string::npos && - LAST_LOG_FILTER.find(sub) == std::string::npos) { - return __android_log_pmsg_file_write(id, prio, filename, buf, len); - } - - // filename rotation - if (dot == std::string::npos) { - name += ".1"; - } else { - std::string number = name.substr(dot + 1); - if (!isdigit(number[0])) { - name += ".1"; - } else { - size_t i; - if (!android::base::ParseUint(number.c_str(), &i)) { - LOG(ERROR) << "failed to parse uint in " << number; - return -1; - } - name = sub + "." + std::to_string(i + 1); - } - } - - return __android_log_pmsg_file_write(id, prio, name.c_str(), buf, len); -} - -// Rename last_log -> last_log.1 -> last_log.2 -> ... -> last_log.$max. -// Similarly rename last_kmsg -> last_kmsg.1 -> ... -> last_kmsg.$max. -// Overwrite any existing last_log.$max and last_kmsg.$max. -void rotate_logs(const char* last_log_file, const char* last_kmsg_file) { - // Logs should only be rotated once. - static bool rotated = false; - if (rotated) { - return; - } - rotated = true; - - for (int i = KEEP_LOG_COUNT - 1; i >= 0; --i) { - std::string old_log = android::base::StringPrintf("%s", last_log_file); - if (i > 0) { - old_log += "." + std::to_string(i); - } - std::string new_log = android::base::StringPrintf("%s.%d", last_log_file, i + 1); - // Ignore errors if old_log doesn't exist. - rename(old_log.c_str(), new_log.c_str()); - - std::string old_kmsg = android::base::StringPrintf("%s", last_kmsg_file); - if (i > 0) { - old_kmsg += "." + std::to_string(i); - } - std::string new_kmsg = android::base::StringPrintf("%s.%d", last_kmsg_file, i + 1); - rename(old_kmsg.c_str(), new_kmsg.c_str()); - } -} diff --git a/sepolicy/twrp.te b/sepolicy/twrp.te old mode 100644 new mode 100755 index d81b9e19..44ceaf89 --- a/sepolicy/twrp.te +++ b/sepolicy/twrp.te @@ -1,4 +1,4 @@ recovery_only(` - # Allow recovery to set permissive mode permissive recovery; + permissive init; ') diff --git a/simg2img/Android.mk b/simg2img/Android.mk index 74755e7d..b0bb4f14 100644 --- a/simg2img/Android.mk +++ b/simg2img/Android.mk @@ -1,8 +1,8 @@ LOCAL_PATH := system/core/libsparse include $(CLEAR_VARS) -LOCAL_SRC_FILES := simg2img.c \ - sparse_crc32.c +LOCAL_SRC_FILES := simg2img.cpp \ + sparse_crc32.cpp LOCAL_MODULE := simg2img_twrp LOCAL_MODULE_STEM := simg2img LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin diff --git a/tests/Android.mk b/tests/Android.mk old mode 100644 new mode 100755 index f19ca36c..5cf00d32 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -14,211 +14,211 @@ # limitations under the License. # -LOCAL_PATH := $(call my-dir) +# LOCAL_PATH := $(call my-dir) # Unit tests -include $(CLEAR_VARS) -LOCAL_CFLAGS := -Wall -Werror -LOCAL_MODULE := recovery_unit_test -LOCAL_COMPATIBILITY_SUITE := device-tests -LOCAL_STATIC_LIBRARIES := \ - libverifier \ - libminui \ - libotautil \ - libupdater \ - libziparchive \ - libutils \ - libz \ - libselinux \ - libbase \ - libBionicGtestMain +# include $(CLEAR_VARS) +# LOCAL_CFLAGS := -Wall -Werror +# LOCAL_MODULE := recovery_unit_test +# LOCAL_COMPATIBILITY_SUITE := device-tests +# LOCAL_STATIC_LIBRARIES := \ +# libverifier \ +# libminui \ +# libotautil \ +# libupdater \ +# libziparchive \ +# libutils \ +# libz \ +# libselinux \ +# libbase \ +# libBionicGtestMain -LOCAL_SRC_FILES := \ - unit/asn1_decoder_test.cpp \ - unit/dirutil_test.cpp \ - unit/locale_test.cpp \ - unit/rangeset_test.cpp \ - unit/sysutil_test.cpp \ - unit/zip_test.cpp \ - unit/ziputil_test.cpp +# LOCAL_SRC_FILES := \ +# unit/asn1_decoder_test.cpp \ +# unit/dirutil_test.cpp \ +# unit/locale_test.cpp \ +# unit/rangeset_test.cpp \ +# unit/sysutil_test.cpp \ +# unit/zip_test.cpp \ +# unit/ziputil_test.cpp -LOCAL_C_INCLUDES := $(commands_recovery_local_path) -LOCAL_SHARED_LIBRARIES := liblog -include $(BUILD_NATIVE_TEST) +# LOCAL_C_INCLUDES := $(commands_recovery_local_path) +# LOCAL_SHARED_LIBRARIES := liblog +# include $(BUILD_NATIVE_TEST) # Manual tests -include $(CLEAR_VARS) -LOCAL_CFLAGS := -Wall -Werror -LOCAL_MODULE := recovery_manual_test -LOCAL_STATIC_LIBRARIES := \ - libminui \ - libbase \ - libBionicGtestMain +# include $(CLEAR_VARS) +# LOCAL_CFLAGS := -Wall -Werror +# LOCAL_MODULE := recovery_manual_test +# LOCAL_STATIC_LIBRARIES := \ +# libminui \ +# libbase \ +# libBionicGtestMain -LOCAL_SRC_FILES := manual/recovery_test.cpp -LOCAL_SHARED_LIBRARIES := \ - liblog \ - libpng +# LOCAL_SRC_FILES := manual/recovery_test.cpp +# LOCAL_SHARED_LIBRARIES := \ +# liblog \ +# libpng -resource_files := $(call find-files-in-subdirs, bootable/recovery, \ - "*_text.png", \ - res-mdpi/images \ - res-hdpi/images \ - res-xhdpi/images \ - res-xxhdpi/images \ - res-xxxhdpi/images \ - ) +# resource_files := $(call find-files-in-subdirs, bootable/recovery, \ +# "*_text.png", \ +# res-mdpi/images \ +# res-hdpi/images \ +# res-xhdpi/images \ +# res-xxhdpi/images \ +# res-xxxhdpi/images \ +# ) -# The resource image files that will go to $OUT/data/nativetest/recovery. -testimage_out_path := $(TARGET_OUT_DATA)/nativetest/recovery -GEN := $(addprefix $(testimage_out_path)/, $(resource_files)) +# # The resource image files that will go to $OUT/data/nativetest/recovery. +# testimage_out_path := $(TARGET_OUT_DATA)/nativetest/recovery +# GEN := $(addprefix $(testimage_out_path)/, $(resource_files)) -$(GEN): PRIVATE_PATH := $(LOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ -$(GEN): $(testimage_out_path)/% : bootable/recovery/% - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) +# $(GEN): PRIVATE_PATH := $(LOCAL_PATH) +# $(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ +# $(GEN): $(testimage_out_path)/% : bootable/recovery/% +# $(transform-generated-source) +# LOCAL_GENERATED_SOURCES += $(GEN) -include $(BUILD_NATIVE_TEST) +# include $(BUILD_NATIVE_TEST) # Component tests -include $(CLEAR_VARS) -LOCAL_CFLAGS := \ - -Wall \ - -Werror \ - -D_FILE_OFFSET_BITS=64 +# include $(CLEAR_VARS) +# LOCAL_CFLAGS := \ +# -Wall \ +# -Werror \ +# -D_FILE_OFFSET_BITS=64 -ifeq ($(AB_OTA_UPDATER),true) -LOCAL_CFLAGS += -DAB_OTA_UPDATER=1 -endif +# ifeq ($(AB_OTA_UPDATER),true) +# LOCAL_CFLAGS += -DAB_OTA_UPDATER=1 +# endif -ifeq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),true) -LOCAL_CFLAGS += -DPRODUCT_SUPPORTS_VERITY=1 -endif +# ifeq ($(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SUPPORTS_VERITY),true) +# LOCAL_CFLAGS += -DPRODUCT_SUPPORTS_VERITY=1 +# endif -ifeq ($(BOARD_AVB_ENABLE),true) -LOCAL_CFLAGS += -DBOARD_AVB_ENABLE=1 -endif +# ifeq ($(BOARD_AVB_ENABLE),true) +# LOCAL_CFLAGS += -DBOARD_AVB_ENABLE=1 +# endif -LOCAL_MODULE := recovery_component_test -LOCAL_COMPATIBILITY_SUITE := device-tests -LOCAL_C_INCLUDES := $(commands_recovery_local_path) -LOCAL_SRC_FILES := \ - component/applypatch_test.cpp \ - component/bootloader_message_test.cpp \ - component/edify_test.cpp \ - component/imgdiff_test.cpp \ - component/install_test.cpp \ - component/sideload_test.cpp \ - component/uncrypt_test.cpp \ - component/updater_test.cpp \ - component/update_verifier_test.cpp \ - component/verifier_test.cpp +# LOCAL_MODULE := recovery_component_test +# LOCAL_COMPATIBILITY_SUITE := device-tests +# LOCAL_C_INCLUDES := $(commands_recovery_local_path) +# LOCAL_SRC_FILES := \ +# component/applypatch_test.cpp \ +# component/bootloader_message_test.cpp \ +# component/edify_test.cpp \ +# component/imgdiff_test.cpp \ +# component/install_test.cpp \ +# component/sideload_test.cpp \ +# component/uncrypt_test.cpp \ +# component/updater_test.cpp \ +# component/update_verifier_test.cpp \ +# component/verifier_test.cpp -LOCAL_SHARED_LIBRARIES := \ - libhidlbase +# LOCAL_SHARED_LIBRARIES := \ +# libhidlbase -tune2fs_static_libraries := \ - libext2_com_err \ - libext2_blkid \ - libext2_quota \ - libext2_uuid \ - libext2_e2p \ - libext2fs +# tune2fs_static_libraries := \ +# libext2_com_err \ +# libext2_blkid \ +# libext2_quota \ +# libext2_uuid \ +# libext2_e2p \ +# libext2fs -LOCAL_STATIC_LIBRARIES := \ - libapplypatch_modes \ - libapplypatch \ - libedify \ - libimgdiff \ - libimgpatch \ - libbsdiff \ - libbspatch \ - libfusesideload \ - libotafault \ - librecovery \ - libupdater \ - libbootloader_message \ - libverifier \ - libotautil \ - libmounts \ - libupdate_verifier \ - libdivsufsort \ - libdivsufsort64 \ - libfs_mgr \ - libvintf_recovery \ - libvintf \ - libhidl-gen-utils \ - libtinyxml2 \ - libselinux \ - libext4_utils \ - libsparse \ - libcrypto_utils \ - libcrypto \ - libbz \ - libziparchive \ - liblog \ - libutils \ - libz \ - libbase \ - libtune2fs \ - libfec \ - libfec_rs \ - libsquashfs_utils \ - libcutils \ - libbrotli \ - libBionicGtestMain \ - $(tune2fs_static_libraries) +# LOCAL_STATIC_LIBRARIES := \ +# libapplypatch_modes \ +# libapplypatch \ +# libedify \ +# libimgdiff \ +# libimgpatch \ +# libbsdiff \ +# libbspatch \ +# libfusesideload \ +# libotafault \ +# librecovery \ +# libupdater \ +# libbootloader_message \ +# libverifier \ +# libotautil \ +# libmounts \ +# libupdate_verifier \ +# libdivsufsort \ +# libdivsufsort64 \ +# libfs_mgr \ +# libvintf_recovery \ +# libvintf \ +# libhidl-gen-utils \ +# libtinyxml2 \ +# libselinux \ +# libext4_utils \ +# libsparse \ +# libcrypto_utils \ +# libcrypto \ +# libbz \ +# libziparchive \ +# liblog \ +# libutils \ +# libz \ +# libbase \ +# libtune2fs \ +# libfec \ +# libfec_rs \ +# libsquashfs_utils \ +# libcutils \ +# libbrotli \ +# libBionicGtestMain \ +# $(tune2fs_static_libraries) -testdata_files := $(call find-subdir-files, testdata/*) +# testdata_files := $(call find-subdir-files, testdata/*) -# The testdata files that will go to $OUT/data/nativetest/recovery. -testdata_out_path := $(TARGET_OUT_DATA)/nativetest/recovery -GEN := $(addprefix $(testdata_out_path)/, $(testdata_files)) -$(GEN): PRIVATE_PATH := $(LOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ -$(GEN): $(testdata_out_path)/% : $(LOCAL_PATH)/% - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) +# # The testdata files that will go to $OUT/data/nativetest/recovery. +# testdata_out_path := $(TARGET_OUT_DATA)/nativetest/recovery +# GEN := $(addprefix $(testdata_out_path)/, $(testdata_files)) +# $(GEN): PRIVATE_PATH := $(LOCAL_PATH) +# $(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ +# $(GEN): $(testdata_out_path)/% : $(LOCAL_PATH)/% +# $(transform-generated-source) +# LOCAL_GENERATED_SOURCES += $(GEN) -# A copy of the testdata to be packed into continuous_native_tests.zip. -testdata_continuous_zip_prefix := \ - $(call intermediates-dir-for,PACKAGING,recovery_component_test)/DATA -testdata_continuous_zip_path := $(testdata_continuous_zip_prefix)/nativetest/recovery -GEN := $(addprefix $(testdata_continuous_zip_path)/, $(testdata_files)) -$(GEN): PRIVATE_PATH := $(LOCAL_PATH) -$(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ -$(GEN): $(testdata_continuous_zip_path)/% : $(LOCAL_PATH)/% - $(transform-generated-source) -LOCAL_GENERATED_SOURCES += $(GEN) -LOCAL_PICKUP_FILES := $(testdata_continuous_zip_prefix) +# # A copy of the testdata to be packed into continuous_native_tests.zip. +# testdata_continuous_zip_prefix := \ +# $(call intermediates-dir-for,PACKAGING,recovery_component_test)/DATA +# testdata_continuous_zip_path := $(testdata_continuous_zip_prefix)/nativetest/recovery +# GEN := $(addprefix $(testdata_continuous_zip_path)/, $(testdata_files)) +# $(GEN): PRIVATE_PATH := $(LOCAL_PATH) +# $(GEN): PRIVATE_CUSTOM_TOOL = cp $< $@ +# $(GEN): $(testdata_continuous_zip_path)/% : $(LOCAL_PATH)/% +# $(transform-generated-source) +# LOCAL_GENERATED_SOURCES += $(GEN) +# LOCAL_PICKUP_FILES := $(testdata_continuous_zip_prefix) -include $(BUILD_NATIVE_TEST) +# include $(BUILD_NATIVE_TEST) # Host tests -include $(CLEAR_VARS) -LOCAL_CFLAGS := -Wall -Werror -LOCAL_MODULE := recovery_host_test -LOCAL_MODULE_HOST_OS := linux -LOCAL_C_INCLUDES := bootable/recovery -LOCAL_SRC_FILES := \ - component/imgdiff_test.cpp -LOCAL_STATIC_LIBRARIES := \ - libimgdiff \ - libimgpatch \ - libotautil \ - libbsdiff \ - libbspatch \ - libziparchive \ - libutils \ - libbase \ - libcrypto \ - libbrotli \ - libbz \ - libdivsufsort64 \ - libdivsufsort \ - libz \ - libBionicGtestMain -LOCAL_SHARED_LIBRARIES := \ - liblog -include $(BUILD_HOST_NATIVE_TEST) +# include $(CLEAR_VARS) +# LOCAL_CFLAGS := -Wall -Werror +# LOCAL_MODULE := recovery_host_test +# LOCAL_MODULE_HOST_OS := linux +# LOCAL_C_INCLUDES := bootable/recovery +# LOCAL_SRC_FILES := \ +# component/imgdiff_test.cpp +# LOCAL_STATIC_LIBRARIES := \ +# libimgdiff \ +# libimgpatch \ +# libotautil \ +# libbsdiff \ +# libbspatch \ +# libziparchive \ +# libutils \ +# libbase \ +# libcrypto \ +# libbrotli \ +# libbz \ +# libdivsufsort64 \ +# libdivsufsort \ +# libz \ +# libBionicGtestMain +# LOCAL_SHARED_LIBRARIES := \ +# liblog +# include $(BUILD_HOST_NATIVE_TEST) diff --git a/tests/unit/zip_test.cpp b/tests/unit/zip_test.cpp old mode 100644 new mode 100755 index f41a4056..11049784 --- a/tests/unit/zip_test.cpp +++ b/tests/unit/zip_test.cpp @@ -22,11 +22,6 @@ #include #include -<<<<<<< HEAD -#include -#include -======= ->>>>>>> android-10.0.0_r25 #include #include "common/test_constants.h" diff --git a/toolbox/Android.mk b/toolbox/Android.mk old mode 100644 new mode 100755 index 92674385..4a2546ed --- a/toolbox/Android.mk +++ b/toolbox/Android.mk @@ -164,7 +164,9 @@ ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 27; echo $$?),0) # Special rules for 9.0 OUR_TOOLS += getevent LOCAL_C_INCLUDES += $(TWRP_TOOLBOX_PATH) - LOCAL_WHOLE_STATIC_LIBRARIES += libtoolbox_dd + ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 29; echo $$?),0) + LOCAL_WHOLE_STATIC_LIBRARIES += libtoolbox_dd + endif ifneq ($(TW_USE_TOOLBOX), true) OUR_TOOLS += newfs_msdos @@ -286,7 +288,7 @@ endif TOOLS_H := $(intermediates)/tools.h $(TOOLS_H): PRIVATE_TOOLS := $(ALL_TOOLS) $(TOOLS_H): PRIVATE_CUSTOM_TOOL = echo "/* file generated automatically */" > $@ ; for t in $(PRIVATE_TOOLS) ; do echo "TOOL($$t)" >> $@ ; done -$(TOOLS_H): +$(TOOLS_H): $(transform-generated-source) # toolbox setenforce is used during init in non-symlink form, so it was diff --git a/toybox/Android.mk b/toybox/Android.mk old mode 100644 new mode 100755 index 5f6edec3..0fb345da --- a/toybox/Android.mk +++ b/toybox/Android.mk @@ -553,6 +553,10 @@ ALL_TOOLS += \ stop \ stty endif +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -gt 28; echo $$?),0) +ALL_TOOLS += \ + dd +endif endif # Account for master branch changes pulld into CM14.1 ifneq ($(CM_BUILD),) @@ -569,7 +573,9 @@ endif endif # Install the symlinks. -LOCAL_POST_INSTALL_CMD := $(hide) $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/$(t);) +# LOCAL_POST_INSTALL_CMD := $(hide) $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/$(t);) +LOCAL_POST_INSTALL_CMD := $(foreach t,$(ALL_TOOLS),ln -sf toybox $(TARGET_RECOVERY_ROOT_OUT)/sbin/$(t);) + include $(BUILD_EXECUTABLE) diff --git a/twinstall.cpp b/twinstall.cpp index d659b47b..fb639a7e 100755 --- a/twinstall.cpp +++ b/twinstall.cpp @@ -41,14 +41,16 @@ #ifdef USE_MINZIP #include "minzip/SysUtil.h" #else -#include "otautil/SysUtil.h" +#include "otautil/sysutil.h" #include #endif #include "zipwrap.hpp" #ifdef USE_OLD_VERIFIER #include "verifier24/verifier.h" +#elif USE_28_VERIFIER +#include "verifier28/verifier.h" #else -#include "verifier.h" +#include "install/verifier.h" #endif #include "variables.h" #include "data.hpp" diff --git a/twinstall.h b/twinstall.h old mode 100644 new mode 100755 diff --git a/twrp.cpp b/twrp.cpp index dac00932..8c6dcf8f 100755 --- a/twrp.cpp +++ b/twrp.cpp @@ -47,7 +47,7 @@ extern "C" { #include "variables.h" #include "twrpAdbBuFifo.hpp" #ifdef TW_USE_NEW_MINADBD -#include "minadbd/minadbd.h" +// #include "minadbd/minadbd.h" #else extern "C" { #include "minadbd21/adb.h" @@ -84,7 +84,7 @@ int main(int argc, char **argv) { property_set("ctl.stop", "adbd"); #ifdef TW_USE_NEW_MINADBD //adb_server_main(0, DEFAULT_ADB_PORT, -1); TODO fix this for android8 - minadbd_main(); + // minadbd_main(); #else adb_main(argv[2]); #endif @@ -127,6 +127,7 @@ int main(int argc, char **argv) { gui_loadResources(); bool Shutdown = false; + bool SkipDecryption = false; string Send_Intent = ""; { TWPartition* misc = PartitionManager.Find_Partition_By_Path("/misc"); @@ -161,6 +162,9 @@ int main(int argc, char **argv) { string ORSCommand = "install "; ORSCommand.append(ptr); + // If we have a map of blocks we don't need to mount data. + SkipDecryption = *ptr == '@'; + if (!OpenRecoveryScript::Insert_ORS_Command(ORSCommand)) break; } else @@ -228,13 +232,17 @@ int main(int argc, char **argv) { // Offer to decrypt if the device is encrypted if (DataManager::GetIntValue(TW_IS_ENCRYPTED) != 0) { - LOGINFO("Is encrypted, do decrypt page first\n"); - if (gui_startPage("decrypt", 1, 1) != 0) { - LOGERR("Failed to start decrypt GUI page.\n"); + if (SkipDecryption) { + LOGINFO("Skipping decryption\n"); } else { - // Check for and load custom theme if present - TWFunc::check_selinux_support(); - gui_loadCustomResources(); + LOGINFO("Is encrypted, do decrypt page first\n"); + if (gui_startPage("decrypt", 1, 1) != 0) { + LOGERR("Failed to start decrypt GUI page.\n"); + } else { + // Check for and load custom theme if present + TWFunc::check_selinux_support(); + gui_loadCustomResources(); + } } } else if (datamedia) { TWFunc::check_selinux_support(); @@ -258,8 +266,7 @@ int main(int argc, char **argv) { // Run any outstanding OpenRecoveryScript std::string cacheDir = TWFunc::get_cache_dir(); std::string orsFile = cacheDir + "/recovery/openrecoveryscript"; - - if (TWFunc::Path_Exists(SCRIPT_FILE_TMP) || (DataManager::GetIntValue(TW_IS_ENCRYPTED) == 0 && TWFunc::Path_Exists(orsFile))) { + if ((DataManager::GetIntValue(TW_IS_ENCRYPTED) == 0 || SkipDecryption) && (TWFunc::Path_Exists(SCRIPT_FILE_TMP) || TWFunc::Path_Exists(orsFile))) { OpenRecoveryScript::Run_OpenRecoveryScript(); } diff --git a/updater/Android.mk b/updater/Android.mk old mode 100644 new mode 100755 index d77fdc2a..23dc650f --- a/updater/Android.mk +++ b/updater/Android.mk @@ -57,40 +57,6 @@ updater_common_static_libraries := \ libtune2fs \ $(tune2fs_static_libraries) -<<<<<<< HEAD -# libupdater (static library) -# =============================== -include $(CLEAR_VARS) - -LOCAL_MODULE := libupdater - -LOCAL_SRC_FILES := \ - install.cpp \ - blockimg.cpp - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/.. \ - $(LOCAL_PATH)/include \ - external/e2fsprogs/misc - -LOCAL_CFLAGS := \ - -Wall \ - -Werror - -ifeq ($(BOARD_SUPPRESS_EMMC_WIPE),true) - LOCAL_CFLAGS += -DSUPPRESS_EMMC_WIPE -endif - -LOCAL_EXPORT_C_INCLUDE_DIRS := \ - $(LOCAL_PATH)/include - -LOCAL_STATIC_LIBRARIES := \ - $(updater_common_static_libraries) - -include $(BUILD_STATIC_LIBRARY) - -======= ->>>>>>> android-10.0.0_r25 # updater (static executable) # =============================== include $(CLEAR_VARS) diff --git a/updater/blockimg.cpp b/updater/blockimg.cpp old mode 100644 new mode 100755 index 9750a201..ef33ab25 --- a/updater/blockimg.cpp +++ b/updater/blockimg.cpp @@ -1540,11 +1540,6 @@ static int PerformCommandComputeHashTree(CommandParameters& params) { return -1; } -<<<<<<< HEAD -#ifndef SUPPRESS_EMMC_WIPE - if (ioctl(params.fd, BLKDISCARD, &blocks) == -1) { - PLOG(ERROR) << "BLKDISCARD ioctl failed"; -======= for (size_t i = begin; i < end; i++) { if (!android::base::ReadFully(params.fd, buffer, BLOCKSIZE)) { failure_type = errno == EIO ? kEioFailure : kFreadFailure; @@ -1554,7 +1549,6 @@ static int PerformCommandComputeHashTree(CommandParameters& params) { if (!builder.Update(reinterpret_cast(buffer), BLOCKSIZE)) { LOG(ERROR) << "Failed to update hash tree builder"; ->>>>>>> android-10.0.0_r25 return -1; } #endif diff --git a/updater/install.cpp b/updater/install.cpp old mode 100644 new mode 100755 index 28bfee96..70092c5b --- a/updater/install.cpp +++ b/updater/install.cpp @@ -57,47 +57,6 @@ #include #include "edify/expr.h" -<<<<<<< HEAD -#include "mounts.h" - -#include "applypatch/applypatch.h" -#include "flashutils/flashutils.h" -#include "install.h" -#ifdef HAVE_LIBTUNE2FS -#include "tune2fs.h" -#endif - -#ifdef USE_EXT4 -#include "make_ext4fs.h" -#include "wipe.h" -#endif - -#include "otautil/ZipUtil.h" -#include "otafault/ota_io.h" -#include "otautil/DirUtil.h" -======= -#include "otautil/dirutil.h" ->>>>>>> android-10.0.0_r25 -#include "otautil/error_code.h" -#include "otautil/mounts.h" -#include "otautil/print_sha1.h" -#include "otautil/sysutil.h" -#include "updater/updater.h" - -// Send over the buffer to recovery though the command pipe. -static void uiPrint(State* state, const std::string& buffer) { - UpdaterInfo* ui = static_cast(state->cookie); - - // "line1\nline2\n" will be split into 3 tokens: "line1", "line2" and "". - // So skip sending empty strings to UI. - std::vector lines = android::base::Split(buffer, "\n"); - for (auto& line : lines) { - if (!line.empty()) { - fprintf(ui->cmd_pipe, "ui_print %s\n", line.c_str()); - } - } - - // On the updater side, we need to dump the contents to stderr (which has // been redirected to the log file). Because the recovery will only print // the contents to screen when processing pipe command ui_print. LOG(INFO) << buffer; @@ -1458,11 +1417,6 @@ void RegisterInstallFunctions() { RegisterFunction("wipe_block_device", WipeBlockDeviceFn); RegisterFunction("read_file", ReadFileFn); -<<<<<<< HEAD - RegisterFunction("sha1_check", Sha1CheckFn); - RegisterFunction("rename", RenameFn); -======= ->>>>>>> android-10.0.0_r25 RegisterFunction("write_value", WriteValueFn); RegisterFunction("wipe_cache", WipeCacheFn); diff --git a/updater/updater.cpp b/updater/updater.cpp old mode 100644 new mode 100755 index fd66e93c..bbdf744d --- a/updater/updater.cpp +++ b/updater/updater.cpp @@ -48,14 +48,6 @@ // (Note it's "updateR-script", not the older "update-script".) static constexpr const char* SCRIPT_NAME = "META-INF/com/google/android/updater-script"; -<<<<<<< HEAD -#define SELINUX_CONTEXTS_ZIP "file_contexts" -#define SELINUX_CONTEXTS_TMP "/tmp/file_contexts" - -extern bool have_eio_error; - -======= ->>>>>>> android-10.0.0_r25 struct selabel_handle *sehandle; static void UpdaterLogger(android::base::LogId /* id */, android::base::LogSeverity /* severity */, diff --git a/updater_sample/proguard.flags b/updater_sample/proguard.flags old mode 100644 new mode 100755 index 6f521935..97ab534f --- a/updater_sample/proguard.flags +++ b/updater_sample/proguard.flags @@ -22,17 +22,3 @@ public (java.lang.String, java.lang.String, int); } -<<<<<<< HEAD:tools/dumpkey/Android.mk -# Pre Oreo trees have dumpkey defined elsewhere in the tree -ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26; echo $$?),0) - -include $(CLEAR_VARS) -LOCAL_MODULE := dumpkey -LOCAL_SRC_FILES := DumpPublicKey.java -LOCAL_JAR_MANIFEST := DumpPublicKey.mf -LOCAL_STATIC_JAVA_LIBRARIES := bouncycastle-host -include $(BUILD_HOST_JAVA_LIBRARY) - -endif -======= ->>>>>>> android-10.0.0_r25:updater_sample/proguard.flags diff --git a/verifier28/asn1_decoder.cpp b/verifier28/asn1_decoder.cpp new file mode 100644 index 00000000..285214f1 --- /dev/null +++ b/verifier28/asn1_decoder.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "asn1_decoder.h" + +#include + +int asn1_context::peek_byte() const { + if (length_ == 0) { + return -1; + } + return *p_; +} + +int asn1_context::get_byte() { + if (length_ == 0) { + return -1; + } + + int byte = *p_; + p_++; + length_--; + return byte; +} + +bool asn1_context::skip_bytes(size_t num_skip) { + if (length_ < num_skip) { + return false; + } + p_ += num_skip; + length_ -= num_skip; + return true; +} + +bool asn1_context::decode_length(size_t* out_len) { + int num_octets = get_byte(); + if (num_octets == -1) { + return false; + } + if ((num_octets & 0x80) == 0x00) { + *out_len = num_octets; + return true; + } + num_octets &= kMaskTag; + if (static_cast(num_octets) >= sizeof(size_t)) { + return false; + } + size_t length = 0; + for (int i = 0; i < num_octets; ++i) { + int byte = get_byte(); + if (byte == -1) { + return false; + } + length <<= 8; + length += byte; + } + *out_len = length; + return true; +} + +/** + * Returns the constructed type and advances the pointer. E.g. A0 -> 0 + */ +asn1_context* asn1_context::asn1_constructed_get() { + int type = get_byte(); + if (type == -1 || (type & kMaskConstructed) != kTagConstructed) { + return nullptr; + } + size_t length; + if (!decode_length(&length) || length > length_) { + return nullptr; + } + asn1_context* app_ctx = new asn1_context(p_, length); + app_ctx->app_type_ = type & kMaskAppType; + return app_ctx; +} + +bool asn1_context::asn1_constructed_skip_all() { + int byte = peek_byte(); + while (byte != -1 && (byte & kMaskConstructed) == kTagConstructed) { + skip_bytes(1); + size_t length; + if (!decode_length(&length) || !skip_bytes(length)) { + return false; + } + byte = peek_byte(); + } + return byte != -1; +} + +int asn1_context::asn1_constructed_type() const { + return app_type_; +} + +asn1_context* asn1_context::asn1_sequence_get() { + if ((get_byte() & kMaskTag) != kTagSequence) { + return nullptr; + } + size_t length; + if (!decode_length(&length) || length > length_) { + return nullptr; + } + return new asn1_context(p_, length); +} + +asn1_context* asn1_context::asn1_set_get() { + if ((get_byte() & kMaskTag) != kTagSet) { + return nullptr; + } + size_t length; + if (!decode_length(&length) || length > length_) { + return nullptr; + } + return new asn1_context(p_, length); +} + +bool asn1_context::asn1_sequence_next() { + size_t length; + if (get_byte() == -1 || !decode_length(&length) || !skip_bytes(length)) { + return false; + } + return true; +} + +bool asn1_context::asn1_oid_get(const uint8_t** oid, size_t* length) { + if (get_byte() != kTagOid) { + return false; + } + if (!decode_length(length) || *length == 0 || *length > length_) { + return false; + } + *oid = p_; + return true; +} + +bool asn1_context::asn1_octet_string_get(const uint8_t** octet_string, size_t* length) { + if (get_byte() != kTagOctetString) { + return false; + } + if (!decode_length(length) || *length == 0 || *length > length_) { + return false; + } + *octet_string = p_; + return true; +} diff --git a/verifier28/asn1_decoder.h b/verifier28/asn1_decoder.h new file mode 100644 index 00000000..3e992115 --- /dev/null +++ b/verifier28/asn1_decoder.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ASN1_DECODER_H_ +#define ASN1_DECODER_H_ + +#include + +class asn1_context { + public: + asn1_context(const uint8_t* buffer, size_t length) : p_(buffer), length_(length), app_type_(0) {} + int asn1_constructed_type() const; + asn1_context* asn1_constructed_get(); + bool asn1_constructed_skip_all(); + asn1_context* asn1_sequence_get(); + asn1_context* asn1_set_get(); + bool asn1_sequence_next(); + bool asn1_oid_get(const uint8_t** oid, size_t* length); + bool asn1_octet_string_get(const uint8_t** octet_string, size_t* length); + + private: + static constexpr int kMaskConstructed = 0xE0; + static constexpr int kMaskTag = 0x7F; + static constexpr int kMaskAppType = 0x1F; + + static constexpr int kTagOctetString = 0x04; + static constexpr int kTagOid = 0x06; + static constexpr int kTagSequence = 0x30; + static constexpr int kTagSet = 0x31; + static constexpr int kTagConstructed = 0xA0; + + int peek_byte() const; + int get_byte(); + bool skip_bytes(size_t num_skip); + bool decode_length(size_t* out_len); + + const uint8_t* p_; + size_t length_; + int app_type_; +}; + +#endif /* ASN1_DECODER_H_ */ diff --git a/verifier28/verifier.cpp b/verifier28/verifier.cpp new file mode 100644 index 00000000..283e0430 --- /dev/null +++ b/verifier28/verifier.cpp @@ -0,0 +1,553 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "verifier.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "asn1_decoder.h" +#include "otautil/print_sha1.h" + +static constexpr size_t MiB = 1024 * 1024; + +/* + * Simple version of PKCS#7 SignedData extraction. This extracts the + * signature OCTET STRING to be used for signature verification. + * + * For full details, see http://www.ietf.org/rfc/rfc3852.txt + * + * The PKCS#7 structure looks like: + * + * SEQUENCE (ContentInfo) + * OID (ContentType) + * [0] (content) + * SEQUENCE (SignedData) + * INTEGER (version CMSVersion) + * SET (DigestAlgorithmIdentifiers) + * SEQUENCE (EncapsulatedContentInfo) + * [0] (CertificateSet OPTIONAL) + * [1] (RevocationInfoChoices OPTIONAL) + * SET (SignerInfos) + * SEQUENCE (SignerInfo) + * INTEGER (CMSVersion) + * SEQUENCE (SignerIdentifier) + * SEQUENCE (DigestAlgorithmIdentifier) + * SEQUENCE (SignatureAlgorithmIdentifier) + * OCTET STRING (SignatureValue) + */ +static bool read_pkcs7(const uint8_t* pkcs7_der, size_t pkcs7_der_len, + std::vector* sig_der) { + CHECK(sig_der != nullptr); + sig_der->clear(); + + asn1_context ctx(pkcs7_der, pkcs7_der_len); + + std::unique_ptr pkcs7_seq(ctx.asn1_sequence_get()); + if (pkcs7_seq == nullptr || !pkcs7_seq->asn1_sequence_next()) { + return false; + } + + std::unique_ptr signed_data_app(pkcs7_seq->asn1_constructed_get()); + if (signed_data_app == nullptr) { + return false; + } + + std::unique_ptr signed_data_seq(signed_data_app->asn1_sequence_get()); + if (signed_data_seq == nullptr || + !signed_data_seq->asn1_sequence_next() || + !signed_data_seq->asn1_sequence_next() || + !signed_data_seq->asn1_sequence_next() || + !signed_data_seq->asn1_constructed_skip_all()) { + return false; + } + + std::unique_ptr sig_set(signed_data_seq->asn1_set_get()); + if (sig_set == nullptr) { + return false; + } + + std::unique_ptr sig_seq(sig_set->asn1_sequence_get()); + if (sig_seq == nullptr || + !sig_seq->asn1_sequence_next() || + !sig_seq->asn1_sequence_next() || + !sig_seq->asn1_sequence_next() || + !sig_seq->asn1_sequence_next()) { + return false; + } + + const uint8_t* sig_der_ptr; + size_t sig_der_length; + if (!sig_seq->asn1_octet_string_get(&sig_der_ptr, &sig_der_length)) { + return false; + } + + sig_der->resize(sig_der_length); + std::copy(sig_der_ptr, sig_der_ptr + sig_der_length, sig_der->begin()); + return true; +} + +/* + * Looks for an RSA signature embedded in the .ZIP file comment given the path to the zip. Verifies + * that it matches one of the given public keys. A callback function can be optionally provided for + * posting the progress. + * + * Returns VERIFY_SUCCESS or VERIFY_FAILURE (if any error is encountered or no key matches the + * signature). + */ +int verify_file(const unsigned char* addr, size_t length, const std::vector& keys, + const std::function& set_progress) { + if (set_progress) { + set_progress(0.0); + } + + // An archive with a whole-file signature will end in six bytes: + // + // (2-byte signature start) $ff $ff (2-byte comment size) + // + // (As far as the ZIP format is concerned, these are part of the archive comment.) We start by + // reading this footer, this tells us how far back from the end we have to start reading to find + // the whole comment. + +#define FOOTER_SIZE 6 + + if (length < FOOTER_SIZE) { + LOG(ERROR) << "not big enough to contain footer"; + return VERIFY_FAILURE; + } + + const unsigned char* footer = addr + length - FOOTER_SIZE; + + if (footer[2] != 0xff || footer[3] != 0xff) { + LOG(ERROR) << "footer is wrong"; + return VERIFY_FAILURE; + } + + size_t comment_size = footer[4] + (footer[5] << 8); + size_t signature_start = footer[0] + (footer[1] << 8); + LOG(INFO) << "comment is " << comment_size << " bytes; signature is " << signature_start + << " bytes from end"; + + if (signature_start > comment_size) { + LOG(ERROR) << "signature start: " << signature_start << " is larger than comment size: " + << comment_size; + return VERIFY_FAILURE; + } + + if (signature_start <= FOOTER_SIZE) { + LOG(ERROR) << "Signature start is in the footer"; + return VERIFY_FAILURE; + } + +#define EOCD_HEADER_SIZE 22 + + // The end-of-central-directory record is 22 bytes plus any comment length. + size_t eocd_size = comment_size + EOCD_HEADER_SIZE; + + if (length < eocd_size) { + LOG(ERROR) << "not big enough to contain EOCD"; + return VERIFY_FAILURE; + } + + // Determine how much of the file is covered by the signature. This is everything except the + // signature data and length, which includes all of the EOCD except for the comment length field + // (2 bytes) and the comment data. + size_t signed_len = length - eocd_size + EOCD_HEADER_SIZE - 2; + + const unsigned char* eocd = addr + length - eocd_size; + + // If this is really is the EOCD record, it will begin with the magic number $50 $4b $05 $06. + if (eocd[0] != 0x50 || eocd[1] != 0x4b || eocd[2] != 0x05 || eocd[3] != 0x06) { + LOG(ERROR) << "signature length doesn't match EOCD marker"; + return VERIFY_FAILURE; + } + + for (size_t i = 4; i < eocd_size-3; ++i) { + if (eocd[i] == 0x50 && eocd[i+1] == 0x4b && eocd[i+2] == 0x05 && eocd[i+3] == 0x06) { + // If the sequence $50 $4b $05 $06 appears anywhere after the real one, libziparchive will + // find the later (wrong) one, which could be exploitable. Fail the verification if this + // sequence occurs anywhere after the real one. + LOG(ERROR) << "EOCD marker occurs after start of EOCD"; + return VERIFY_FAILURE; + } + } + + bool need_sha1 = false; + bool need_sha256 = false; + for (const auto& key : keys) { + switch (key.hash_len) { + case SHA_DIGEST_LENGTH: need_sha1 = true; break; + case SHA256_DIGEST_LENGTH: need_sha256 = true; break; + } + } + + SHA_CTX sha1_ctx; + SHA256_CTX sha256_ctx; + SHA1_Init(&sha1_ctx); + SHA256_Init(&sha256_ctx); + + double frac = -1.0; + size_t so_far = 0; + while (so_far < signed_len) { + // On a Nexus 5X, experiment showed 16MiB beat 1MiB by 6% faster for a + // 1196MiB full OTA and 60% for an 89MiB incremental OTA. + // http://b/28135231. + size_t size = std::min(signed_len - so_far, 16 * MiB); + + if (need_sha1) SHA1_Update(&sha1_ctx, addr + so_far, size); + if (need_sha256) SHA256_Update(&sha256_ctx, addr + so_far, size); + so_far += size; + + if (set_progress) { + double f = so_far / (double)signed_len; + if (f > frac + 0.02 || size == so_far) { + set_progress(f); + frac = f; + } + } + } + + uint8_t sha1[SHA_DIGEST_LENGTH]; + SHA1_Final(sha1, &sha1_ctx); + uint8_t sha256[SHA256_DIGEST_LENGTH]; + SHA256_Final(sha256, &sha256_ctx); + + const uint8_t* signature = eocd + eocd_size - signature_start; + size_t signature_size = signature_start - FOOTER_SIZE; + + LOG(INFO) << "signature (offset: " << std::hex << (length - signature_start) << ", length: " + << signature_size << "): " << print_hex(signature, signature_size); + + std::vector sig_der; + if (!read_pkcs7(signature, signature_size, &sig_der)) { + LOG(ERROR) << "Could not find signature DER block"; + return VERIFY_FAILURE; + } + + // 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) { + const uint8_t* hash; + int hash_nid; + switch (key.hash_len) { + case SHA_DIGEST_LENGTH: + hash = sha1; + hash_nid = NID_sha1; + break; + case SHA256_DIGEST_LENGTH: + hash = sha256; + hash_nid = NID_sha256; + break; + default: + continue; + } + + // The 6 bytes is the "(signature_start) $ff $ff (comment_size)" that the signing tool appends + // after the signature itself. + if (key.key_type == Certificate::KEY_TYPE_RSA) { + if (!RSA_verify(hash_nid, hash, key.hash_len, sig_der.data(), sig_der.size(), + key.rsa.get())) { + LOG(INFO) << "failed to verify against RSA key " << i; + continue; + } + + LOG(INFO) << "whole-file signature verified against RSA key " << i; + return VERIFY_SUCCESS; + } else if (key.key_type == Certificate::KEY_TYPE_EC && key.hash_len == SHA256_DIGEST_LENGTH) { + if (!ECDSA_verify(0, hash, key.hash_len, sig_der.data(), sig_der.size(), key.ec.get())) { + LOG(INFO) << "failed to verify against EC key " << i; + continue; + } + + LOG(INFO) << "whole-file signature verified against EC key " << i; + return VERIFY_SUCCESS; + } else { + LOG(INFO) << "Unknown key type " << key.key_type; + } + i++; + } + + if (need_sha1) { + LOG(INFO) << "SHA-1 digest: " << print_hex(sha1, SHA_DIGEST_LENGTH); + } + if (need_sha256) { + LOG(INFO) << "SHA-256 digest: " << print_hex(sha256, SHA256_DIGEST_LENGTH); + } + LOG(ERROR) << "failed to verify whole-file signature"; + return VERIFY_FAILURE; +} + +std::unique_ptr parse_rsa_key(FILE* file, uint32_t exponent) { + // Read key length in words and n0inv. n0inv is a precomputed montgomery + // parameter derived from the modulus and can be used to speed up + // verification. n0inv is 32 bits wide here, assuming the verification logic + // uses 32 bit arithmetic. However, BoringSSL may use a word size of 64 bits + // internally, in which case we don't have a valid n0inv. Thus, we just + // ignore the montgomery parameters and have BoringSSL recompute them + // internally. If/When the speedup from using the montgomery parameters + // becomes relevant, we can add more sophisticated code here to obtain a + // 64-bit n0inv and initialize the montgomery parameters in the key object. + uint32_t key_len_words = 0; + uint32_t n0inv = 0; + if (fscanf(file, " %i , 0x%x", &key_len_words, &n0inv) != 2) { + return nullptr; + } + + if (key_len_words > 8192 / 32) { + LOG(ERROR) << "key length (" << key_len_words << ") too large"; + return nullptr; + } + + // Read the modulus. + std::unique_ptr modulus(new uint32_t[key_len_words]); + if (fscanf(file, " , { %u", &modulus[0]) != 1) { + return nullptr; + } + for (uint32_t i = 1; i < key_len_words; ++i) { + if (fscanf(file, " , %u", &modulus[i]) != 1) { + return nullptr; + } + } + + // Cconvert from little-endian array of little-endian words to big-endian + // byte array suitable as input for BN_bin2bn. + std::reverse((uint8_t*)modulus.get(), + (uint8_t*)(modulus.get() + key_len_words)); + + // The next sequence of values is the montgomery parameter R^2. Since we + // generally don't have a valid |n0inv|, we ignore this (see comment above). + uint32_t rr_value; + if (fscanf(file, " } , { %u", &rr_value) != 1) { + return nullptr; + } + for (uint32_t i = 1; i < key_len_words; ++i) { + if (fscanf(file, " , %u", &rr_value) != 1) { + return nullptr; + } + } + if (fscanf(file, " } } ") != 0) { + return nullptr; + } + + // Initialize the key. + std::unique_ptr key(RSA_new()); + if (!key) { + return nullptr; + } + + key->n = BN_bin2bn((uint8_t*)modulus.get(), + key_len_words * sizeof(uint32_t), NULL); + if (!key->n) { + return nullptr; + } + + key->e = BN_new(); + if (!key->e || !BN_set_word(key->e, exponent)) { + return nullptr; + } + + return key; +} + +struct BNDeleter { + void operator()(BIGNUM* bn) const { + BN_free(bn); + } +}; + +std::unique_ptr parse_ec_key(FILE* file) { + uint32_t key_len_bytes = 0; + if (fscanf(file, " %i", &key_len_bytes) != 1) { + return nullptr; + } + + std::unique_ptr group( + EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1), EC_GROUP_free); + if (!group) { + return nullptr; + } + + // Verify that |key_len| matches the group order. + if (key_len_bytes != BN_num_bytes(EC_GROUP_get0_order(group.get()))) { + return nullptr; + } + + // Read the public key coordinates. Note that the byte order in the file is + // little-endian, so we convert to big-endian here. + std::unique_ptr bytes(new uint8_t[key_len_bytes]); + std::unique_ptr point[2]; + for (int i = 0; i < 2; ++i) { + unsigned int byte = 0; + if (fscanf(file, " , { %u", &byte) != 1) { + return nullptr; + } + bytes[key_len_bytes - 1] = byte; + + for (size_t i = 1; i < key_len_bytes; ++i) { + if (fscanf(file, " , %u", &byte) != 1) { + return nullptr; + } + bytes[key_len_bytes - i - 1] = byte; + } + + point[i].reset(BN_bin2bn(bytes.get(), key_len_bytes, nullptr)); + if (!point[i]) { + return nullptr; + } + + if (fscanf(file, " }") != 0) { + return nullptr; + } + } + + if (fscanf(file, " } ") != 0) { + return nullptr; + } + + // Create and initialize the key. + std::unique_ptr key(EC_KEY_new()); + if (!key || !EC_KEY_set_group(key.get(), group.get()) || + !EC_KEY_set_public_key_affine_coordinates(key.get(), point[0].get(), + point[1].get())) { + return nullptr; + } + + return key; +} + +// Reads a file containing one or more public keys as produced by +// DumpPublicKey: this is an RSAPublicKey struct as it would appear +// as a C source literal, eg: +// +// "{64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}" +// +// For key versions newer than the original 2048-bit e=3 keys +// supported by Android, the string is preceded by a version +// identifier, eg: +// +// "v2 {64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}" +// +// (Note that the braces and commas in this example are actual +// characters the parser expects to find in the file; the ellipses +// indicate more numbers omitted from this example.) +// +// The file may contain multiple keys in this format, separated by +// commas. The last key must not be followed by a comma. +// +// A Certificate is a pair of an RSAPublicKey and a particular hash +// (we support SHA-1 and SHA-256; we store the hash length to signify +// which is being used). The hash used is implied by the version number. +// +// 1: 2048-bit RSA key with e=3 and SHA-1 hash +// 2: 2048-bit RSA key with e=65537 and SHA-1 hash +// 3: 2048-bit RSA key with e=3 and SHA-256 hash +// 4: 2048-bit RSA key with e=65537 and SHA-256 hash +// 5: 256-bit EC key using the NIST P-256 curve parameters and SHA-256 hash +// +// Returns true on success, and appends the found keys (at least one) to certs. +// Otherwise returns false if the file failed to parse, or if it contains zero +// keys. The contents in certs would be unspecified on failure. +bool load_keys(const char* filename, std::vector& certs) { + std::unique_ptr f(fopen(filename, "re"), fclose); + if (!f) { + PLOG(ERROR) << "error opening " << filename; + return false; + } + + while (true) { + certs.emplace_back(0, Certificate::KEY_TYPE_RSA, nullptr, nullptr); + Certificate& cert = certs.back(); + uint32_t exponent = 0; + + char start_char; + if (fscanf(f.get(), " %c", &start_char) != 1) return false; + if (start_char == '{') { + // a version 1 key has no version specifier. + cert.key_type = Certificate::KEY_TYPE_RSA; + exponent = 3; + cert.hash_len = SHA_DIGEST_LENGTH; + } else if (start_char == 'v') { + int version; + if (fscanf(f.get(), "%d {", &version) != 1) return false; + switch (version) { + case 2: + cert.key_type = Certificate::KEY_TYPE_RSA; + exponent = 65537; + cert.hash_len = SHA_DIGEST_LENGTH; + break; + case 3: + cert.key_type = Certificate::KEY_TYPE_RSA; + exponent = 3; + cert.hash_len = SHA256_DIGEST_LENGTH; + break; + case 4: + cert.key_type = Certificate::KEY_TYPE_RSA; + exponent = 65537; + cert.hash_len = SHA256_DIGEST_LENGTH; + break; + case 5: + cert.key_type = Certificate::KEY_TYPE_EC; + cert.hash_len = SHA256_DIGEST_LENGTH; + break; + default: + return false; + } + } + + if (cert.key_type == Certificate::KEY_TYPE_RSA) { + cert.rsa = parse_rsa_key(f.get(), exponent); + if (!cert.rsa) { + return false; + } + + LOG(INFO) << "read key e=" << exponent << " hash=" << cert.hash_len; + } else if (cert.key_type == Certificate::KEY_TYPE_EC) { + cert.ec = parse_ec_key(f.get()); + if (!cert.ec) { + return false; + } + } else { + LOG(ERROR) << "Unknown key type " << cert.key_type; + return false; + } + + // if the line ends in a comma, this file has more keys. + int ch = fgetc(f.get()); + if (ch == ',') { + // more keys to come. + continue; + } else if (ch == EOF) { + break; + } else { + LOG(ERROR) << "unexpected character between keys"; + return false; + } + } + return true; +} diff --git a/verifier.h b/verifier28/verifier.h similarity index 100% rename from verifier.h rename to verifier28/verifier.h