1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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 art.Redefinition; 18*795d594fSAndroid Build Coastguard Worker import java.util.Base64; 19*795d594fSAndroid Build Coastguard Worker public class Main { 20*795d594fSAndroid Build Coastguard Worker static abstract class TransformAbstract { doSayHi()21*795d594fSAndroid Build Coastguard Worker public abstract void doSayHi(); 22*795d594fSAndroid Build Coastguard Worker sayHi()23*795d594fSAndroid Build Coastguard Worker public void sayHi() { 24*795d594fSAndroid Build Coastguard Worker System.out.println("hello"); 25*795d594fSAndroid Build Coastguard Worker } 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker 28*795d594fSAndroid Build Coastguard Worker static final class TransformConcrete extends TransformAbstract { doSayHi()29*795d594fSAndroid Build Coastguard Worker public final void doSayHi() { 30*795d594fSAndroid Build Coastguard Worker System.out.print("Running sayHi() - "); 31*795d594fSAndroid Build Coastguard Worker sayHi(); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker ensureJitCompiled(Class k, String m)35*795d594fSAndroid Build Coastguard Worker public static native void ensureJitCompiled(Class k, String m); 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /** 38*795d594fSAndroid Build Coastguard Worker * base64 encoded class/dex file for 39*795d594fSAndroid Build Coastguard Worker * static abstract class TransformAbstract { 40*795d594fSAndroid Build Coastguard Worker * public abstract void doSayHi(); 41*795d594fSAndroid Build Coastguard Worker * public void sayHi() { 42*795d594fSAndroid Build Coastguard Worker * System.out.println("Goodbye"); 43*795d594fSAndroid Build Coastguard Worker * } 44*795d594fSAndroid Build Coastguard Worker * } 45*795d594fSAndroid Build Coastguard Worker */ 46*795d594fSAndroid Build Coastguard Worker private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( 47*795d594fSAndroid Build Coastguard Worker "yv66vgAAADQAIQoABgAPCQAQABEIABIKABMAFAcAFgcAGQEABjxpbml0PgEAAygpVgEABENvZGUB" + 48*795d594fSAndroid Build Coastguard Worker "AA9MaW5lTnVtYmVyVGFibGUBAAdkb1NheUhpAQAFc2F5SGkBAApTb3VyY2VGaWxlAQAJTWFpbi5q" + 49*795d594fSAndroid Build Coastguard Worker "YXZhDAAHAAgHABoMABsAHAEAB0dvb2RieWUHAB0MAB4AHwcAIAEAFk1haW4kVHJhbnNmb3JtQWJz" + 50*795d594fSAndroid Build Coastguard Worker "dHJhY3QBABFUcmFuc2Zvcm1BYnN0cmFjdAEADElubmVyQ2xhc3NlcwEAEGphdmEvbGFuZy9PYmpl" + 51*795d594fSAndroid Build Coastguard Worker "Y3QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2" + 52*795d594fSAndroid Build Coastguard Worker "YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAARNYWlu" + 53*795d594fSAndroid Build Coastguard Worker "BCAABQAGAAAAAAADAAAABwAIAAEACQAAAB0AAQABAAAABSq3AAGxAAAAAQAKAAAABgABAAAAHAQB" + 54*795d594fSAndroid Build Coastguard Worker "AAsACAAAAAEADAAIAAEACQAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEACgAAAAoAAgAAAB8ACAAg" + 55*795d594fSAndroid Build Coastguard Worker "AAIADQAAAAIADgAYAAAACgABAAUAFQAXBAg="); 56*795d594fSAndroid Build Coastguard Worker private static final byte[] DEX_BYTES = Base64.getDecoder().decode( 57*795d594fSAndroid Build Coastguard Worker "ZGV4CjAzNQCQkoTiKzIz0l96rtsnUxdY4Kwx+YINWFHEAwAAcAAAAHhWNBIAAAAAAAAAAAADAAAV" + 58*795d594fSAndroid Build Coastguard Worker "AAAAcAAAAAkAAADEAAAAAgAAAOgAAAABAAAAAAEAAAUAAAAIAQAAAQAAADABAAB0AgAAUAEAAKoB" + 59*795d594fSAndroid Build Coastguard Worker "AACyAQAAuwEAANUBAADdAQAAAQIAACECAAA4AgAATAIAAGACAAB0AgAAfwIAAJICAACVAgAAmQIA" + 60*795d594fSAndroid Build Coastguard Worker "AKYCAACvAgAAtQIAALoCAADDAgAAygIAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAA" + 61*795d594fSAndroid Build Coastguard Worker "DAAAAAwAAAAIAAAAAAAAAA0AAAAIAAAApAEAAAcABAARAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAT" + 62*795d594fSAndroid Build Coastguard Worker "AAAABAABABIAAAAFAAAAAAAAAAAAAAAABAAABQAAAAAAAAAKAAAAlAEAAOwCAAAAAAAAAgAAANwC" + 63*795d594fSAndroid Build Coastguard Worker "AADiAgAAAQABAAEAAADRAgAABAAAAHAQBAAAAA4AAwABAAIAAADWAgAACAAAAGIAAAAaAQEAbiAD" + 64*795d594fSAndroid Build Coastguard Worker "ABAADgBQAQAAAAAAAAAAAAAAAAAAAQAAAAYABjxpbml0PgAHR29vZGJ5ZQAYTE1haW4kVHJhbnNm" + 65*795d594fSAndroid Build Coastguard Worker "b3JtQWJzdHJhY3Q7AAZMTWFpbjsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsA" + 66*795d594fSAndroid Build Coastguard Worker "HkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJM" + 67*795d594fSAndroid Build Coastguard Worker "amF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07" + 68*795d594fSAndroid Build Coastguard Worker "AAlNYWluLmphdmEAEVRyYW5zZm9ybUFic3RyYWN0AAFWAAJWTAALYWNjZXNzRmxhZ3MAB2RvU2F5" + 69*795d594fSAndroid Build Coastguard Worker "SGkABG5hbWUAA291dAAHcHJpbnRsbgAFc2F5SGkABXZhbHVlABwABw4AHwAHDngAAgIBFBgBAgMC" + 70*795d594fSAndroid Build Coastguard Worker "DiQIBBAXCwAAAQIAgIAE3AIBgQgAAQH0AgAAEAAAAAAAAAABAAAAAAAAAAEAAAAVAAAAcAAAAAIA" + 71*795d594fSAndroid Build Coastguard Worker "AAAJAAAAxAAAAAMAAAACAAAA6AAAAAQAAAABAAAAAAEAAAUAAAAFAAAACAEAAAYAAAABAAAAMAEA" + 72*795d594fSAndroid Build Coastguard Worker "AAMQAAABAAAAUAEAAAEgAAACAAAAXAEAAAYgAAABAAAAlAEAAAEQAAABAAAApAEAAAIgAAAVAAAA" + 73*795d594fSAndroid Build Coastguard Worker "qgEAAAMgAAACAAAA0QIAAAQgAAACAAAA3AIAAAAgAAABAAAA7AIAAAAQAAABAAAAAAMAAA=="); 74*795d594fSAndroid Build Coastguard Worker main(String[] args)75*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 76*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 77*795d594fSAndroid Build Coastguard Worker Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE); 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker ensureJitCompiled(TransformAbstract.class, "sayHi"); 80*795d594fSAndroid Build Coastguard Worker ensureJitCompiled(TransformConcrete.class, "doSayHi"); 81*795d594fSAndroid Build Coastguard Worker 82*795d594fSAndroid Build Coastguard Worker TransformAbstract t1 = new TransformConcrete(); 83*795d594fSAndroid Build Coastguard Worker t1.doSayHi(); 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker assertSingleImplementation(TransformAbstract.class, "doSayHi", true); 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker System.out.println("redefining TransformAbstract"); 88*795d594fSAndroid Build Coastguard Worker Redefinition.doCommonClassRedefinition(TransformAbstract.class, CLASS_BYTES, DEX_BYTES); 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker t1.doSayHi(); 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker hasSingleImplementation(Class<?> clazz, String method_name)93*795d594fSAndroid Build Coastguard Worker private static native boolean hasSingleImplementation(Class<?> clazz, String method_name); assertSingleImplementation(Class<?> clazz, String method_name, boolean b)94*795d594fSAndroid Build Coastguard Worker private static void assertSingleImplementation(Class<?> clazz, String method_name, boolean b) { 95*795d594fSAndroid Build Coastguard Worker if (hasSingleImplementation(clazz, method_name) != b) { 96*795d594fSAndroid Build Coastguard Worker System.out.println(clazz + "." + method_name + 97*795d594fSAndroid Build Coastguard Worker " doesn't have single implementation value of " + b); 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker } 101