Merge "Refactor libupdater into a seperate module."
This commit is contained in:
+22
-6
@@ -41,25 +41,41 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
|||||||
LOCAL_MODULE := recovery_component_test
|
LOCAL_MODULE := recovery_component_test
|
||||||
LOCAL_C_INCLUDES := bootable/recovery
|
LOCAL_C_INCLUDES := bootable/recovery
|
||||||
LOCAL_SRC_FILES := \
|
LOCAL_SRC_FILES := \
|
||||||
|
component/applypatch_test.cpp \
|
||||||
component/edify_test.cpp \
|
component/edify_test.cpp \
|
||||||
component/verifier_test.cpp \
|
component/updater_test.cpp \
|
||||||
component/applypatch_test.cpp
|
component/verifier_test.cpp
|
||||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||||
|
|
||||||
|
tune2fs_static_libraries := \
|
||||||
|
libext2_com_err \
|
||||||
|
libext2_blkid \
|
||||||
|
libext2_quota \
|
||||||
|
libext2_uuid_static \
|
||||||
|
libext2_e2p \
|
||||||
|
libext2fs
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES := \
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
libapplypatch \
|
libapplypatch \
|
||||||
libedify \
|
libedify \
|
||||||
libotafault \
|
libotafault \
|
||||||
|
libupdater \
|
||||||
libverifier \
|
libverifier \
|
||||||
libcrypto_utils \
|
|
||||||
libcrypto \
|
|
||||||
libminui \
|
libminui \
|
||||||
libminzip \
|
libminzip \
|
||||||
|
libmounts \
|
||||||
|
liblog \
|
||||||
|
libselinux \
|
||||||
|
libext4_utils_static \
|
||||||
|
libsparse_static \
|
||||||
|
libcrypto_utils \
|
||||||
|
libcrypto \
|
||||||
libcutils \
|
libcutils \
|
||||||
libbz \
|
libbz \
|
||||||
libz \
|
libz \
|
||||||
libc \
|
|
||||||
libbase \
|
libbase \
|
||||||
liblog
|
libtune2fs \
|
||||||
|
$(tune2fs_static_libraries)
|
||||||
|
|
||||||
testdata_out_path := $(TARGET_OUT_DATA_NATIVE_TESTS)/recovery
|
testdata_out_path := $(TARGET_OUT_DATA_NATIVE_TESTS)/recovery
|
||||||
testdata_files := $(call find-subdir-files, testdata/*)
|
testdata_files := $(call find-subdir-files, testdata/*)
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* 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 <string>
|
||||||
|
|
||||||
|
#include <android-base/properties.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include "edify/expr.h"
|
||||||
|
#include "error_code.h"
|
||||||
|
#include "updater/install.h"
|
||||||
|
|
||||||
|
struct selabel_handle *sehandle = nullptr;
|
||||||
|
|
||||||
|
static void expect(const char* expected, const char* expr_str,
|
||||||
|
ErrorCode error_code, CauseCode cause_code) {
|
||||||
|
Expr* e;
|
||||||
|
int error_count;
|
||||||
|
EXPECT_EQ(parse_string(expr_str, &e, &error_count), 0);
|
||||||
|
|
||||||
|
State state(expr_str, nullptr);
|
||||||
|
|
||||||
|
char* result = Evaluate(&state, e);
|
||||||
|
|
||||||
|
if (expected == nullptr) {
|
||||||
|
EXPECT_EQ(nullptr, result);
|
||||||
|
} else {
|
||||||
|
EXPECT_STREQ(expected, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPECT_EQ(error_code, state.error_code);
|
||||||
|
EXPECT_EQ(cause_code, state.cause_code);
|
||||||
|
|
||||||
|
free(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
class UpdaterTest : public ::testing::Test {
|
||||||
|
protected:
|
||||||
|
virtual void SetUp() {
|
||||||
|
RegisterBuiltins();
|
||||||
|
RegisterInstallFunctions();
|
||||||
|
FinishRegistration();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(UpdaterTest, getprop) {
|
||||||
|
expect(android::base::GetProperty("ro.product.device", "").c_str(),
|
||||||
|
"getprop(\"ro.product.device\")",
|
||||||
|
kNoError, kNoCause);
|
||||||
|
|
||||||
|
expect(android::base::GetProperty("ro.build.fingerprint", "").c_str(),
|
||||||
|
"getprop(\"ro.build.fingerprint\")",
|
||||||
|
kNoError, kNoCause);
|
||||||
|
|
||||||
|
// getprop() accepts only one parameter.
|
||||||
|
expect(nullptr, "getprop()", kNoError, kArgsParsingFailure);
|
||||||
|
expect(nullptr, "getprop(\"arg1\", \"arg2\")", kNoError, kArgsParsingFailure);
|
||||||
|
}
|
||||||
+67
-44
@@ -14,41 +14,6 @@
|
|||||||
|
|
||||||
LOCAL_PATH := $(call my-dir)
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
# updater (static executable)
|
|
||||||
# ===============================
|
|
||||||
# Build a statically-linked binary to include in OTA packages.
|
|
||||||
include $(CLEAR_VARS)
|
|
||||||
|
|
||||||
updater_src_files := \
|
|
||||||
install.cpp \
|
|
||||||
blockimg.cpp \
|
|
||||||
updater.cpp
|
|
||||||
|
|
||||||
LOCAL_CLANG := true
|
|
||||||
LOCAL_SRC_FILES := $(updater_src_files)
|
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES += \
|
|
||||||
$(TARGET_RECOVERY_UPDATER_LIBS) \
|
|
||||||
$(TARGET_RECOVERY_UPDATER_EXTRA_LIBS) \
|
|
||||||
libfec \
|
|
||||||
libfec_rs \
|
|
||||||
libext4_utils_static \
|
|
||||||
libsquashfs_utils \
|
|
||||||
libcrypto_utils \
|
|
||||||
libcrypto \
|
|
||||||
libapplypatch \
|
|
||||||
libotafault \
|
|
||||||
libedify \
|
|
||||||
libminzip \
|
|
||||||
libmounts \
|
|
||||||
libz \
|
|
||||||
libbz \
|
|
||||||
libcutils \
|
|
||||||
liblog \
|
|
||||||
libselinux \
|
|
||||||
libbase \
|
|
||||||
liblog
|
|
||||||
|
|
||||||
tune2fs_static_libraries := \
|
tune2fs_static_libraries := \
|
||||||
libext2_com_err \
|
libext2_com_err \
|
||||||
libext2_blkid \
|
libext2_blkid \
|
||||||
@@ -57,17 +22,77 @@ tune2fs_static_libraries := \
|
|||||||
libext2_e2p \
|
libext2_e2p \
|
||||||
libext2fs
|
libext2fs
|
||||||
|
|
||||||
LOCAL_STATIC_LIBRARIES += \
|
updater_common_static_libraries := \
|
||||||
|
libapplypatch \
|
||||||
|
libedify \
|
||||||
|
libminzip \
|
||||||
|
libmounts \
|
||||||
|
libotafault \
|
||||||
|
libext4_utils_static \
|
||||||
|
libfec \
|
||||||
|
libfec_rs \
|
||||||
|
liblog \
|
||||||
|
libselinux \
|
||||||
|
libsparse_static \
|
||||||
|
libsquashfs_utils \
|
||||||
|
libbz \
|
||||||
|
libz \
|
||||||
|
libbase \
|
||||||
|
libcrypto \
|
||||||
|
libcrypto_utils \
|
||||||
|
libcutils \
|
||||||
libtune2fs \
|
libtune2fs \
|
||||||
$(tune2fs_static_libraries)
|
$(tune2fs_static_libraries)
|
||||||
|
|
||||||
LOCAL_CFLAGS += -Wno-unused-parameter -Werror
|
# libupdater (static library)
|
||||||
LOCAL_STATIC_LIBRARIES += \
|
# ===============================
|
||||||
libsparse_static \
|
include $(CLEAR_VARS)
|
||||||
libz
|
|
||||||
|
|
||||||
LOCAL_C_INCLUDES += external/e2fsprogs/misc
|
LOCAL_MODULE := libupdater
|
||||||
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
install.cpp \
|
||||||
|
blockimg.cpp
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := \
|
||||||
|
$(LOCAL_PATH)/.. \
|
||||||
|
$(LOCAL_PATH)/include \
|
||||||
|
external/e2fsprogs/misc
|
||||||
|
|
||||||
|
LOCAL_CFLAGS := \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-Werror
|
||||||
|
|
||||||
|
LOCAL_EXPORT_C_INCLUDE_DIRS := \
|
||||||
|
$(LOCAL_PATH)/include
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
|
$(updater_common_static_libraries)
|
||||||
|
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
# updater (static executable)
|
||||||
|
# ===============================
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE := updater
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
updater.cpp
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := \
|
||||||
|
$(LOCAL_PATH)/.. \
|
||||||
|
$(LOCAL_PATH)/include
|
||||||
|
|
||||||
|
LOCAL_CFLAGS := \
|
||||||
|
-Wno-unused-parameter \
|
||||||
|
-Werror
|
||||||
|
|
||||||
|
LOCAL_STATIC_LIBRARIES := \
|
||||||
|
libupdater \
|
||||||
|
$(TARGET_RECOVERY_UPDATER_LIBS) \
|
||||||
|
$(TARGET_RECOVERY_UPDATER_EXTRA_LIBS) \
|
||||||
|
$(updater_common_static_libraries)
|
||||||
|
|
||||||
# Each library in TARGET_RECOVERY_UPDATER_LIBS should have a function
|
# Each library in TARGET_RECOVERY_UPDATER_LIBS should have a function
|
||||||
# named "Register_<libname>()". Here we emit a little C function that
|
# named "Register_<libname>()". Here we emit a little C function that
|
||||||
@@ -108,8 +133,6 @@ LOCAL_C_INCLUDES += $(dir $(inc))
|
|||||||
inc :=
|
inc :=
|
||||||
inc_dep_file :=
|
inc_dep_file :=
|
||||||
|
|
||||||
LOCAL_MODULE := updater
|
|
||||||
|
|
||||||
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
LOCAL_FORCE_STATIC_EXECUTABLE := true
|
||||||
|
|
||||||
include $(BUILD_EXECUTABLE)
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|||||||
@@ -45,12 +45,12 @@
|
|||||||
#include "applypatch/applypatch.h"
|
#include "applypatch/applypatch.h"
|
||||||
#include "edify/expr.h"
|
#include "edify/expr.h"
|
||||||
#include "error_code.h"
|
#include "error_code.h"
|
||||||
#include "install.h"
|
#include "updater/install.h"
|
||||||
#include "openssl/sha.h"
|
#include "openssl/sha.h"
|
||||||
#include "minzip/Hash.h"
|
#include "minzip/Hash.h"
|
||||||
#include "ota_io.h"
|
#include "ota_io.h"
|
||||||
#include "print_sha1.h"
|
#include "print_sha1.h"
|
||||||
#include "updater.h"
|
#include "updater/updater.h"
|
||||||
|
|
||||||
#define BLOCKSIZE 4096
|
#define BLOCKSIZE 4096
|
||||||
|
|
||||||
|
|||||||
@@ -17,11 +17,12 @@
|
|||||||
#ifndef _UPDATER_INSTALL_H_
|
#ifndef _UPDATER_INSTALL_H_
|
||||||
#define _UPDATER_INSTALL_H_
|
#define _UPDATER_INSTALL_H_
|
||||||
|
|
||||||
|
struct State;
|
||||||
|
|
||||||
void RegisterInstallFunctions();
|
void RegisterInstallFunctions();
|
||||||
|
|
||||||
// uiPrintf function prints msg to screen as well as logs
|
// uiPrintf function prints msg to screen as well as logs
|
||||||
void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...) __attribute__((__format__(printf, 2, 3)));
|
void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...)
|
||||||
|
__attribute__((__format__(printf, 2, 3)));
|
||||||
static int make_parents(char* _Nonnull name);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
+26
-26
@@ -14,6 +14,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "updater/install.h"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -40,24 +42,22 @@
|
|||||||
#include <android-base/properties.h>
|
#include <android-base/properties.h>
|
||||||
#include <android-base/strings.h>
|
#include <android-base/strings.h>
|
||||||
#include <android-base/stringprintf.h>
|
#include <android-base/stringprintf.h>
|
||||||
|
#include <cutils/android_reboot.h>
|
||||||
#include <ext4_utils/make_ext4fs.h>
|
#include <ext4_utils/make_ext4fs.h>
|
||||||
#include <ext4_utils/wipe.h>
|
#include <ext4_utils/wipe.h>
|
||||||
#include <selinux/label.h>
|
#include <selinux/label.h>
|
||||||
#include <selinux/selinux.h>
|
#include <selinux/selinux.h>
|
||||||
|
|
||||||
#include "bootloader.h"
|
|
||||||
#include "applypatch/applypatch.h"
|
#include "applypatch/applypatch.h"
|
||||||
#include "cutils/android_reboot.h"
|
#include "bootloader.h"
|
||||||
#include "cutils/misc.h"
|
|
||||||
#include "edify/expr.h"
|
#include "edify/expr.h"
|
||||||
#include "error_code.h"
|
#include "error_code.h"
|
||||||
#include "minzip/DirUtil.h"
|
#include "minzip/DirUtil.h"
|
||||||
#include "mounts.h"
|
#include "mounts.h"
|
||||||
#include "openssl/sha.h"
|
#include "openssl/sha.h"
|
||||||
#include "ota_io.h"
|
#include "ota_io.h"
|
||||||
#include "updater.h"
|
|
||||||
#include "install.h"
|
|
||||||
#include "tune2fs.h"
|
#include "tune2fs.h"
|
||||||
|
#include "updater/updater.h"
|
||||||
|
|
||||||
// Send over the buffer to recovery though the command pipe.
|
// Send over the buffer to recovery though the command pipe.
|
||||||
static void uiPrint(State* state, const std::string& buffer) {
|
static void uiPrint(State* state, const std::string& buffer) {
|
||||||
@@ -90,6 +90,27 @@ void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...) {
|
|||||||
uiPrint(state, error_msg);
|
uiPrint(state, error_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create all parent directories of name, if necessary.
|
||||||
|
static int make_parents(char* name) {
|
||||||
|
char* p;
|
||||||
|
for (p = name + (strlen(name)-1); p > name; --p) {
|
||||||
|
if (*p != '/') continue;
|
||||||
|
*p = '\0';
|
||||||
|
if (make_parents(name) < 0) return -1;
|
||||||
|
int result = mkdir(name, 0700);
|
||||||
|
if (result == 0) printf("created [%s]\n", name);
|
||||||
|
*p = '/';
|
||||||
|
if (result == 0 || errno == EEXIST) {
|
||||||
|
// successfully created or already existed; we're done
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
printf("failed to mkdir %s: %s\n", name, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Take a sha-1 digest and return it as a newly-allocated hex string.
|
// Take a sha-1 digest and return it as a newly-allocated hex string.
|
||||||
char* PrintSha1(const uint8_t* digest) {
|
char* PrintSha1(const uint8_t* digest) {
|
||||||
char* buffer = reinterpret_cast<char*>(malloc(SHA_DIGEST_LENGTH*2 + 1));
|
char* buffer = reinterpret_cast<char*>(malloc(SHA_DIGEST_LENGTH*2 + 1));
|
||||||
@@ -569,27 +590,6 @@ Value* PackageExtractFileFn(const char* name, State* state,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create all parent directories of name, if necessary.
|
|
||||||
static int make_parents(char* name) {
|
|
||||||
char* p;
|
|
||||||
for (p = name + (strlen(name)-1); p > name; --p) {
|
|
||||||
if (*p != '/') continue;
|
|
||||||
*p = '\0';
|
|
||||||
if (make_parents(name) < 0) return -1;
|
|
||||||
int result = mkdir(name, 0700);
|
|
||||||
if (result == 0) printf("created [%s]\n", name);
|
|
||||||
*p = '/';
|
|
||||||
if (result == 0 || errno == EEXIST) {
|
|
||||||
// successfully created or already existed; we're done
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
printf("failed to mkdir %s: %s\n", name, strerror(errno));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// symlink target src1 src2 ...
|
// symlink target src1 src2 ...
|
||||||
// unlinks any previously existing src1, src2, etc before creating symlinks.
|
// unlinks any previously existing src1, src2, etc before creating symlinks.
|
||||||
Value* SymlinkFn(const char* name, State* state, int argc, Expr* argv[]) {
|
Value* SymlinkFn(const char* name, State* state, int argc, Expr* argv[]) {
|
||||||
|
|||||||
+4
-4
@@ -14,7 +14,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "updater.h"
|
#include "updater/updater.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "edify/expr.h"
|
#include "edify/expr.h"
|
||||||
#include "blockimg.h"
|
|
||||||
#include "install.h"
|
|
||||||
#include "minzip/Zip.h"
|
|
||||||
#include "minzip/SysUtil.h"
|
#include "minzip/SysUtil.h"
|
||||||
|
#include "minzip/Zip.h"
|
||||||
|
#include "updater/blockimg.h"
|
||||||
|
#include "updater/install.h"
|
||||||
|
|
||||||
// Generated by the makefile, this function defines the
|
// Generated by the makefile, this function defines the
|
||||||
// RegisterDeviceExtensions() function, which calls all the
|
// RegisterDeviceExtensions() function, which calls all the
|
||||||
|
|||||||
Reference in New Issue
Block a user