diff options
Diffstat (limited to 'cmds/installd/commands.cpp')
-rw-r--r-- | cmds/installd/commands.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index cbd8a0982b..4fde1ee4df 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -2250,5 +2250,35 @@ int move_ab(const char* apk_path, const char* instruction_set, const char* oat_d return success ? 0 : -1; } +bool delete_odex(const char *apk_path, const char *instruction_set, const char *oat_dir) { + // Delete the oat/odex file. + char out_path[PKG_PATH_MAX]; + if (!create_oat_out_path(apk_path, instruction_set, oat_dir, out_path)) { + return false; + } + + // In case of a permission failure report the issue. Otherwise just print a warning. + auto unlink_and_check = [](const char* path) -> bool { + int result = unlink(path); + if (result != 0) { + if (errno == EACCES || errno == EPERM) { + PLOG(ERROR) << "Could not unlink " << path; + return false; + } + PLOG(WARNING) << "Could not unlink " << path; + } + return true; + }; + + // Delete the oat/odex file. + bool return_value_oat = unlink_and_check(out_path); + + // Derive and delete the app image. + bool return_value_art = unlink_and_check(create_image_filename(out_path).c_str()); + + // Report success. + return return_value_oat && return_value_art; +} + } // namespace installd } // namespace android |