Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04aa5bed authored by Alex Buynytskyy's avatar Alex Buynytskyy
Browse files

Passing additional flags to incremental installation.

Bug: 150803885
Test: atest adb_test adbd_test fastdeploy_test
Change-Id: Ifa9b9e570259d35eb0121817bbb791044c6efcfd
parent fa8bf5be
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -310,7 +310,7 @@ static int install_app_incremental(int argc, const char** argv, bool wait, bool
    const auto start = clock::now();
    int first_apk = -1;
    int last_apk = -1;
    std::vector<std::string_view> args = {"package"sv};
    incremental::Args passthrough_args = {};
    for (int i = 0; i < argc; ++i) {
        const auto arg = std::string_view(argv[i]);
        if (android::base::EndsWithIgnoreCase(arg, ".apk"sv)) {
@@ -318,12 +318,11 @@ static int install_app_incremental(int argc, const char** argv, bool wait, bool
            if (first_apk == -1) {
                first_apk = i;
            }
        } else if (arg.starts_with("install-"sv)) {
        } else if (arg.starts_with("install"sv)) {
            // incremental installation command on the device is the same for all its variations in
            // the adb, e.g. install-multiple or install-multi-package
            args.push_back("install"sv);
        } else {
            args.push_back(arg);
            passthrough_args.push_back(arg);
        }
    }

@@ -344,7 +343,7 @@ static int install_app_incremental(int argc, const char** argv, bool wait, bool
    }

    printf("Performing Incremental Install\n");
    auto server_process = incremental::install(files, silent);
    auto server_process = incremental::install(files, passthrough_args, silent);
    if (!server_process) {
        return -1;
    }
+4 −8
Original line number Diff line number Diff line
@@ -93,12 +93,10 @@ static std::pair<unique_fd, std::string> read_and_encode_signature(Size file_siz

// Send install-incremental to the device along with properly configured file descriptors in
// streaming format. Once connection established, send all fs-verity tree bytes.
static unique_fd start_install(const Files& files, bool silent) {
static unique_fd start_install(const Files& files, const Args& passthrough_args, bool silent) {
    std::vector<std::string> command_args{"package", "install-incremental"};
    command_args.insert(command_args.end(), passthrough_args.begin(), passthrough_args.end());

    // fd's with positions at the beginning of fs-verity
    std::vector<unique_fd> signature_fds;
    signature_fds.reserve(files.size());
    for (int i = 0, size = files.size(); i < size; ++i) {
        const auto& file = files[i];

@@ -118,8 +116,6 @@ static unique_fd start_install(const Files& files, bool silent) {
        auto file_desc = StringPrintf("%s:%lld:%d:%s:1", android::base::Basename(file).c_str(),
                                      (long long)st.st_size, i, signature.c_str());
        command_args.push_back(std::move(file_desc));

        signature_fds.push_back(std::move(signature_fd));
    }

    std::string error;
@@ -150,8 +146,8 @@ bool can_install(const Files& files) {
    return true;
}

std::optional<Process> install(const Files& files, bool silent) {
    auto connection_fd = start_install(files, silent);
std::optional<Process> install(const Files& files, const Args& passthrough_args, bool silent) {
    auto connection_fd = start_install(files, passthrough_args, silent);
    if (connection_fd < 0) {
        if (!silent) {
            fprintf(stderr, "adb: failed to initiate installation on device.\n");
+2 −1
Original line number Diff line number Diff line
@@ -26,9 +26,10 @@
namespace incremental {

using Files = std::vector<std::string>;
using Args = std::vector<std::string_view>;

bool can_install(const Files& files);
std::optional<Process> install(const Files& files, bool silent);
std::optional<Process> install(const Files& files, const Args& passthrough_args, bool silent);

enum class Result { Success, Failure, None };
Result wait_for_installation(int read_fd);