Merge "Create arch specific cache dirs during zygote startup."
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
#include <cutils/properties.h>
|
#include <cutils/properties.h>
|
||||||
#include <cutils/trace.h>
|
#include <cutils/trace.h>
|
||||||
#include <android_runtime/AndroidRuntime.h>
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
|
#include <private/android_filesystem_config.h> // for AID_SYSTEM
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -137,6 +138,44 @@ static size_t computeArgBlockSize(int argc, char* const argv[]) {
|
|||||||
return (end - start);
|
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__)
|
#if defined(__LP64__)
|
||||||
static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist64";
|
static const char ABI_LIST_PROPERTY[] = "ro.product.cpu.abilist64";
|
||||||
static const char ZYGOTE_NICE_NAME[] = "zygote64";
|
static const char ZYGOTE_NICE_NAME[] = "zygote64";
|
||||||
@@ -223,6 +262,9 @@ int main(int argc, char* const argv[])
|
|||||||
args.add(application ? String8("application") : String8("tool"));
|
args.add(application ? String8("application") : String8("tool"));
|
||||||
runtime.setClassNameAndArgs(className, argc - i, argv + i);
|
runtime.setClassNameAndArgs(className, argc - i, argv + i);
|
||||||
} else {
|
} else {
|
||||||
|
// We're in zygote mode.
|
||||||
|
maybeCreateDalvikCache();
|
||||||
|
|
||||||
if (startSystemServer) {
|
if (startSystemServer) {
|
||||||
args.add(String8("start-system-server"));
|
args.add(String8("start-system-server"));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user