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.Method; 18 19 public class Main { main(String[] args)20 public static void main(String[] args) throws Exception { 21 boolean hasImage = hasImage(); 22 String instructionSet = VMRuntime.getCurrentInstructionSet(); 23 boolean isBootClassPathOnDisk = VMRuntime.isBootClassPathOnDisk(instructionSet); 24 System.out.println( 25 "Has image is " + hasImage + ", is image dex2oat enabled is " 26 + isImageDex2OatEnabled() + ", is BOOTCLASSPATH on disk is " 27 + isBootClassPathOnDisk + "."); 28 29 if (hasImage && !isImageDex2OatEnabled()) { 30 throw new Error("Image with dex2oat disabled runs with an oat file"); 31 } else if (!hasImage && isImageDex2OatEnabled()) { 32 throw new Error("Image with dex2oat enabled runs without an oat file"); 33 } 34 if (hasImage && !isBootClassPathOnDisk) { 35 throw new Error("Image with dex2oat disabled runs with an image file"); 36 } else if (!hasImage && isBootClassPathOnDisk) { 37 throw new Error("Image with dex2oat enabled runs without an image file"); 38 } 39 } 40 41 static { 42 System.loadLibrary("arttest"); 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 } 71