diff options
author | Richard Uhler <ruhler@google.com> | 2015-03-26 16:28:29 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-03-26 16:28:29 +0000 |
commit | 59d996fb0d7050013078bd80f24b698363e69fa8 (patch) | |
tree | 8806de5898e21a8220ccf1c850a2a553734b19e9 /cmds | |
parent | 5b20fd0882e6a1754cad7342f7ceda3753e8f567 (diff) | |
parent | da08fc672ff9643ada87a38fb98c7bd604b678ad (diff) | |
download | frameworks_native-59d996fb0d7050013078bd80f24b698363e69fa8.zip frameworks_native-59d996fb0d7050013078bd80f24b698363e69fa8.tar.gz frameworks_native-59d996fb0d7050013078bd80f24b698363e69fa8.tar.bz2 |
am da08fc67: am b84a3dde: am bc5aceb1: Merge "Store odex files in oat/<isa>/ directory."
* commit 'da08fc672ff9643ada87a38fb98c7bd604b678ad':
Store odex files in oat/<isa>/ directory.
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/installd/commands.c | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c index 9133a34..9fc3f40 100644 --- a/cmds/installd/commands.c +++ b/cmds/installd/commands.c @@ -938,6 +938,42 @@ static bool ShouldUseSwapFileForDexopt() { return (strcmp(low_mem_buf, "true") == 0); } +/* + * Computes the odex file for the given apk_path and instruction_set. + * /system/framework/whatever.jar -> /system/framework/oat/<isa>/whatever.odex + * + * Returns false if it failed to determine the odex file path. + */ +static bool calculate_odex_file_path(char path[PKG_PATH_MAX], + const char *apk_path, + const char *instruction_set) +{ + if (strlen(apk_path) + strlen("oat/") + strlen(instruction_set) + + strlen("/") + strlen("odex") + 1 > PKG_PATH_MAX) { + ALOGE("apk_path '%s' may be too long to form odex file path.\n", apk_path); + return false; + } + + strcpy(path, apk_path); + char *end = strrchr(path, '/'); + if (end == NULL) { + ALOGE("apk_path '%s' has no '/'s in it?!\n", apk_path); + return false; + } + const char *apk_end = apk_path + (end - path); // strrchr(apk_path, '/'); + + strcpy(end + 1, "oat/"); // path = /system/framework/oat/\0 + strcat(path, instruction_set); // path = /system/framework/oat/<isa>\0 + strcat(path, apk_end); // path = /system/framework/oat/<isa>/whatever.jar\0 + end = strrchr(path, '.'); + if (end == NULL) { + ALOGE("apk_path '%s' has no extension.\n", apk_path); + return false; + } + strcpy(end + 1, "odex"); + return true; +} + int dexopt(const char *apk_path, uid_t uid, bool is_public, const char *pkgname, const char *instruction_set, bool vm_safe_mode, bool is_patchoat, bool debuggable) @@ -977,21 +1013,9 @@ int dexopt(const char *apk_path, uid_t uid, bool is_public, } if (is_patchoat) { - /* /system/framework/whatever.jar -> /system/framework/<isa>/whatever.odex */ - strcpy(in_odex_path, apk_path); - end = strrchr(in_odex_path, '/'); - if (end == NULL) { - ALOGE("apk_path '%s' has no '/'s in it?!\n", apk_path); - return -1; - } - const char *apk_end = apk_path + (end - in_odex_path); // strrchr(apk_path, '/'); - strcpy(end + 1, instruction_set); // in_odex_path now is /system/framework/<isa>\0 - strcat(in_odex_path, apk_end); - end = strrchr(in_odex_path, '.'); - if (end == NULL) { - return -1; + if (!calculate_odex_file_path(in_odex_path, apk_path, instruction_set)) { + return -1; } - strcpy(end + 1, "odex"); input_file = in_odex_path; } else { input_file = apk_path; |