Refactor libupdater into a seperate module. am: 0c7839ac14 am: cf1dbfa854

am: 8ff7cd20ba

Change-Id: I421800ada6015970dae038ecd58c1d985f8b4b8f
This commit is contained in:
Tao Bao 2016-10-11 03:55:00 +00:00 committed by android-build-merger
commit 3a01338332
9 changed files with 196 additions and 85 deletions

View file

@ -41,25 +41,41 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_MODULE := recovery_component_test
LOCAL_C_INCLUDES := bootable/recovery
LOCAL_SRC_FILES := \
component/applypatch_test.cpp \
component/edify_test.cpp \
component/verifier_test.cpp \
component/applypatch_test.cpp
component/updater_test.cpp \
component/verifier_test.cpp
LOCAL_FORCE_STATIC_EXECUTABLE := true
tune2fs_static_libraries := \
libext2_com_err \
libext2_blkid \
libext2_quota \
libext2_uuid_static \
libext2_e2p \
libext2fs
LOCAL_STATIC_LIBRARIES := \
libapplypatch \
libedify \
libotafault \
libupdater \
libverifier \
libcrypto_utils \
libcrypto \
libminui \
libminzip \
libmounts \
liblog \
libselinux \
libext4_utils_static \
libsparse_static \
libcrypto_utils \
libcrypto \
libcutils \
libbz \
libz \
libc \
libbase \
liblog
libtune2fs \
$(tune2fs_static_libraries)
testdata_out_path := $(TARGET_OUT_DATA_NATIVE_TESTS)/recovery
testdata_files := $(call find-subdir-files, testdata/*)

View file

@ -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);
}

View file

@ -14,41 +14,6 @@
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 := \
libext2_com_err \
libext2_blkid \
@ -57,17 +22,77 @@ tune2fs_static_libraries := \
libext2_e2p \
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 \
$(tune2fs_static_libraries)
LOCAL_CFLAGS += -Wno-unused-parameter -Werror
LOCAL_STATIC_LIBRARIES += \
libsparse_static \
libz
# libupdater (static library)
# ===============================
include $(CLEAR_VARS)
LOCAL_C_INCLUDES += external/e2fsprogs/misc
LOCAL_C_INCLUDES += $(LOCAL_PATH)/..
LOCAL_MODULE := libupdater
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
# named "Register_<libname>()". Here we emit a little C function that
@ -108,8 +133,6 @@ LOCAL_C_INCLUDES += $(dir $(inc))
inc :=
inc_dep_file :=
LOCAL_MODULE := updater
LOCAL_FORCE_STATIC_EXECUTABLE := true
include $(BUILD_EXECUTABLE)

View file

@ -45,12 +45,12 @@
#include "applypatch/applypatch.h"
#include "edify/expr.h"
#include "error_code.h"
#include "install.h"
#include "updater/install.h"
#include "openssl/sha.h"
#include "minzip/Hash.h"
#include "ota_io.h"
#include "print_sha1.h"
#include "updater.h"
#include "updater/updater.h"
#define BLOCKSIZE 4096

View file

@ -17,11 +17,12 @@
#ifndef _UPDATER_INSTALL_H_
#define _UPDATER_INSTALL_H_
struct State;
void RegisterInstallFunctions();
// uiPrintf function prints msg to screen as well as logs
void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...) __attribute__((__format__(printf, 2, 3)));
static int make_parents(char* _Nonnull name);
void uiPrintf(State* _Nonnull state, const char* _Nonnull format, ...)
__attribute__((__format__(printf, 2, 3)));
#endif

View file

@ -14,6 +14,8 @@
* limitations under the License.
*/
#include "updater/install.h"
#include <ctype.h>
#include <errno.h>
#include <stdarg.h>
@ -40,24 +42,22 @@
#include <android-base/properties.h>
#include <android-base/strings.h>
#include <android-base/stringprintf.h>
#include <cutils/android_reboot.h>
#include <ext4_utils/make_ext4fs.h>
#include <ext4_utils/wipe.h>
#include <selinux/label.h>
#include <selinux/selinux.h>
#include "bootloader.h"
#include "applypatch/applypatch.h"
#include "cutils/android_reboot.h"
#include "cutils/misc.h"
#include "bootloader.h"
#include "edify/expr.h"
#include "error_code.h"
#include "minzip/DirUtil.h"
#include "mounts.h"
#include "openssl/sha.h"
#include "ota_io.h"
#include "updater.h"
#include "install.h"
#include "tune2fs.h"
#include "updater/updater.h"
// Send over the buffer to recovery though the command pipe.
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);
}
// 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.
char* PrintSha1(const uint8_t* digest) {
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 ...
// unlinks any previously existing src1, src2, etc before creating symlinks.
Value* SymlinkFn(const char* name, State* state, int argc, Expr* argv[]) {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
#include "updater.h"
#include "updater/updater.h"
#include <stdio.h>
#include <unistd.h>
@ -27,10 +27,10 @@
#include "config.h"
#include "edify/expr.h"
#include "blockimg.h"
#include "install.h"
#include "minzip/Zip.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
// RegisterDeviceExtensions() function, which calls all the