1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker import dalvik.system.DexFile; 18*795d594fSAndroid Build Coastguard Worker import dalvik.system.VMRuntime; 19*795d594fSAndroid Build Coastguard Worker import java.io.File; 20*795d594fSAndroid Build Coastguard Worker import java.io.IOException; 21*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Array; 22*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.InvocationHandler; 23*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method; 24*795d594fSAndroid Build Coastguard Worker import java.math.BigInteger; 25*795d594fSAndroid Build Coastguard Worker import java.util.concurrent.CyclicBarrier; 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker // This class helps testing that we don't mark `InheritsBigInteger` as initialized, 28*795d594fSAndroid Build Coastguard Worker // given we do not expect `BigInteger` to be initialized in the boot image. 29*795d594fSAndroid Build Coastguard Worker class InheritsBigInteger extends BigInteger { InheritsBigInteger(String value)30*795d594fSAndroid Build Coastguard Worker InheritsBigInteger(String value) { 31*795d594fSAndroid Build Coastguard Worker super(value); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker class SuperClass {} 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker class ClassWithStatics extends SuperClass { 38*795d594fSAndroid Build Coastguard Worker public static final String STATIC_STRING = "foo"; 39*795d594fSAndroid Build Coastguard Worker public static final int STATIC_INT = 42; 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker class ClassWithStaticType { 43*795d594fSAndroid Build Coastguard Worker public static final Class<?> STATIC_TYPE = Object.class; 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker // Add an interface for testing generating classes and interfaces. 47*795d594fSAndroid Build Coastguard Worker interface Itf { someMethod()48*795d594fSAndroid Build Coastguard Worker public int someMethod(); someDefaultMethod()49*795d594fSAndroid Build Coastguard Worker public default int someDefaultMethod() { return 42; } 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker // Add a second interface with many methods to force a conflict in the IMT. We want a second 53*795d594fSAndroid Build Coastguard Worker // interface to make sure `Itf` gets entries with the imt_unimplemented_method runtime method. 54*795d594fSAndroid Build Coastguard Worker interface Itf2 { defaultMethod1()55*795d594fSAndroid Build Coastguard Worker default int defaultMethod1() { return 1; } defaultMethod2()56*795d594fSAndroid Build Coastguard Worker default int defaultMethod2() { return 2; } defaultMethod3()57*795d594fSAndroid Build Coastguard Worker default int defaultMethod3() { return 3; } defaultMethod4()58*795d594fSAndroid Build Coastguard Worker default int defaultMethod4() { return 4; } defaultMethod5()59*795d594fSAndroid Build Coastguard Worker default int defaultMethod5() { return 5; } defaultMethod6()60*795d594fSAndroid Build Coastguard Worker default int defaultMethod6() { return 6; } defaultMethod7()61*795d594fSAndroid Build Coastguard Worker default int defaultMethod7() { return 7; } defaultMethod8()62*795d594fSAndroid Build Coastguard Worker default int defaultMethod8() { return 8; } defaultMethod9()63*795d594fSAndroid Build Coastguard Worker default int defaultMethod9() { return 9; } defaultMethod10()64*795d594fSAndroid Build Coastguard Worker default int defaultMethod10() { return 10; } defaultMethod11()65*795d594fSAndroid Build Coastguard Worker default int defaultMethod11() { return 11; } defaultMethod12()66*795d594fSAndroid Build Coastguard Worker default int defaultMethod12() { return 12; } defaultMethod13()67*795d594fSAndroid Build Coastguard Worker default int defaultMethod13() { return 13; } defaultMethod14()68*795d594fSAndroid Build Coastguard Worker default int defaultMethod14() { return 14; } defaultMethod15()69*795d594fSAndroid Build Coastguard Worker default int defaultMethod15() { return 15; } defaultMethod16()70*795d594fSAndroid Build Coastguard Worker default int defaultMethod16() { return 16; } defaultMethod17()71*795d594fSAndroid Build Coastguard Worker default int defaultMethod17() { return 17; } defaultMethod18()72*795d594fSAndroid Build Coastguard Worker default int defaultMethod18() { return 18; } defaultMethod19()73*795d594fSAndroid Build Coastguard Worker default int defaultMethod19() { return 19; } defaultMethod20()74*795d594fSAndroid Build Coastguard Worker default int defaultMethod20() { return 20; } defaultMethod21()75*795d594fSAndroid Build Coastguard Worker default int defaultMethod21() { return 21; } defaultMethod22()76*795d594fSAndroid Build Coastguard Worker default int defaultMethod22() { return 22; } defaultMethod23()77*795d594fSAndroid Build Coastguard Worker default int defaultMethod23() { return 23; } defaultMethod24()78*795d594fSAndroid Build Coastguard Worker default int defaultMethod24() { return 24; } defaultMethod25()79*795d594fSAndroid Build Coastguard Worker default int defaultMethod25() { return 25; } defaultMethod26()80*795d594fSAndroid Build Coastguard Worker default int defaultMethod26() { return 26; } defaultMethod27()81*795d594fSAndroid Build Coastguard Worker default int defaultMethod27() { return 27; } defaultMethod28()82*795d594fSAndroid Build Coastguard Worker default int defaultMethod28() { return 28; } defaultMethod29()83*795d594fSAndroid Build Coastguard Worker default int defaultMethod29() { return 29; } defaultMethod30()84*795d594fSAndroid Build Coastguard Worker default int defaultMethod30() { return 30; } defaultMethod31()85*795d594fSAndroid Build Coastguard Worker default int defaultMethod31() { return 31; } defaultMethod32()86*795d594fSAndroid Build Coastguard Worker default int defaultMethod32() { return 32; } defaultMethod33()87*795d594fSAndroid Build Coastguard Worker default int defaultMethod33() { return 33; } defaultMethod34()88*795d594fSAndroid Build Coastguard Worker default int defaultMethod34() { return 34; } defaultMethod35()89*795d594fSAndroid Build Coastguard Worker default int defaultMethod35() { return 35; } defaultMethod36()90*795d594fSAndroid Build Coastguard Worker default int defaultMethod36() { return 36; } defaultMethod37()91*795d594fSAndroid Build Coastguard Worker default int defaultMethod37() { return 37; } defaultMethod38()92*795d594fSAndroid Build Coastguard Worker default int defaultMethod38() { return 38; } defaultMethod39()93*795d594fSAndroid Build Coastguard Worker default int defaultMethod39() { return 39; } defaultMethod40()94*795d594fSAndroid Build Coastguard Worker default int defaultMethod40() { return 40; } defaultMethod41()95*795d594fSAndroid Build Coastguard Worker default int defaultMethod41() { return 41; } defaultMethod42()96*795d594fSAndroid Build Coastguard Worker default int defaultMethod42() { return 42; } defaultMethod43()97*795d594fSAndroid Build Coastguard Worker default int defaultMethod43() { return 43; } defaultMethod44()98*795d594fSAndroid Build Coastguard Worker default int defaultMethod44() { return 44; } defaultMethod45()99*795d594fSAndroid Build Coastguard Worker default int defaultMethod45() { return 45; } defaultMethod46()100*795d594fSAndroid Build Coastguard Worker default int defaultMethod46() { return 46; } defaultMethod47()101*795d594fSAndroid Build Coastguard Worker default int defaultMethod47() { return 47; } defaultMethod48()102*795d594fSAndroid Build Coastguard Worker default int defaultMethod48() { return 48; } defaultMethod49()103*795d594fSAndroid Build Coastguard Worker default int defaultMethod49() { return 49; } defaultMethod50()104*795d594fSAndroid Build Coastguard Worker default int defaultMethod50() { return 50; } defaultMethod51()105*795d594fSAndroid Build Coastguard Worker default int defaultMethod51() { return 51; } 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker class Itf2Impl implements Itf2 { 109*795d594fSAndroid Build Coastguard Worker } 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker class ClassWithDefaultConflict implements IfaceWithSayHi, IfaceWithSayHiAtRuntime { 112*795d594fSAndroid Build Coastguard Worker } 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker public class Main implements Itf { 115*795d594fSAndroid Build Coastguard Worker static String myString = "MyString"; 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker static class MyThread extends Thread { 118*795d594fSAndroid Build Coastguard Worker CyclicBarrier barrier; 119*795d594fSAndroid Build Coastguard Worker MyThread(CyclicBarrier barrier)120*795d594fSAndroid Build Coastguard Worker public MyThread(CyclicBarrier barrier) { 121*795d594fSAndroid Build Coastguard Worker this.barrier = barrier; 122*795d594fSAndroid Build Coastguard Worker } run()123*795d594fSAndroid Build Coastguard Worker public void run() { 124*795d594fSAndroid Build Coastguard Worker try { 125*795d594fSAndroid Build Coastguard Worker synchronized (Main.myString) { 126*795d594fSAndroid Build Coastguard Worker barrier.await(); 127*795d594fSAndroid Build Coastguard Worker barrier.reset(); 128*795d594fSAndroid Build Coastguard Worker // Infinite wait. 129*795d594fSAndroid Build Coastguard Worker barrier.await(); 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 132*795d594fSAndroid Build Coastguard Worker throw new Error(e); 133*795d594fSAndroid Build Coastguard Worker } 134*795d594fSAndroid Build Coastguard Worker } 135*795d594fSAndroid Build Coastguard Worker } 136*795d594fSAndroid Build Coastguard Worker main(String[] args)137*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 138*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker // Register the dex file so that the runtime can pick up which 141*795d594fSAndroid Build Coastguard Worker // dex file to compile for the image. 142*795d594fSAndroid Build Coastguard Worker File file = null; 143*795d594fSAndroid Build Coastguard Worker try { 144*795d594fSAndroid Build Coastguard Worker file = createTempFile(); 145*795d594fSAndroid Build Coastguard Worker String codePath = DEX_LOCATION + "/845-data-image.jar"; 146*795d594fSAndroid Build Coastguard Worker VMRuntime.registerAppInfo( 147*795d594fSAndroid Build Coastguard Worker "test.app", 148*795d594fSAndroid Build Coastguard Worker file.getPath(), 149*795d594fSAndroid Build Coastguard Worker file.getPath(), 150*795d594fSAndroid Build Coastguard Worker new String[] {codePath}, 151*795d594fSAndroid Build Coastguard Worker VMRuntime.CODE_PATH_TYPE_PRIMARY_APK); 152*795d594fSAndroid Build Coastguard Worker } finally { 153*795d594fSAndroid Build Coastguard Worker if (file != null) { 154*795d594fSAndroid Build Coastguard Worker file.delete(); 155*795d594fSAndroid Build Coastguard Worker } 156*795d594fSAndroid Build Coastguard Worker } 157*795d594fSAndroid Build Coastguard Worker 158*795d594fSAndroid Build Coastguard Worker if (!hasOatFile() || !hasImage()) { 159*795d594fSAndroid Build Coastguard Worker // We only generate an app image if there is at least a vdex file and a boot image. 160*795d594fSAndroid Build Coastguard Worker return; 161*795d594fSAndroid Build Coastguard Worker } 162*795d594fSAndroid Build Coastguard Worker 163*795d594fSAndroid Build Coastguard Worker if (args.length == 2 && "--second-run".equals(args[1])) { 164*795d594fSAndroid Build Coastguard Worker DexFile.OptimizationInfo info = VMRuntime.getBaseApkOptimizationInfo(); 165*795d594fSAndroid Build Coastguard Worker if (!info.isOptimized() && !isInImageSpace(Main.class)) { 166*795d594fSAndroid Build Coastguard Worker throw new Error("Expected image to be loaded"); 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker runClassTests(); 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker // Test that we emit an empty lock word. If we are not, then this synchronized call here would 173*795d594fSAndroid Build Coastguard Worker // block on a run with the runtime image. 174*795d594fSAndroid Build Coastguard Worker synchronized (myString) { 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker // Create a thread that makes sure `myString` is locked while the main thread is generating 178*795d594fSAndroid Build Coastguard Worker // the runtime image. 179*795d594fSAndroid Build Coastguard Worker CyclicBarrier barrier = new CyclicBarrier(2); 180*795d594fSAndroid Build Coastguard Worker Thread t = new MyThread(barrier); 181*795d594fSAndroid Build Coastguard Worker t.setDaemon(true); 182*795d594fSAndroid Build Coastguard Worker t.start(); 183*795d594fSAndroid Build Coastguard Worker barrier.await(); 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker VMRuntime runtime = VMRuntime.getRuntime(); 186*795d594fSAndroid Build Coastguard Worker runtime.notifyStartupCompleted(); 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker String filter = getCompilerFilter(Main.class); 189*795d594fSAndroid Build Coastguard Worker if ("speed-profile".equals(filter) || "speed".equals(filter)) { 190*795d594fSAndroid Build Coastguard Worker // We only generate an app image for filters that don't compile. 191*795d594fSAndroid Build Coastguard Worker return; 192*795d594fSAndroid Build Coastguard Worker } 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker String instructionSet = VMRuntime.getCurrentInstructionSet(); 195*795d594fSAndroid Build Coastguard Worker // Wait for the file to be generated. 196*795d594fSAndroid Build Coastguard Worker File image = new File(DEX_LOCATION + "/" + instructionSet + "/845-data-image.art"); 197*795d594fSAndroid Build Coastguard Worker while (!image.exists()) { 198*795d594fSAndroid Build Coastguard Worker Thread.yield(); 199*795d594fSAndroid Build Coastguard Worker } 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker static class MyProxy implements InvocationHandler { 203*795d594fSAndroid Build Coastguard Worker 204*795d594fSAndroid Build Coastguard Worker private Object obj; 205*795d594fSAndroid Build Coastguard Worker newInstance(Object obj)206*795d594fSAndroid Build Coastguard Worker public static Object newInstance(Object obj) { 207*795d594fSAndroid Build Coastguard Worker return java.lang.reflect.Proxy.newProxyInstance( 208*795d594fSAndroid Build Coastguard Worker obj.getClass().getClassLoader(), 209*795d594fSAndroid Build Coastguard Worker obj.getClass().getInterfaces(), 210*795d594fSAndroid Build Coastguard Worker new MyProxy(obj)); 211*795d594fSAndroid Build Coastguard Worker } 212*795d594fSAndroid Build Coastguard Worker MyProxy(Object obj)213*795d594fSAndroid Build Coastguard Worker private MyProxy(Object obj) { 214*795d594fSAndroid Build Coastguard Worker this.obj = obj; 215*795d594fSAndroid Build Coastguard Worker } 216*795d594fSAndroid Build Coastguard Worker invoke(Object proxy, Method m, Object[] args)217*795d594fSAndroid Build Coastguard Worker public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { 218*795d594fSAndroid Build Coastguard Worker return m.invoke(obj, args); 219*795d594fSAndroid Build Coastguard Worker } 220*795d594fSAndroid Build Coastguard Worker } 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker public static Itf itf = new Main(); 223*795d594fSAndroid Build Coastguard Worker public static Itf2 itf2 = new Itf2Impl(); 224*795d594fSAndroid Build Coastguard Worker public static ClassWithStatics statics = new ClassWithStatics(); 225*795d594fSAndroid Build Coastguard Worker public static ClassWithStaticType staticType = new ClassWithStaticType(); 226*795d594fSAndroid Build Coastguard Worker public static ClassWithDefaultConflict defaultConflict = new ClassWithDefaultConflict(); 227*795d594fSAndroid Build Coastguard Worker runClassTests()228*795d594fSAndroid Build Coastguard Worker public static void runClassTests() { 229*795d594fSAndroid Build Coastguard Worker // Test Class.getName, app images expect all strings to have hash codes. 230*795d594fSAndroid Build Coastguard Worker assertEquals("Main", Main.class.getName()); 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker // Basic tests for invokes with a copied method. 233*795d594fSAndroid Build Coastguard Worker assertEquals(3, new Main().someMethod()); 234*795d594fSAndroid Build Coastguard Worker assertEquals(42, new Main().someDefaultMethod()); 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker assertEquals(3, itf.someMethod()); 237*795d594fSAndroid Build Coastguard Worker assertEquals(42, itf.someDefaultMethod()); 238*795d594fSAndroid Build Coastguard Worker 239*795d594fSAndroid Build Coastguard Worker // Test with a proxy class. 240*795d594fSAndroid Build Coastguard Worker Itf foo = (Itf) MyProxy.newInstance(new Main()); 241*795d594fSAndroid Build Coastguard Worker assertEquals(3, foo.someMethod()); 242*795d594fSAndroid Build Coastguard Worker assertEquals(42, foo.someDefaultMethod()); 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker // Test with array classes. 245*795d594fSAndroid Build Coastguard Worker assertEquals("[LMain;", Main[].class.getName()); 246*795d594fSAndroid Build Coastguard Worker assertEquals("[[LMain;", Main[][].class.getName()); 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker assertEquals("[LMain;", new Main[4].getClass().getName()); 249*795d594fSAndroid Build Coastguard Worker assertEquals("[[LMain;", new Main[1][2].getClass().getName()); 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker Main array[] = new Main[] { new Main() }; 252*795d594fSAndroid Build Coastguard Worker assertEquals("[LMain;", array.getClass().getName()); 253*795d594fSAndroid Build Coastguard Worker 254*795d594fSAndroid Build Coastguard Worker assertEquals(Object[][][][].class, Array.newInstance(Object.class, 0, 0, 0, 0).getClass()); 255*795d594fSAndroid Build Coastguard Worker assertEquals("int", int.class.getName()); 256*795d594fSAndroid Build Coastguard Worker assertEquals("[I", int[].class.getName()); 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker assertEquals("foo", statics.STATIC_STRING); 259*795d594fSAndroid Build Coastguard Worker assertEquals(42, statics.STATIC_INT); 260*795d594fSAndroid Build Coastguard Worker 261*795d594fSAndroid Build Coastguard Worker assertEquals(Object.class, staticType.STATIC_TYPE); 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker // Call all interface methods to trigger the creation of a imt conflict method. 264*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod1(); 265*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod2(); 266*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod3(); 267*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod4(); 268*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod5(); 269*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod6(); 270*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod7(); 271*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod8(); 272*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod9(); 273*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod10(); 274*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod11(); 275*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod12(); 276*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod13(); 277*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod14(); 278*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod15(); 279*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod16(); 280*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod17(); 281*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod18(); 282*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod19(); 283*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod20(); 284*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod21(); 285*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod22(); 286*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod23(); 287*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod24(); 288*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod25(); 289*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod26(); 290*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod27(); 291*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod28(); 292*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod29(); 293*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod30(); 294*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod31(); 295*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod32(); 296*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod33(); 297*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod34(); 298*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod35(); 299*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod36(); 300*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod37(); 301*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod38(); 302*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod39(); 303*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod40(); 304*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod41(); 305*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod42(); 306*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod43(); 307*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod44(); 308*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod45(); 309*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod46(); 310*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod47(); 311*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod48(); 312*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod49(); 313*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod50(); 314*795d594fSAndroid Build Coastguard Worker itf2.defaultMethod51(); 315*795d594fSAndroid Build Coastguard Worker 316*795d594fSAndroid Build Coastguard Worker InheritsBigInteger bigInteger = new InheritsBigInteger("42"); 317*795d594fSAndroid Build Coastguard Worker assertEquals("42", bigInteger.toString()); 318*795d594fSAndroid Build Coastguard Worker } 319*795d594fSAndroid Build Coastguard Worker assertEquals(int expected, int actual)320*795d594fSAndroid Build Coastguard Worker private static void assertEquals(int expected, int actual) { 321*795d594fSAndroid Build Coastguard Worker if (expected != actual) { 322*795d594fSAndroid Build Coastguard Worker throw new Error("Expected " + expected + ", got " + actual); 323*795d594fSAndroid Build Coastguard Worker } 324*795d594fSAndroid Build Coastguard Worker } 325*795d594fSAndroid Build Coastguard Worker assertEquals(Object expected, Object actual)326*795d594fSAndroid Build Coastguard Worker private static void assertEquals(Object expected, Object actual) { 327*795d594fSAndroid Build Coastguard Worker if (!expected.equals(actual)) { 328*795d594fSAndroid Build Coastguard Worker throw new Error("Expected \"" + expected + "\", got \"" + actual + "\""); 329*795d594fSAndroid Build Coastguard Worker } 330*795d594fSAndroid Build Coastguard Worker } 331*795d594fSAndroid Build Coastguard Worker someMethod()332*795d594fSAndroid Build Coastguard Worker public int someMethod() { 333*795d594fSAndroid Build Coastguard Worker return 3; 334*795d594fSAndroid Build Coastguard Worker } 335*795d594fSAndroid Build Coastguard Worker hasOatFile()336*795d594fSAndroid Build Coastguard Worker private static native boolean hasOatFile(); hasImage()337*795d594fSAndroid Build Coastguard Worker private static native boolean hasImage(); getCompilerFilter(Class<?> cls)338*795d594fSAndroid Build Coastguard Worker private static native String getCompilerFilter(Class<?> cls); isInImageSpace(Class<?> cls)339*795d594fSAndroid Build Coastguard Worker private static native boolean isInImageSpace(Class<?> cls); 340*795d594fSAndroid Build Coastguard Worker 341*795d594fSAndroid Build Coastguard Worker private static final String TEMP_FILE_NAME_PREFIX = "temp"; 342*795d594fSAndroid Build Coastguard Worker private static final String TEMP_FILE_NAME_SUFFIX = "-file"; 343*795d594fSAndroid Build Coastguard Worker private static final String DEX_LOCATION = System.getenv("DEX_LOCATION"); 344*795d594fSAndroid Build Coastguard Worker createTempFile()345*795d594fSAndroid Build Coastguard Worker private static File createTempFile() throws Exception { 346*795d594fSAndroid Build Coastguard Worker try { 347*795d594fSAndroid Build Coastguard Worker return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); 348*795d594fSAndroid Build Coastguard Worker } catch (IOException e) { 349*795d594fSAndroid Build Coastguard Worker System.setProperty("java.io.tmpdir", "/data/local/tmp"); 350*795d594fSAndroid Build Coastguard Worker try { 351*795d594fSAndroid Build Coastguard Worker return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); 352*795d594fSAndroid Build Coastguard Worker } catch (IOException e2) { 353*795d594fSAndroid Build Coastguard Worker System.setProperty("java.io.tmpdir", "/sdcard"); 354*795d594fSAndroid Build Coastguard Worker return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); 355*795d594fSAndroid Build Coastguard Worker } 356*795d594fSAndroid Build Coastguard Worker } 357*795d594fSAndroid Build Coastguard Worker } 358*795d594fSAndroid Build Coastguard Worker } 359