1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import java.lang.reflect.InvocationTargetException; 18 import java.lang.reflect.Method; 19 20 public class Main { main(String[] args)21 public static void main(String[] args) throws Exception { 22 System.loadLibrary(args[0]); 23 boolean hasImage = hasImage(); 24 String instructionSet = VMRuntime.getCurrentInstructionSet(); 25 boolean isBootClassPathOnDisk = VMRuntime.isBootClassPathOnDisk(instructionSet); 26 System.out.println( 27 "Has image is " + hasImage + ", is image dex2oat enabled is " 28 + isImageDex2OatEnabled() + ", is BOOTCLASSPATH on disk is " 29 + isBootClassPathOnDisk + "."); 30 31 if (hasImage && !isImageDex2OatEnabled()) { 32 throw new Error("Image with dex2oat disabled runs with an oat file"); 33 } else if (!hasImage && isImageDex2OatEnabled()) { 34 throw new Error("Image with dex2oat enabled runs without an oat file"); 35 } 36 if (hasImage && !isBootClassPathOnDisk) { 37 throw new Error("Image with dex2oat disabled runs with an image file"); 38 } else if (!hasImage && isBootClassPathOnDisk) { 39 throw new Error("Image with dex2oat enabled runs without an image file"); 40 } 41 42 testB18485243(); 43 } 44 hasImage()45 private native static boolean hasImage(); 46 isImageDex2OatEnabled()47 private native static boolean isImageDex2OatEnabled(); 48 49 private static class VMRuntime { 50 private static final Method getCurrentInstructionSetMethod; 51 private static final Method isBootClassPathOnDiskMethod; 52 static { 53 try { 54 Class<?> c = Class.forName("dalvik.system.VMRuntime"); 55 getCurrentInstructionSetMethod = c.getDeclaredMethod("getCurrentInstructionSet"); 56 isBootClassPathOnDiskMethod = c.getDeclaredMethod("isBootClassPathOnDisk", 57 String.class); 58 } catch (Exception e) { 59 throw new RuntimeException(e); 60 } 61 } 62 getCurrentInstructionSet()63 public static String getCurrentInstructionSet() throws Exception { 64 return (String) getCurrentInstructionSetMethod.invoke(null); 65 } isBootClassPathOnDisk(String instructionSet)66 public static boolean isBootClassPathOnDisk(String instructionSet) throws Exception { 67 return (boolean) isBootClassPathOnDiskMethod.invoke(null, instructionSet); 68 } 69 } 70 testB18485243()71 private static void testB18485243() throws Exception { 72 Class<?> k = Class.forName("B18485243"); 73 Object o = k.newInstance(); 74 Method m = k.getDeclaredMethod("run"); 75 try { 76 m.invoke(o); 77 } catch (InvocationTargetException e) { 78 Throwable actual = e.getTargetException(); 79 if (!(actual instanceof IncompatibleClassChangeError)) { 80 throw new AssertionError("Expected IncompatibleClassChangeError", actual); 81 } 82 } 83 System.out.println("testB18485243 PASS"); 84 } 85 } 86