summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorRichard Uhler <ruhler@google.com>2015-03-26 16:28:29 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-03-26 16:28:29 +0000
commit59d996fb0d7050013078bd80f24b698363e69fa8 (patch)
tree8806de5898e21a8220ccf1c850a2a553734b19e9 /cmds
parent5b20fd0882e6a1754cad7342f7ceda3753e8f567 (diff)
parentda08fc672ff9643ada87a38fb98c7bd604b678ad (diff)
downloadframeworks_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.c52
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;