diff options
| -rw-r--r-- | Android.mk | 54 | ||||
| -rw-r--r-- | build/Android.oattest.mk | 8 | ||||
| -rw-r--r-- | oat_process/app_main.cpp | 39 | ||||
| -rw-r--r-- | src/java_lang_Class.cc | 9 | ||||
| -rw-r--r-- | src/thread.cc | 9 |
5 files changed, 98 insertions, 21 deletions
diff --git a/Android.mk b/Android.mk index 49e070638c..58014471c0 100644 --- a/Android.mk +++ b/Android.mk @@ -59,6 +59,11 @@ endef ART_HOST_TEST_DEPENDENCIES := $(ART_HOST_TEST_EXECUTABLES) $(ANDROID_HOST_OUT)/framework/core-hostdex.jar $(ART_TEST_OAT_FILES) ART_TARGET_TEST_DEPENDENCIES := $(ART_TARGET_TEST_EXECUTABLES) $(ANDROID_PRODUCT_OUT)/system/framework/core.jar $(ART_TEST_OAT_FILES) +ART_TARGET_TEST_DEPENDENCIES += $(TARGET_OUT_EXECUTABLES)/oat_process $(TARGET_OUT_EXECUTABLES)/oat_processd + +######################################################################## +# host test targets + # "mm test-art-host" to build and run all host tests .PHONY: test-art-host test-art-host: $(ART_HOST_TEST_DEPENDENCIES) @@ -74,7 +79,10 @@ valgrind-art-host: $(ART_HOST_TEST_DEPENDENCIES) tsan-art-host: $(ART_HOST_TEST_DEPENDENCIES) $(call run-host-tests-with,"tsan") -# "mm test-art-device" to build and run all target tests +######################################################################## +# target test targets + +# "mm test-art-target" to build and run all target tests .PHONY: test-art-target test-art-target: test-art-target-gtest test-art-target-oat @@ -94,20 +102,47 @@ test-art-target-gtest: test-art-target-sync .PHONY: test-art-target-oat test-art-target-oat: $(ART_TEST_OAT_TARGETS) +######################################################################## +# oat_process test targets + # $(1): name define build-art-framework-oat $(call build-art-oat,$(1),$(TARGET_BOOT_OAT),$(TARGET_BOOT_DEX)) endef -$(eval $(call build-art-framework-oat,am)) - .PHONY: test-art-target-oat-process -test-art-target-oat-process: $(TARGET_OUT_JAVA_LIBRARIES)/am.oat +test-art-target-oat-process: test-art-target-oat-process-am # test-art-target-oat-process-Calculator + +$(eval $(call build-art-framework-oat,$(TARGET_OUT_JAVA_LIBRARIES)/am.jar)) + +.PHONY: test-art-target-oat-process-am +test-art-target-oat-process-am: $(TARGET_OUT_JAVA_LIBRARIES)/am.oat test-art-target-sync + adb remount + adb sync + adb shell sh -c "export CLASSPATH=/system/framework/am.jar && oat_processd /system/bin/app_process -Xbootimage:/system/framework/boot.oat -Ximage:/system/framework/am.oat /system/bin com.android.commands.am.Am start http://android.com && touch /sdcard/test-art-target-process-am" + $(hide) (adb pull /sdcard/test-art-target-process-am /tmp/ && echo test-art-target-process-am PASSED) || echo test-art-target-process-am FAILED + $(hide) rm /tmp/test-art-target-process-am + +$(eval $(call build-art-framework-oat,$(TARGET_OUT_APPS)/Calculator.apk)) + +.PHONY: test-art-target-oat-process-Calculator +# Note that using this instead of "adb shell am start" make sure that the /data/art-cache is up-to-date +test-art-target-oat-process-Calculator: $(TARGET_OUT_APPS)/Calculator.oat test-art-target-sync + mkdir -p $(TARGET_OUT_DATA)/art-cache + unzip $(TARGET_OUT_APPS)/Calculator.apk classes.dex -d $(TARGET_OUT_DATA)/art-cache + mv $(TARGET_OUT_DATA)/art-cache/classes.dex $(TARGET_OUT_DATA)/art-cache/system@app@Calculator.apk@classes.dex.c96b4ebb # crc32 from "unzip -lv $(TARGET_OUT_APPS)/Calculator.apk" adb remount adb sync - adb shell sh -c "export CLASSPATH=/system/framework/am.jar && oat_process -Xbootimage:/system/framework/boot.oat -Ximage:/system/framework/am.oat /system/bin com.android.commands.am.Am && touch /sdcard/test-art-target-process" - $(hide) (adb pull /sdcard/test-art-target-process /tmp/ && echo test-art-target-process PASSED) || echo test-art-target-process FAILED - $(hide) rm /tmp/test-art-target-process + adb shell setprop wrap.com.android.calculator2 "oat_processd" + adb shell stop + adb shell start + sleep 15 # sleep 30 + adb shell sh -c "export CLASSPATH=/system/framework/am.jar && oat_processd /system/bin/app_process -Xbootimage:/system/framework/boot.oat -Ximage:/system/framework/am.oat /system/bin com.android.commands.am.Am start -a android.intent.action.MAIN -n com.android.calculator2/.Calculator && touch /sdcard/test-art-target-process-Calculator" + $(hide) (adb pull /sdcard/test-art-target-process-Calculator /tmp/ && echo test-art-target-process-Calculator PASSED) || echo test-art-target-process-Calculator FAILED + $(hide) rm /tmp/test-art-target-process-Calculator + +######################################################################## +# oatdump targets .PHONY: dump-core-oat dump-core-oat: $(TARGET_CORE_OAT) $(OATDUMP) @@ -119,9 +154,14 @@ dump-boot-oat: $(TARGET_BOOT_OAT) $(OATDUMP) $(OATDUMP) $(addprefix --dex-file=,$(TARGET_BOOT_DEX)) --image=$(TARGET_BOOT_OAT) --strip-prefix=$(PRODUCT_OUT) --output=/tmp/boot.oatdump.txt @echo Output in /tmp/boot.oatdump.txt +######################################################################## +# cpplint target + # "mm cpplint-art" to style check art source files .PHONY: cpplint-art cpplint-art: $(LOCAL_PATH)/tools/cpplint.py $(LOCAL_PATH)/src/*.h $(LOCAL_PATH)/src/*.cc +######################################################################## + include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/build/Android.oattest.mk b/build/Android.oattest.mk index 4605583294..5942fcfb64 100644 --- a/build/Android.oattest.mk +++ b/build/Android.oattest.mk @@ -33,12 +33,12 @@ $(foreach dir,$(TEST_DEX_DIRECTORIES), $(eval $(call build-art-test-dex,$(dir))) ######################################################################## -# $(1): module +# $(1): input jar or apk filename # $(2): boot oat # $(3): boot dex files define build-art-oat -# TODO: change DEX2OATD to order-only prerequisite when output is stable -$(TARGET_OUT_JAVA_LIBRARIES)/$(1).oat: $(TARGET_OUT_JAVA_LIBRARIES)/$(1).jar $(2) $(DEX2OAT) +# TODO: change DEX2OATD (and perhaps $(2) boot oat) to order-only prerequisite when output is stable +$(patsubst %.apk,%.oat,$(patsubst %.jar,%.oat,$(1))): $(1) $(2) $(DEX2OAT) @echo "target dex2oat: $$@ ($$<)" $(hide) $(DEX2OAT) -Xms16m -Xmx16m $(addprefix --boot-dex-file=,$(3)) --boot=$(2) $(addprefix --dex-file=,$$<) --image=$$@ --strip-prefix=$(PRODUCT_OUT) endef @@ -48,7 +48,7 @@ ART_TEST_OAT_FILES := # $(1): directory define build-art-test-oat - $(call build-art-oat,art-test-dex-$(1),$(TARGET_CORE_OAT),$(TARGET_CORE_DEX)) + $(call build-art-oat,$(TARGET_OUT_JAVA_LIBRARIES)/art-test-dex-$(1).jar,$(TARGET_CORE_OAT),$(TARGET_CORE_DEX)) ART_TEST_OAT_FILES += $(TARGET_OUT_JAVA_LIBRARIES)/art-test-dex-$(1).oat endef $(foreach dir,$(TEST_DEX_DIRECTORIES), $(eval $(call build-art-test-oat,$(dir)))) diff --git a/oat_process/app_main.cpp b/oat_process/app_main.cpp index bf827a8a42..92ede6d59a 100644 --- a/oat_process/app_main.cpp +++ b/oat_process/app_main.cpp @@ -148,6 +148,45 @@ int main(int argc, const char* const argv[]) argc--; argv++; + // ignore /system/bin/app_process when invoked via WrapperInit + if (strcmp(argv[0], "/system/bin/app_process") == 0) { + LOGI("Removing /system/bin/app_process argument"); + argc--; + argv++; + for (int i = 0; i < argc; i++) { + LOGI("argv[%d]=%s", i, argv[i]); + } + } + + // TODO: remove Calculator special case + int oatArgc = argc + 2; + const char* oatArgv[oatArgc]; + if (strcmp(argv[0], "-Xbootimage:/system/framework/boot.oat") != 0) { + LOGI("Adding oat arguments"); + oatArgv[0] = "-Xbootimage:/system/framework/boot.oat"; + oatArgv[1] = "-Ximage:/system/app/Calculator.oat"; + setenv("CLASSPATH", "/system/app/Calculator.apk", 1); + memcpy(oatArgv + (oatArgc - argc), argv, argc * sizeof(*argv)); + argv = oatArgv; + argc = oatArgc; + for (int i = 0; i < argc; i++) { + LOGI("argv[%d]=%s", i, argv[i]); + } + } + + // TODO: remove the heap arguments when implicit garbage collection enabled + LOGI("Adding heap arguments"); + int heapArgc = argc + 2; + const char* heapArgv[heapArgc]; + heapArgv[0] = "-Xms64m"; + heapArgv[1] = "-Xmx64m"; + memcpy(heapArgv + (heapArgc - argc), argv, argc * sizeof(*argv)); + argv = heapArgv; + argc = heapArgc; + for (int i = 0; i < argc; i++) { + LOGI("argv[%d]=%s", i, argv[i]); + } + // Everything up to '--' or first non '-' arg goes to the vm int i = runtime.addVmArguments(argc, argv); diff --git a/src/java_lang_Class.cc b/src/java_lang_Class.cc index ec0b0edf15..c334f046e5 100644 --- a/src/java_lang_Class.cc +++ b/src/java_lang_Class.cc @@ -227,13 +227,6 @@ jboolean Class_isPrimitive(JNIEnv* env, jobject javaThis) { return c->IsPrimitive(); } -bool CheckClassAccess(const Class* access_from, const Class* klass) { - if (klass->IsPublic()) { - return true; - } - return access_from->IsInSamePackage(klass); -} - // Validate method/field access. bool CheckMemberAccess(const Class* access_from, const Class* access_to, uint32_t member_flags) { // quick accept for public access */ @@ -293,7 +286,7 @@ jobject Class_newInstanceImpl(JNIEnv* env, jobject javaThis) { Method* caller_caller = frame.GetMethod(); Class* caller_class = caller_caller->GetDeclaringClass(); - if (!CheckClassAccess(c, caller_class)) { + if (!caller_class->CanAccess(c)) { Thread::Current()->ThrowNewException("Ljava/lang/IllegalAccessException;", "Class %s is not accessible from class %s", PrettyDescriptor(c->GetDescriptor()).c_str(), diff --git a/src/thread.cc b/src/thread.cc index 22495be9c2..800507201b 100644 --- a/src/thread.cc +++ b/src/thread.cc @@ -301,7 +301,7 @@ void LockObjectFromCode(Thread* thread, Object* obj) { obj->MonitorEnter(thread); DCHECK(thread->HoldsLock(obj)); // Only possible exception is NPE and is handled before entry - DCHECK(thread->GetException() == NULL); + DCHECK(!thread->IsExceptionPending()); } extern "C" void artCheckSuspendFromCode(Thread* thread) { @@ -358,10 +358,14 @@ extern "C" uint64_t artFindInterfaceMethodInCacheFromCode(uint32_t method_idx, Method* interface_method = class_linker->ResolveMethod(method_idx, caller_method, false); if (interface_method == NULL) { // Could not resolve interface method. Throw error and unwind - CHECK(thread->GetException() != NULL); + CHECK(thread->IsExceptionPending()); return 0; } Method* method = this_object->GetClass()->FindVirtualMethodForInterface(interface_method); + if (method == NULL) { + CHECK(thread->IsExceptionPending()); + return 0; + } const void* code = method->GetCode(); uint32_t method_uint = reinterpret_cast<uint32_t>(method); @@ -1372,6 +1376,7 @@ void Thread::ThrowNewExceptionV(const char* exception_class_descriptor, const ch CHECK(exception_class != NULL) << "descriptor=\"" << descriptor << "\""; int rc = env->ThrowNew(exception_class, msg.c_str()); CHECK_EQ(rc, JNI_OK); + env->DeleteLocalRef(exception_class); } void Thread::ThrowOutOfMemoryError() { |