diff options
author | Narayan Kamath <narayan@google.com> | 2014-04-25 11:43:22 +0100 |
---|---|---|
committer | Narayan Kamath <narayan@google.com> | 2014-04-30 09:26:05 +0100 |
commit | d1e127e141a8080477f3b3becb792f138ca9ab65 (patch) | |
tree | 53544b6d9b19b84d4f712502a93406f4bf470266 /cmds | |
parent | 19db0f036aa889ff05220b630262461e333faa85 (diff) | |
download | frameworks_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.cpp | 42 |
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")); } |