summaryrefslogtreecommitdiffstats
path: root/cmds
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2014-04-25 11:43:22 +0100
committerNarayan Kamath <narayan@google.com>2014-04-30 09:26:05 +0100
commitd1e127e141a8080477f3b3becb792f138ca9ab65 (patch)
tree53544b6d9b19b84d4f712502a93406f4bf470266 /cmds
parent19db0f036aa889ff05220b630262461e333faa85 (diff)
downloadframeworks_base-d1e127e141a8080477f3b3becb792f138ca9ab65.zip
frameworks_base-d1e127e141a8080477f3b3becb792f138ca9ab65.tar.gz
frameworks_base-d1e127e141a8080477f3b3becb792f138ca9ab65.tar.bz2
Create arch specific cache dirs during zygote startup.
The runtime expects them to exist before it's launched. The boot image / art files are created during the first zygote launch. Change-Id: I5ed0ad4854dc7785246344c8f6eaf54e560feb7d
Diffstat (limited to 'cmds')
-rw-r--r--cmds/app_process/app_main.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 3481437..9b811d1 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -15,6 +15,7 @@
#include <cutils/properties.h>
#include <cutils/trace.h>
#include <android_runtime/AndroidRuntime.h>
+#include <private/android_filesystem_config.h> // for AID_SYSTEM
#include <stdlib.h>
#include <stdio.h>
@@ -136,6 +137,44 @@ static size_t computeArgBlockSize(int argc, char* const argv[]) {
return (end - start);
}
+static void maybeCreateDalvikCache() {
+#if defined(__aarch64__)
+ static const char kInstructionSet[] = "arm64";
+#elif defined(__x86_64__)
+ static const char kInstructionSet[] = "x86_64";
+#elif defined(__arm__)
+ static const char kInstructionSet[] = "arm";
+#elif defined(__x86__)
+ static const char kInstructionSet[] = "x86";
+#elif defined (__mips__)
+ static const char kInstructionSet[] = "mips";
+#else
+#error "Unknown instruction set"
+#endif
+ const char* androidRoot = getenv("ANDROID_DATA");
+ LOG_ALWAYS_FATAL_IF(androidRoot == NULL, "ANDROID_DATA environment variable unset");
+
+ char dalvikCacheDir[PATH_MAX];
+ const int numChars = snprintf(dalvikCacheDir, PATH_MAX,
+ "%s/dalvik-cache/%s", androidRoot, kInstructionSet);
+ LOG_ALWAYS_FATAL_IF((numChars >= PATH_MAX || numChars < 0),
+ "Error constructing dalvik cache : %s", strerror(errno));
+
+ int result = mkdir(dalvikCacheDir, 0771);
+ LOG_ALWAYS_FATAL_IF((result < 0 && errno != EEXIST),
+ "Error creating cache dir %s : %s", dalvikCacheDir, strerror(errno));
+
+ // We always perform these steps because the directory might
+ // already exist, with wider permissions and a different owner
+ // than we'd like.
+ result = chown(dalvikCacheDir, AID_SYSTEM, AID_SYSTEM);
+ LOG_ALWAYS_FATAL_IF((result < 0), "Error changing dalvik-cache ownership : %s", strerror(errno));
+
+ result = chmod(dalvikCacheDir, 0771);
+ LOG_ALWAYS_FATAL_IF((result < 0),
+ "Error changing dalvik-cache permissions : %s", strerror(errno));
+}
+
#if defined(__LP64__)
static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist64";
static const char ZYGOTE_NICE_NAME[] = "zygote64";
@@ -213,6 +252,9 @@ int main(int argc, char* const argv[])
args.add(application ? String8("application") : String8("tool"));
runtime.setClassNameAndArgs(className, argc - i, argv + i);
} else {
+ // We're in zygote mode.
+ maybeCreateDalvikCache();
+
if (startSystemServer) {
args.add(String8("start-system-server"));
}