1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 package art; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker import java.util.Base64; 20*795d594fSAndroid Build Coastguard Worker public class Test1996 { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker public static class SuperTransform { 23*795d594fSAndroid Build Coastguard Worker public String hiValue = "Hi"; sayHi()24*795d594fSAndroid Build Coastguard Worker public String sayHi() { 25*795d594fSAndroid Build Coastguard Worker return this.hiValue; 26*795d594fSAndroid Build Coastguard Worker } 27*795d594fSAndroid Build Coastguard Worker } 28*795d594fSAndroid Build Coastguard Worker public static final class Transform extends SuperTransform { PostTransform()29*795d594fSAndroid Build Coastguard Worker public void PostTransform() { } sayHiTwice(Runnable run)30*795d594fSAndroid Build Coastguard Worker public String sayHiTwice(Runnable run) { 31*795d594fSAndroid Build Coastguard Worker run.run(); 32*795d594fSAndroid Build Coastguard Worker return "super: " + super.sayHi() + " this: " + sayHi(); 33*795d594fSAndroid Build Coastguard Worker } 34*795d594fSAndroid Build Coastguard Worker } 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker /** 37*795d594fSAndroid Build Coastguard Worker * base64 encoded class/dex file for 38*795d594fSAndroid Build Coastguard Worker * public static final class Transform extends SuperTransform { 39*795d594fSAndroid Build Coastguard Worker * public String myGreeting; 40*795d594fSAndroid Build Coastguard Worker * public void PostTransform() { 41*795d594fSAndroid Build Coastguard Worker * myGreeting = "SALUTATIONS"; 42*795d594fSAndroid Build Coastguard Worker * } 43*795d594fSAndroid Build Coastguard Worker * public String sayHiTwice(Runnable run) { 44*795d594fSAndroid Build Coastguard Worker * run.run(); 45*795d594fSAndroid Build Coastguard Worker * return "super: " + super.sayHi() + " and then this: " + sayHi(); 46*795d594fSAndroid Build Coastguard Worker * } 47*795d594fSAndroid Build Coastguard Worker * public String sayHi() { 48*795d594fSAndroid Build Coastguard Worker * return myGreeting; 49*795d594fSAndroid Build Coastguard Worker * } 50*795d594fSAndroid Build Coastguard Worker * } 51*795d594fSAndroid Build Coastguard Worker */ 52*795d594fSAndroid Build Coastguard Worker private static final byte[] DEX_BYTES = Base64.getDecoder().decode( 53*795d594fSAndroid Build Coastguard Worker "ZGV4CjAzNQAO4Dwurw97RcUtfH7np7S5RR8gsJYOfmeABQAAcAAAAHhWNBIAAAAAAAAAALwEAAAc" + 54*795d594fSAndroid Build Coastguard Worker "AAAAcAAAAAkAAADgAAAABAAAAAQBAAABAAAANAEAAAoAAAA8AQAAAQAAAIwBAADUAwAArAEAAHYC" + 55*795d594fSAndroid Build Coastguard Worker "AACIAgAAkAIAAJMCAACXAgAAtgIAANACAADgAgAABAMAACQDAAA6AwAATgMAAGkDAAB4AwAAhQMA" + 56*795d594fSAndroid Build Coastguard Worker "AJQDAACfAwAAogMAAK8DAAC3AwAAwwMAAMkDAADOAwAA1QMAAOEDAADqAwAA9AMAAPsDAAAEAAAA" + 57*795d594fSAndroid Build Coastguard Worker "BQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAABAAAAACAAAABgAAAAAAAAADAAAABgAAAGgCAAAD" + 58*795d594fSAndroid Build Coastguard Worker "AAAABwAAAHACAAAQAAAACAAAAAAAAAABAAYAEwAAAAAAAwABAAAAAAAAABYAAAABAAMAAQAAAAEA" + 59*795d594fSAndroid Build Coastguard Worker "AwAMAAAAAQAAABYAAAABAAEAFwAAAAUAAwAVAAAABwADAAEAAAAHAAIAEgAAAAcAAAAZAAAAAQAA" + 60*795d594fSAndroid Build Coastguard Worker "ABEAAAAAAAAAAAAAAA4AAACsBAAAggQAAAAAAAACAAEAAAAAAFsCAAADAAAAVBAAABEAAAAFAAIA" + 61*795d594fSAndroid Build Coastguard Worker "AgAAAF8CAAAlAAAAchAGAAQAbxABAAMADARuEAQAAwAMACIBBwBwEAcAAQAaAhgAbiAIACEAbiAI" + 62*795d594fSAndroid Build Coastguard Worker "AEEAGgQAAG4gCABBAG4gCAABAG4QCQABAAwEEQQAAAEAAQABAAAAUgIAAAQAAABwEAAAAAAOAAIA" + 63*795d594fSAndroid Build Coastguard Worker "AQAAAAAAVgIAAAUAAAAaAA0AWxAAAA4ACgAOAA0ADksAFAAOABABAA48AAAAAAEAAAAFAAAAAQAA" + 64*795d594fSAndroid Build Coastguard Worker "AAYAECBhbmQgdGhlbiB0aGlzOiAABjxpbml0PgABTAACTEwAHUxhcnQvVGVzdDE5OTYkU3VwZXJU" + 65*795d594fSAndroid Build Coastguard Worker "cmFuc2Zvcm07ABhMYXJ0L1Rlc3QxOTk2JFRyYW5zZm9ybTsADkxhcnQvVGVzdDE5OTY7ACJMZGFs" + 66*795d594fSAndroid Build Coastguard Worker "dmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90YXRpb24vSW5uZXJD" + 67*795d594fSAndroid Build Coastguard Worker "bGFzczsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xh" + 68*795d594fSAndroid Build Coastguard Worker "bmcvU3RyaW5nQnVpbGRlcjsADVBvc3RUcmFuc2Zvcm0AC1NBTFVUQVRJT05TAA1UZXN0MTk5Ni5q" + 69*795d594fSAndroid Build Coastguard Worker "YXZhAAlUcmFuc2Zvcm0AAVYAC2FjY2Vzc0ZsYWdzAAZhcHBlbmQACm15R3JlZXRpbmcABG5hbWUA" + 70*795d594fSAndroid Build Coastguard Worker "A3J1bgAFc2F5SGkACnNheUhpVHdpY2UAB3N1cGVyOiAACHRvU3RyaW5nAAV2YWx1ZQB2fn5EOHsi" + 71*795d594fSAndroid Build Coastguard Worker "Y29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6MSwic2hhLTEiOiI2MGRhNGQ2N2Iz" + 72*795d594fSAndroid Build Coastguard Worker "ODFjNDI0Njc3NTdjNDlmYjZlNTU3NTZkODhhMmYzIiwidmVyc2lvbiI6IjEuNy4xMi1kZXYifQAC" + 73*795d594fSAndroid Build Coastguard Worker "AwEaGAICBAIRBBkUFw8AAQEDAAECgYAEoAQDAbgEAQGsAwEBxAMAAAAAAAACAAAAcwQAAHkEAACg" + 74*795d594fSAndroid Build Coastguard Worker "BAAAAAAAAAAAAAAAAAAAEAAAAAAAAAABAAAAAAAAAAEAAAAcAAAAcAAAAAIAAAAJAAAA4AAAAAMA" + 75*795d594fSAndroid Build Coastguard Worker "AAAEAAAABAEAAAQAAAABAAAANAEAAAUAAAAKAAAAPAEAAAYAAAABAAAAjAEAAAEgAAAEAAAArAEA" + 76*795d594fSAndroid Build Coastguard Worker "AAMgAAAEAAAAUgIAAAEQAAACAAAAaAIAAAIgAAAcAAAAdgIAAAQgAAACAAAAcwQAAAAgAAABAAAA" + 77*795d594fSAndroid Build Coastguard Worker "ggQAAAMQAAACAAAAnAQAAAYgAAABAAAArAQAAAAQAAABAAAAvAQAAA=="); 78*795d594fSAndroid Build Coastguard Worker run()79*795d594fSAndroid Build Coastguard Worker public static void run() { 80*795d594fSAndroid Build Coastguard Worker Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE); 81*795d594fSAndroid Build Coastguard Worker doTest(new Transform()); 82*795d594fSAndroid Build Coastguard Worker } 83*795d594fSAndroid Build Coastguard Worker doTest(final Transform t)84*795d594fSAndroid Build Coastguard Worker public static void doTest(final Transform t) { 85*795d594fSAndroid Build Coastguard Worker System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); })); 86*795d594fSAndroid Build Coastguard Worker System.out.println(t.sayHiTwice( 87*795d594fSAndroid Build Coastguard Worker () -> { 88*795d594fSAndroid Build Coastguard Worker System.out.println("Redefining calling class"); 89*795d594fSAndroid Build Coastguard Worker Redefinition.doCommonStructuralClassRedefinition(Transform.class, DEX_BYTES); 90*795d594fSAndroid Build Coastguard Worker t.PostTransform(); 91*795d594fSAndroid Build Coastguard Worker })); 92*795d594fSAndroid Build Coastguard Worker System.out.println(t.sayHiTwice(() -> { System.out.println("Not doing anything"); })); 93*795d594fSAndroid Build Coastguard Worker } 94*795d594fSAndroid Build Coastguard Worker } 95