diff options
-rw-r--r-- | runtime/oat_file_assistant.cc | 17 | ||||
-rw-r--r-- | runtime/oat_file_manager.cc | 2 | ||||
-rw-r--r-- | test/147-stripped-dex-fallback/expected.txt | 1 | ||||
-rw-r--r-- | test/147-stripped-dex-fallback/info.txt | 2 | ||||
-rwxr-xr-x | test/147-stripped-dex-fallback/run | 24 | ||||
-rw-r--r-- | test/147-stripped-dex-fallback/src/Main.java | 21 | ||||
-rw-r--r-- | test/Android.run-test.mk | 1 | ||||
-rwxr-xr-x | test/etc/run-test-jar | 19 | ||||
-rwxr-xr-x | test/run-test | 6 |
9 files changed, 81 insertions, 12 deletions
diff --git a/runtime/oat_file_assistant.cc b/runtime/oat_file_assistant.cc index 78e372ad02..3f95772b4f 100644 --- a/runtime/oat_file_assistant.cc +++ b/runtime/oat_file_assistant.cc @@ -492,10 +492,21 @@ bool OatFileAssistant::GivenOatFileIsOutOfDate(const OatFile& file) { const ImageInfo* image_info = GetImageInfo(); if (image_info == nullptr) { VLOG(oat) << "No image for oat image checksum to match against."; - return true; - } - if (file.GetOatHeader().GetImageFileLocationOatChecksum() != GetCombinedImageChecksum()) { + if (HasOriginalDexFiles()) { + return true; + } + + // If there is no original dex file to fall back to, grudgingly accept + // the oat file. This could technically lead to crashes, but there's no + // way we could find a better oat file to use for this dex location, + // and it's better than being stuck in a boot loop with no way out. + // The problem will hopefully resolve itself the next time the runtime + // starts up. + LOG(WARNING) << "Dex location " << dex_location_ << " does not seem to include dex file. " + << "Allow oat file use. This is potentially dangerous."; + } else if (file.GetOatHeader().GetImageFileLocationOatChecksum() + != GetCombinedImageChecksum()) { VLOG(oat) << "Oat image checksum does not match image checksum."; return true; } diff --git a/runtime/oat_file_manager.cc b/runtime/oat_file_manager.cc index 94f6345bb0..3846605400 100644 --- a/runtime/oat_file_manager.cc +++ b/runtime/oat_file_manager.cc @@ -364,7 +364,7 @@ std::vector<std::unique_ptr<const DexFile>> OatFileManager::OpenDexFilesFromOat( // However, if the app was part of /system and preopted, there is no original dex file // available. In that case grudgingly accept the oat file. - if (!DexFile::MaybeDex(dex_location)) { + if (!oat_file_assistant.HasOriginalDexFiles()) { accept_oat_file = true; LOG(WARNING) << "Dex location " << dex_location << " does not seem to include dex file. " << "Allow oat file use. This is potentially dangerous."; diff --git a/test/147-stripped-dex-fallback/expected.txt b/test/147-stripped-dex-fallback/expected.txt new file mode 100644 index 0000000000..af5626b4a1 --- /dev/null +++ b/test/147-stripped-dex-fallback/expected.txt @@ -0,0 +1 @@ +Hello, world! diff --git a/test/147-stripped-dex-fallback/info.txt b/test/147-stripped-dex-fallback/info.txt new file mode 100644 index 0000000000..72a2ca8d4c --- /dev/null +++ b/test/147-stripped-dex-fallback/info.txt @@ -0,0 +1,2 @@ +Verify that we fallback to running out of dex code in the oat file if there is +no image and the original dex code has been stripped. diff --git a/test/147-stripped-dex-fallback/run b/test/147-stripped-dex-fallback/run new file mode 100755 index 0000000000..e594010b9e --- /dev/null +++ b/test/147-stripped-dex-fallback/run @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Copyright (C) 2014 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# ensure flags includes prebuild. +flags="$@" +if [[ "${flags}" == *--no-prebuild* ]] ; then + echo "Test 147-stripped-dex-fallback is not intended to run in no-prebuild mode." + exit 1 +fi + +${RUN} ${flags} --strip-dex --no-dex2oat diff --git a/test/147-stripped-dex-fallback/src/Main.java b/test/147-stripped-dex-fallback/src/Main.java new file mode 100644 index 0000000000..1ef6289559 --- /dev/null +++ b/test/147-stripped-dex-fallback/src/Main.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + public static void main(String[] args) { + System.out.println("Hello, world!"); + } +} diff --git a/test/Android.run-test.mk b/test/Android.run-test.mk index 1edc5993eb..c5e07dede2 100644 --- a/test/Android.run-test.mk +++ b/test/Android.run-test.mk @@ -287,6 +287,7 @@ TEST_ART_BROKEN_PREBUILD_RUN_TESTS := # 529 and 555: b/27784033 TEST_ART_BROKEN_NO_PREBUILD_TESTS := \ 117-nopatchoat \ + 147-stripped-dex-fallback \ 554-jit-profile-file \ 529-checker-unresolved \ 555-checker-regression-x86const diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar index 28a99de099..d61fc8f8fc 100755 --- a/test/etc/run-test-jar +++ b/test/etc/run-test-jar @@ -37,6 +37,7 @@ PATCHOAT="" PREBUILD="y" QUIET="n" RELOCATE="y" +STRIP_DEX="n" SECONDARY_DEX="" TIME_OUT="gdb" # "n" (disabled), "timeout" (use timeout), "gdb" (use gdb) # Value in seconds @@ -118,6 +119,9 @@ while true; do elif [ "x$1" = "x--prebuild" ]; then PREBUILD="y" shift + elif [ "x$1" = "x--strip-dex" ]; then + STRIP_DEX="y" + shift elif [ "x$1" = "x--host" ]; then HOST="y" ANDROID_ROOT="$ANDROID_HOST_OUT" @@ -380,6 +384,7 @@ fi dex2oat_cmdline="true" mkdir_cmdline="mkdir -p ${DEX_LOCATION}/dalvik-cache/$ISA" +strip_cmdline="true" # Pick a base that will force the app image to get relocated. app_image="--base=0x4000 --app-image-file=$DEX_LOCATION/oat/$ISA/$TEST_NAME.art" @@ -409,6 +414,10 @@ if [ "$PREBUILD" = "y" ]; then fi fi +if [ "$STRIP_DEX" = "y" ]; then + strip_cmdline="zip --quiet --delete $DEX_LOCATION/$TEST_NAME.jar classes.dex" +fi + DALVIKVM_ISA_FEATURES_ARGS="" if [ "x$INSTRUCTION_SET_FEATURES" != "x" ] ; then DALVIKVM_ISA_FEATURES_ARGS="-Xcompiler-option --instruction-set-features=${INSTRUCTION_SET_FEATURES}" @@ -478,6 +487,7 @@ if [ "$HOST" = "n" ]; then export LD_LIBRARY_PATH=$LD_LIBRARY_PATH && \ export PATH=$ANDROID_ROOT/bin:$PATH && \ $dex2oat_cmdline && \ + $strip_cmdline && \ $dalvikvm_cmdline" cmdfile=$(tempfile -p "cmd-" -s "-$TEST_NAME") @@ -548,13 +558,7 @@ else fi if [ "$DEV_MODE" = "y" ]; then - if [ "$PREBUILD" = "y" ]; then - echo "$mkdir_cmdline && $dex2oat_cmdline && $cmdline" - elif [ "$RELOCATE" = "y" ]; then - echo "$mkdir_cmdline && $cmdline" - else - echo $cmdline - fi + echo "$mkdir_cmdline && $dex2oat_cmdline && $strip_cmdline && $cmdline" fi cd $ANDROID_BUILD_TOP @@ -562,6 +566,7 @@ else rm -rf ${DEX_LOCATION}/dalvik-cache/ $mkdir_cmdline || exit 1 $dex2oat_cmdline || { echo "Dex2oat failed." >&2 ; exit 2; } + $strip_cmdline || { echo "Strip failed." >&2 ; exit 3; } # For running, we must turn off logging when dex2oat or patchoat are missing. Otherwise we use # the same defaults as for prebuilt: everything when --dev, otherwise errors and above only. diff --git a/test/run-test b/test/run-test index 013fc63e83..fc57d0914f 100755 --- a/test/run-test +++ b/test/run-test @@ -190,6 +190,9 @@ while true; do run_args="${run_args} --prebuild" prebuild_mode="yes" shift; + elif [ "x$1" = "x--strip-dex" ]; then + run_args="${run_args} --strip-dex" + shift; elif [ "x$1" = "x--debuggable" ]; then run_args="${run_args} -Xcompiler-option --debuggable" debuggable="yes" @@ -449,7 +452,7 @@ if [ "$runtime" = "dalvik" ]; then if [ "$target_mode" = "no" ]; then framework="${ANDROID_PRODUCT_OUT}/system/framework" bpath="${framework}/core-libart.jar:${framework}/core-oj.jar:${framework}/conscrypt.jar:${framework}/okhttp.jar:${framework}/bouncycastle.jar:${framework}/ext.jar" - run_args="${run_args} --boot -Xbootclasspath:${bpath}" + run_args="${run_args} --boot --runtime-option -Xbootclasspath:${bpath}" else true # defaults to using target BOOTCLASSPATH fi @@ -571,6 +574,7 @@ if [ "$usage" = "yes" ]; then echo " --prebuild Run dex2oat on the files before starting test. (default)" echo " --no-prebuild Do not run dex2oat on the files before starting" echo " the test." + echo " --strip-dex Strip the dex files before starting test." echo " --relocate Force the use of relocating in the test, making" echo " the image and oat files be relocated to a random" echo " address before running. (default)" |