From a2fc49d54dfa415e227cbd1b72d40ccba1582bde Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Tue, 4 Feb 2020 14:11:38 +0000 Subject: [PATCH] Clean up options for ART runtime. The ART runtime no longer runs dex2oat directly, so all -Xcompiler-options flags are used only by JIT. As such, -Xms and -Xmx flags are useless, so we do not need to pass them. When we want to skip compilation, pass -Xnoimage-dex2oat and do not pass any other -Ximage-compiler-option. Also, since we no longer relocate to /data (patchoat has been removed), do not request -Xnorelocate as relocation in memory is OK. Pass --generate-mini-debug-info if dalvik.vm.minidebuginfo is set also as -Ximage-compiler-option. And move the check for /system/etc/boot-image.prof from AndroidRuntime.cpp to the deprecated GenerateImage() in art/runtime/gc/space/image_space.cc . If it's not found, just report the error and compile with the "speed" filter. Previously we used to set --compiler-filter=speed-profile, making the dalvik.vm.image-dex2oat-filter useless. Instead rely on dex2oat using speed-profile or speed as the default. Test: aosp_taimen-userdebug boots; check zygote args in logcat. Bug: 119800099 Change-Id: Ie019f00e3b37030920a72b1ad8944a33b8665817 --- core/jni/AndroidRuntime.cpp | 149 ++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 83 deletions(-) diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index cbba5bbee01ca..9a27e719e5d9a 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -675,8 +675,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p char cachePruneBuf[sizeof("-Xzygote-max-boot-retry=")-1 + PROPERTY_VALUE_MAX]; char dex2oatXmsImageFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; char dex2oatXmxImageFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX]; - char dex2oatXmsFlagsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; - char dex2oatXmxFlagsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX]; char dex2oatCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX]; char dex2oatImageCompilerFilterBuf[sizeof("--compiler-filter=")-1 + PROPERTY_VALUE_MAX]; char dex2oatThreadsBuf[sizeof("-j")-1 + PROPERTY_VALUE_MAX]; @@ -926,88 +924,45 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p bool skip_compilation = ((strcmp(voldDecryptBuf, "trigger_restart_min_framework") == 0) || (strcmp(voldDecryptBuf, "1") == 0)); - // Extra options for boot.art/boot.oat image generation. - parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xms", dex2oatXmsImageFlagsBuf, - "-Xms", "-Ximage-compiler-option"); - parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xmx", dex2oatXmxImageFlagsBuf, - "-Xmx", "-Ximage-compiler-option"); - if (skip_compilation) { - addOption("-Ximage-compiler-option"); - addOption("--compiler-filter=assume-verified"); - } else { - parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf, - "--compiler-filter=", "-Ximage-compiler-option"); - } - - // If there is a boot profile, it takes precedence over the image and preloaded classes. - if (hasFile("/system/etc/boot-image.prof")) { - addOption("-Ximage-compiler-option"); - addOption("--profile-file=/system/etc/boot-image.prof"); - addOption("-Ximage-compiler-option"); - addOption("--compiler-filter=speed-profile"); - } else { - ALOGE("Missing boot-image.prof file, /system/etc/boot-image.prof not found: %s\n", - strerror(errno)); - return -1; - } - - - // If there is a dirty-image-objects file, push it. - if (hasFile("/system/etc/dirty-image-objects")) { - addOption("-Ximage-compiler-option"); - addOption("--dirty-image-objects=/system/etc/dirty-image-objects"); - } - - property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, ""); - parseExtraOpts(dex2oatImageFlagsBuf, "-Ximage-compiler-option"); - - // Extra options for DexClassLoader. - parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xms", dex2oatXmsFlagsBuf, - "-Xms", "-Xcompiler-option"); - parseCompilerRuntimeOption("dalvik.vm.dex2oat-Xmx", dex2oatXmxFlagsBuf, - "-Xmx", "-Xcompiler-option"); + // Extra options for JIT. if (skip_compilation) { addOption("-Xcompiler-option"); addOption("--compiler-filter=assume-verified"); - - // We skip compilation when a minimal runtime is brought up for decryption. In that case - // /data is temporarily backed by a tmpfs, which is usually small. - // If the system image contains prebuilts, they will be relocated into the tmpfs. In this - // specific situation it is acceptable to *not* relocate and run out of the prebuilts - // directly instead. - addOption("--runtime-arg"); - addOption("-Xnorelocate"); } else { parseCompilerOption("dalvik.vm.dex2oat-filter", dex2oatCompilerFilterBuf, "--compiler-filter=", "-Xcompiler-option"); } parseCompilerOption("dalvik.vm.dex2oat-threads", dex2oatThreadsBuf, "-j", "-Xcompiler-option"); - parseCompilerOption("dalvik.vm.image-dex2oat-threads", dex2oatThreadsImageBuf, "-j", - "-Ximage-compiler-option"); parseCompilerOption("dalvik.vm.dex2oat-cpu-set", dex2oatCpuSetBuf, "--cpu-set=", "-Xcompiler-option"); - parseCompilerOption("dalvik.vm.image-dex2oat-cpu-set", dex2oatCpuSetImageBuf, "--cpu-set=", - "-Ximage-compiler-option"); - - // The runtime will compile a boot image, when necessary, not using installd. Thus, we need to - // pass the instruction-set-features/variant as an image-compiler-option. - // Note: it is OK to reuse the buffer, as the values are exactly the same between - // * compiler-option, used for runtime compilation (DexClassLoader) - // * image-compiler-option, used for boot-image compilation on device // Copy the variant. sprintf(dex2oat_isa_variant_key, "dalvik.vm.isa.%s.variant", ABI_STRING); - parseCompilerOption(dex2oat_isa_variant_key, dex2oat_isa_variant, - "--instruction-set-variant=", "-Ximage-compiler-option"); parseCompilerOption(dex2oat_isa_variant_key, dex2oat_isa_variant, "--instruction-set-variant=", "-Xcompiler-option"); // Copy the features. sprintf(dex2oat_isa_features_key, "dalvik.vm.isa.%s.features", ABI_STRING); - parseCompilerOption(dex2oat_isa_features_key, dex2oat_isa_features, - "--instruction-set-features=", "-Ximage-compiler-option"); parseCompilerOption(dex2oat_isa_features_key, dex2oat_isa_features, "--instruction-set-features=", "-Xcompiler-option"); + /* + * When running with debug.generate-debug-info, add --generate-debug-info to + * the compiler options so that both JITted code and the boot image extension, + * if it is compiled on device, will include native debugging information. + */ + property_get("debug.generate-debug-info", propBuf, ""); + bool generate_debug_info = (strcmp(propBuf, "true") == 0); + if (generate_debug_info) { + addOption("-Xcompiler-option"); + addOption("--generate-debug-info"); + } + + // The mini-debug-info makes it possible to backtrace through compiled code. + bool generate_mini_debug_info = property_get_bool("dalvik.vm.minidebuginfo", 0); + if (generate_mini_debug_info) { + addOption("-Xcompiler-option"); + addOption("--generate-mini-debug-info"); + } property_get("dalvik.vm.dex2oat-flags", dex2oatFlagsBuf, ""); parseExtraOpts(dex2oatFlagsBuf, "-Xcompiler-option"); @@ -1016,6 +971,53 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p property_get("dalvik.vm.extra-opts", extraOptsBuf, ""); parseExtraOpts(extraOptsBuf, NULL); + // Extra options for boot image extension generation. + if (skip_compilation) { + addOption("-Xnoimage-dex2oat"); + } else { + parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xms", dex2oatXmsImageFlagsBuf, + "-Xms", "-Ximage-compiler-option"); + parseCompilerRuntimeOption("dalvik.vm.image-dex2oat-Xmx", dex2oatXmxImageFlagsBuf, + "-Xmx", "-Ximage-compiler-option"); + + parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf, + "--compiler-filter=", "-Ximage-compiler-option"); + + // If there is a dirty-image-objects file, push it. + if (hasFile("/system/etc/dirty-image-objects")) { + addOption("-Ximage-compiler-option"); + addOption("--dirty-image-objects=/system/etc/dirty-image-objects"); + } + + parseCompilerOption("dalvik.vm.image-dex2oat-threads", dex2oatThreadsImageBuf, "-j", + "-Ximage-compiler-option"); + parseCompilerOption("dalvik.vm.image-dex2oat-cpu-set", dex2oatCpuSetImageBuf, "--cpu-set=", + "-Ximage-compiler-option"); + + // The runtime may compile a boot image extension, when necessary, not using installd. + // Thus, we need to pass the instruction-set-features/variant as an image-compiler-option. + // Note: it is OK to reuse the buffer, as the values are exactly the same between + // * compiler-option, used for runtime compilation (DexClassLoader) + // * image-compiler-option, used for boot-image compilation on device + parseCompilerOption(dex2oat_isa_variant_key, dex2oat_isa_variant, + "--instruction-set-variant=", "-Ximage-compiler-option"); + parseCompilerOption(dex2oat_isa_features_key, dex2oat_isa_features, + "--instruction-set-features=", "-Ximage-compiler-option"); + + if (generate_debug_info) { + addOption("-Ximage-compiler-option"); + addOption("--generate-debug-info"); + } + + if (generate_mini_debug_info) { + addOption("-Ximage-compiler-option"); + addOption("--generate-mini-debug-info"); + } + + property_get("dalvik.vm.image-dex2oat-flags", dex2oatImageFlagsBuf, ""); + parseExtraOpts(dex2oatImageFlagsBuf, "-Ximage-compiler-option"); + } + /* Set the properties for locale */ { strcpy(localeOption, "-Duser.locale="); @@ -1073,25 +1075,6 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p parseRuntimeOption("dalvik.vm.zygote.max-boot-retry", cachePruneBuf, "-Xzygote-max-boot-retry="); - /* - * When running with debug.generate-debug-info, add --generate-debug-info to - * the compiler options so that the boot image, if it is compiled on device, - * will include native debugging information. - */ - property_get("debug.generate-debug-info", propBuf, ""); - if (strcmp(propBuf, "true") == 0) { - addOption("-Xcompiler-option"); - addOption("--generate-debug-info"); - addOption("-Ximage-compiler-option"); - addOption("--generate-debug-info"); - } - - // The mini-debug-info makes it possible to backtrace through JIT code. - if (property_get_bool("dalvik.vm.minidebuginfo", 0)) { - addOption("-Xcompiler-option"); - addOption("--generate-mini-debug-info"); - } - // If set, the property below can be used to enable core platform API violation reporting. property_get("persist.debug.dalvik.vm.core_platform_api_policy", propBuf, ""); if (propBuf[0] != '\0') {