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

Commit d0246c80 authored by Nicolas Geoffray's avatar Nicolas Geoffray Committed by android-build-merger
Browse files

Merge "Adjust installd with new dexopt return values." am: b29c82b6 am: f1188685 am: 6d938865

am: fe27746e

Change-Id: I66106139d63eb0095d05c240ab48dec8a194ec79
parents 4a7e30f6 fe27746e
Loading
Loading
Loading
Loading
+39 −39
Original line number Diff line number Diff line
@@ -78,9 +78,11 @@ static constexpr int FLAG_CLEAR_CACHE_ONLY = 1 << 8;
static constexpr int FLAG_CLEAR_CODE_CACHE_ONLY = 1 << 9;

/* dexopt needed flags matching those in dalvik.system.DexFile */
static constexpr int DEXOPT_DEX2OAT_NEEDED       = 1;
static constexpr int DEXOPT_PATCHOAT_NEEDED      = 2;
static constexpr int DEXOPT_SELF_PATCHOAT_NEEDED = 3;
static constexpr int DEX2OAT_FROM_SCRATCH        = 1;
static constexpr int DEX2OAT_FOR_BOOT_IMAGE      = 2;
static constexpr int DEX2OAT_FOR_FILTER          = 3;
static constexpr int DEX2OAT_FOR_RELOCATION      = 4;
static constexpr int PATCHOAT_FOR_RELOCATION     = 5;

typedef int fd_t;

@@ -1687,20 +1689,25 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins

    const char *input_file;
    char in_odex_path[PKG_PATH_MAX];
    switch (dexopt_needed) {
        case DEXOPT_DEX2OAT_NEEDED:
    int dexopt_action = abs(dexopt_needed);
    bool is_odex_location = dexopt_needed < 0;
    switch (dexopt_action) {
        case DEX2OAT_FROM_SCRATCH:
        case DEX2OAT_FOR_BOOT_IMAGE:
        case DEX2OAT_FOR_FILTER:
        case DEX2OAT_FOR_RELOCATION:
            input_file = apk_path;
            break;

        case DEXOPT_PATCHOAT_NEEDED:
        case PATCHOAT_FOR_RELOCATION:
            if (is_odex_location) {
                if (!calculate_odex_file_path(in_odex_path, apk_path, instruction_set)) {
                    return -1;
                }
                input_file = in_odex_path;
            break;

        case DEXOPT_SELF_PATCHOAT_NEEDED:
            } else {
                input_file = out_oat_path;
            }
            break;

        default:
@@ -1737,8 +1744,7 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
    // unlink the old one.
    base::unique_fd in_vdex_fd;
    std::string in_vdex_path_str;
    if (dexopt_needed == DEXOPT_PATCHOAT_NEEDED
        || dexopt_needed == DEXOPT_SELF_PATCHOAT_NEEDED) {
    if (dexopt_action == PATCHOAT_FOR_RELOCATION) {
        // `input_file` is the OAT file to be relocated. The VDEX has to be there as well.
        in_vdex_path_str = create_vdex_filename(input_file);
        if (in_vdex_path_str.empty()) {
@@ -1751,28 +1757,26 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
                in_vdex_path_str.c_str(), strerror(errno));
            return -1;
        }
    } else if (dexopt_action != DEX2OAT_FROM_SCRATCH) {
        // Open the possibly existing vdex. If none exist, we pass -1 to dex2oat for input-vdex-fd.
        const char* path = nullptr;
        if (is_odex_location) {
            if (calculate_odex_file_path(in_odex_path, apk_path, instruction_set)) {
                path = in_odex_path;
            } else {
        // Open the possibly existing vdex in the `out_oat_path`. If none exist, we pass -1
        // to dex2oat for input-vdex-fd.
        in_vdex_path_str = create_vdex_filename(out_oat_path);
        if (in_vdex_path_str.empty()) {
            ALOGE("installd cannot compute input vdex location for '%s'\n", out_oat_path);
                ALOGE("installd cannot compute input vdex location for '%s'\n", apk_path);
                return -1;
            }
        in_vdex_fd.reset(open(in_vdex_path_str.c_str(), O_RDONLY, 0));
        // If there is no vdex file in out_oat_path, check if we have a vdex
        // file next to the odex file. For other failures, we will just pass a -1 fd.
        if (in_vdex_fd.get() < 0 && (errno == ENOENT) && IsOutputDalvikCache(oat_dir)) {
            if (calculate_odex_file_path(in_odex_path, apk_path, instruction_set)) {
              in_vdex_path_str = create_vdex_filename(std::string(in_odex_path));
        } else {
            path = out_oat_path;
        }
        in_vdex_path_str = create_vdex_filename(path);
        if (in_vdex_path_str.empty()) {
                  ALOGE("installd cannot compute input vdex location for '%s'\n", in_odex_path);
            ALOGE("installd cannot compute input vdex location for '%s'\n", path);
            return -1;
        }
        in_vdex_fd.reset(open(in_vdex_path_str.c_str(), O_RDONLY, 0));
    }
        }
    }

    // Infer the name of the output VDEX and create it.
    const std::string out_vdex_path_str = create_vdex_filename(out_oat_path_str);
@@ -1815,7 +1819,7 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
    // Avoid generating an app image for extract only since it will not contain any classes.
    Dex2oatFileWrapper<std::function<void ()>> image_fd;
    const std::string image_path = create_image_filename(out_oat_path);
    if (dexopt_needed == DEXOPT_DEX2OAT_NEEDED && !image_path.empty()) {
    if (dexopt_action != PATCHOAT_FOR_RELOCATION && !image_path.empty()) {
        char app_image_format[kPropertyValueMax];
        bool have_app_image_format =
                get_property("dalvik.vm.appimageformat", app_image_format, NULL) > 0;
@@ -1865,8 +1869,7 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
            _exit(67);
        }

        if (dexopt_needed == DEXOPT_PATCHOAT_NEEDED
            || dexopt_needed == DEXOPT_SELF_PATCHOAT_NEEDED) {
        if (dexopt_action == PATCHOAT_FOR_RELOCATION) {
            run_patchoat(input_fd.get(),
                         in_vdex_fd.get(),
                         out_oat_fd.get(),
@@ -1877,7 +1880,7 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
                         out_vdex_path_str.c_str(),
                         pkgname,
                         instruction_set);
        } else if (dexopt_needed == DEXOPT_DEX2OAT_NEEDED) {
        } else {
            // Pass dex2oat the relative path to the input file.
            const char *input_file_name = get_location_from_path(input_file);
            run_dex2oat(input_fd.get(),
@@ -1895,9 +1898,6 @@ int dexopt(const char* apk_path, uid_t uid, const char* pkgname, const char* ins
                        boot_complete,
                        reference_profile_fd.get(),
                        shared_libraries);
        } else {
            ALOGE("Invalid dexopt needed: %d\n", dexopt_needed);
            _exit(73);
        }
        _exit(68);   /* only get here on exec failure */
    } else {