1 /* 2 * Copyright (C) 2016 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 package art; 18 19 import java.util.Base64; 20 21 // TODO Need version where non-structural obsolete method tries to touch a structural obsolete 22 // field. 23 public class Test1978 { 24 25 // The class we will be transforming. 26 static class Transform { 27 static { 28 } 29 30 public static String sayHiName = " Alex"; 31 // Called whenever we do something. somethingHappened1()32 public static void somethingHappened1() { 33 System.out.println("Running after op1 using normal definition"); 34 } 35 somethingHappened2()36 public static void somethingHappened2() { 37 System.out.println("Running after op2 using normal definition"); 38 } 39 sayHi(Runnable r1, Runnable r2)40 public static void sayHi(Runnable r1, Runnable r2) { 41 System.out.println("hello" + sayHiName); 42 r1.run(); 43 somethingHappened1(); 44 System.out.println("how do you do" + sayHiName); 45 r2.run(); 46 somethingHappened2(); 47 System.out.println("goodbye" + sayHiName); 48 } 49 } 50 51 // static class Transform { 52 // static {} 53 // public static String sayHiName; 54 // public static void somethingHappened1() { 55 // System.out.println("Running after op1 using non-structural redefinition"); 56 // } 57 // public static void somethingHappened2() { 58 // System.out.println("Running after op2 using non-structural redefinition"); 59 // } 60 // public static void sayHi(Runnable r1, Runnable r2) { 61 // System.out.println("TRANSFORMED_NON_STRUCTURAL hello" + sayHiName); 62 // r1.run(); 63 // somethingHappened1(); 64 // System.out.println("TRANSFORMED_NON_STRUCTURAL how do you do" + sayHiName); 65 // r2.run(); 66 // somethingHappened2(); 67 // System.out.println("TRANSFORMED_NON_STRUCTURAL goodbye" + sayHiName); 68 // } 69 // } 70 private static final byte[] NON_STRUCTURAL_DEX_BYTES = 71 Base64.getDecoder() 72 .decode( 73 "ZGV4CjAzNQCrRWiiuda6GysXvxv0iJ+9HUcPBCTU/UVkBwAAcAAAAHhWNBIAAAAAAAAAAKAGAAAl" 74 + "AAAAcAAAAAsAAAAEAQAABQAAADABAAACAAAAbAEAAAsAAAB8AQAAAQAAANQBAABwBQAA9AEAAFQD" 75 + "AABeAwAAZgMAAGkDAABtAwAAhwMAAJcDAAC7AwAA2wMAAPIDAAAGBAAAHAQAADAEAABLBAAAXwQA" 76 + "AJQEAADJBAAA7QQAAA8FAAA5BQAASAUAAFMFAABWBQAAWgUAAF8FAABsBQAAdAUAAHoFAAB/BQAA" 77 + "iAUAAI0FAACUBQAAnwUAALMFAADHBQAA0QUAANgFAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAK" 78 + "AAAACwAAAAwAAAANAAAAFQAAAAIAAAAHAAAAAAAAAAMAAAAIAAAARAMAABUAAAAKAAAAAAAAABcA" 79 + "AAAKAAAATAMAABYAAAAKAAAARAMAAAAABwAfAAAACQAEABsAAAAAAAIAAAAAAAAAAgABAAAAAAAD" 80 + "AB4AAAAAAAIAIAAAAAAAAgAhAAAABAAEABwAAAAFAAIAAQAAAAYAAgAdAAAACAACAAEAAAAIAAEA" 81 + "GQAAAAgAAAAiAAAAAAAAAAAAAAAFAAAAAAAAABMAAACQBgAAXwYAAAAAAAAAAAAAAAAAABwDAAAB" 82 + "AAAADgAAAAEAAQABAAAAIAMAAAQAAABwEAYAAAAOAAYAAgACAAAAJAMAAFUAAABiAAEAYgEAACIC" 83 + "CABwEAgAAgAaAxEAbiAJADIAbiAJABIAbhAKAAIADAFuIAUAEAByEAcABABxAAMAAABiBAEAYgAA" 84 + "ACIBCABwEAgAAQAaAhIAbiAJACEAbiAJAAEAbhAKAAEADABuIAUABAByEAcABQBxAAQAAABiBAEA" 85 + "YgUAACIACABwEAgAAAAaARAAbiAJABAAbiAJAFAAbhAKAAAADAVuIAUAVAAOAAAAAgAAAAIAAAA3" 86 + "AwAACAAAAGIAAQAaAQ4AbiAFABAADgACAAAAAgAAADwDAAAIAAAAYgABABoBDwBuIAUAEAAOAAcA" 87 + "DgAGAA4AEAIAAA4BGA88PAEYDzw8ARgPAAoADngADQAOeAAAAAABAAAABwAAAAIAAAAGAAYACDxj" 88 + "bGluaXQ+AAY8aW5pdD4AAUwAAkxMABhMYXJ0L1Rlc3QxOTc4JFRyYW5zZm9ybTsADkxhcnQvVGVz" 89 + "dDE5Nzg7ACJMZGFsdmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90" 90 + "YXRpb24vSW5uZXJDbGFzczsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmpl" 91 + "Y3Q7ABRMamF2YS9sYW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABlMamF2YS9sYW5n" 92 + "L1N0cmluZ0J1aWxkZXI7ABJMamF2YS9sYW5nL1N5c3RlbTsAM1J1bm5pbmcgYWZ0ZXIgb3AxIHVz" 93 + "aW5nIG5vbi1zdHJ1Y3R1cmFsIHJlZGVmaW5pdGlvbgAzUnVubmluZyBhZnRlciBvcDIgdXNpbmcg" 94 + "bm9uLXN0cnVjdHVyYWwgcmVkZWZpbml0aW9uACJUUkFOU0ZPUk1FRF9OT05fU1RSVUNUVVJBTCBn" 95 + "b29kYnllACBUUkFOU0ZPUk1FRF9OT05fU1RSVUNUVVJBTCBoZWxsbwAoVFJBTlNGT1JNRURfTk9O" 96 + "X1NUUlVDVFVSQUwgaG93IGRvIHlvdSBkbwANVGVzdDE5NzguamF2YQAJVHJhbnNmb3JtAAFWAAJW" 97 + "TAADVkxMAAthY2Nlc3NGbGFncwAGYXBwZW5kAARuYW1lAANvdXQAB3ByaW50bG4AA3J1bgAFc2F5" 98 + "SGkACXNheUhpTmFtZQASc29tZXRoaW5nSGFwcGVuZWQxABJzb21ldGhpbmdIYXBwZW5lZDIACHRv" 99 + "U3RyaW5nAAV2YWx1ZQB2fn5EOHsiY29tcGlsYXRpb24tbW9kZSI6ImRlYnVnIiwibWluLWFwaSI6" 100 + "MSwic2hhLTEiOiJhODM1MmYyNTQ4ODUzNjJjY2Q4ZDkwOWQzNTI5YzYwMDk0ZGQ4OTZlIiwidmVy" 101 + "c2lvbiI6IjEuNi4yMC1kZXYifQACAgEjGAECAwIYBAgaFxQBAAUAAAkAiIAE9AMBgIAEiAQBCaAE" 102 + "AQncBQEJ/AUAAAAAAAAAAgAAAFAGAABWBgAAhAYAAAAAAAAAAAAAAAAAABAAAAAAAAAAAQAAAAAA" 103 + "AAABAAAAJQAAAHAAAAACAAAACwAAAAQBAAADAAAABQAAADABAAAEAAAAAgAAAGwBAAAFAAAACwAA" 104 + "AHwBAAAGAAAAAQAAANQBAAABIAAABQAAAPQBAAADIAAABQAAABwDAAABEAAAAgAAAEQDAAACIAAA" 105 + "JQAAAFQDAAAEIAAAAgAAAFAGAAAAIAAAAQAAAF8GAAADEAAAAgAAAIAGAAAGIAAAAQAAAJAGAAAA" 106 + "EAAAAQAAAKAGAAA="); 107 108 // static class Transform { 109 // static {} 110 // // NB Due to the ordering of fields offset of sayHiName will change. 111 // public static String sayHiName; 112 // public static String sayByeName; 113 // public static String sayQuery; 114 // public static void somethingHappened1() { 115 // System.out.println("Running after op2 using structural redefinition"); 116 // sayQuery = " this fine day"; 117 // } 118 // public static void somethingHappened2() { 119 // System.out.println("Running after op2 using structural redefinition"); 120 // sayByeName = " and good luck"; 121 // } 122 // public static void doSayBye() { 123 // System.out.println("Goodbye" + sayByeName + " - Transformed"); 124 // } 125 // public static void doQuery() { 126 // System.out.println("How do you do" + sayQuery + " - Transformed"); 127 // } 128 // public static void doSayHi() { 129 // System.out.println("Hello" + sayHiName + " - Transformed"); 130 // } 131 // public static void sayHi(Runnable r, Runnable r2) { 132 // doSayHi(); 133 // r1.run(); 134 // somethingHappened1(); 135 // doQuery(); 136 // r2.run(); 137 // somethingHappened2(); 138 // doSayBye(); 139 // } 140 // } 141 private static final byte[] STRUCTURAL_DEX_BYTES = 142 Base64.getDecoder() 143 .decode( 144 "ZGV4CjAzNQBcSGjP90G9cWx1TjBkAO5SCOfSe5sjsEAUCAAAcAAAAHhWNBIAAAAAAAAAAFAHAAAs" 145 + "AAAAcAAAAAsAAAAgAQAABQAAAEwBAAAEAAAAiAEAAA4AAACoAQAAAQAAABgCAADcBQAAOAIAABwE" 146 + "AAAsBAAAPAQAAEwEAABWBAAAXgQAAGcEAABuBAAAfQQAAIAEAACEBAAAngQAAK4EAADSBAAA8gQA" 147 + "AAkFAAAdBQAAMwUAAEcFAABiBQAAdgUAAKcFAAC2BQAAwQUAAMQFAADIBQAAzQUAANoFAADiBQAA" 148 + "6wUAAPUFAAD+BQAABAYAAAkGAAASBgAAFwYAACMGAAAqBgAANQYAAD8GAABTBgAAZwYAAHEGAAB4" 149 + "BgAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABcAAAAIAAAABwAAAAAA" 150 + "AAAJAAAACAAAAAwEAAAXAAAACgAAAAAAAAAZAAAACgAAABQEAAAYAAAACgAAAAwEAAAAAAcAIwAA" 151 + "AAAABwAlAAAAAAAHACYAAAAJAAQAIAAAAAAAAgADAAAAAAACAAQAAAAAAAIAHAAAAAAAAgAdAAAA" 152 + "AAACAB4AAAAAAAMAJAAAAAAAAgAnAAAAAAACACgAAAAEAAQAIQAAAAUAAgAEAAAABgACACIAAAAI" 153 + "AAIABAAAAAgAAQAbAAAACAAAACkAAAAAAAAAAAAAAAUAAAAAAAAAFQAAAEAHAAD/BgAAAAAAAAAA" 154 + "AAAAAAAA1AMAAAEAAAAOAAAAAQABAAEAAADYAwAABAAAAHAQCQAAAA4ABAAAAAIAAADcAwAAHgAA" 155 + "AGIAAwBiAQIAIgIIAHAQCwACABoDBwBuIAwAMgBuIAwAEgAaAQAAbiAMABIAbhANAAIADAFuIAgA" 156 + "EAAOAAQAAAACAAAA4wMAAB4AAABiAAMAYgEAACICCABwEAsAAgAaAwUAbiAMADIAbiAMABIAGgEA" 157 + "AG4gDAASAG4QDQACAAwBbiAIABAADgAEAAAAAgAAAOoDAAAeAAAAYgADAGIBAQAiAggAcBALAAIA" 158 + "GgMGAG4gDAAyAG4gDAASABoBAABuIAwAEgBuEA0AAgAMAW4gCAAQAA4AAgACAAEAAADxAwAAFgAA" 159 + "AHEABAAAAHIQCgAAAHEABgAAAHEAAgAAAHIQCgABAHEABwAAAHEAAwAAAA4AAgAAAAIAAAD+AwAA" 160 + "DAAAAGIAAwAaARQAbiAIABAAGgACAGkAAgAOAAIAAAACAAAABAQAAAwAAABiAAMAGgEUAG4gCAAQ" 161 + "ABoAAQBpAAAADgAHAA4ABgAOABgADgEdDwAVAA4BHQ8AGwAOAR0PAB4CAAAOPDw8PDw8PAANAA54" 162 + "SwARAA54SwAAAAEAAAAHAAAAAgAAAAYABgAOIC0gVHJhbnNmb3JtZWQADiBhbmQgZ29vZCBsdWNr" 163 + "AA4gdGhpcyBmaW5lIGRheQAIPGNsaW5pdD4ABjxpbml0PgAHR29vZGJ5ZQAFSGVsbG8ADUhvdyBk" 164 + "byB5b3UgZG8AAUwAAkxMABhMYXJ0L1Rlc3QxOTc4JFRyYW5zZm9ybTsADkxhcnQvVGVzdDE5Nzg7" 165 + "ACJMZGFsdmlrL2Fubm90YXRpb24vRW5jbG9zaW5nQ2xhc3M7AB5MZGFsdmlrL2Fubm90YXRpb24v" 166 + "SW5uZXJDbGFzczsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmplY3Q7ABRM" 167 + "amF2YS9sYW5nL1J1bm5hYmxlOwASTGphdmEvbGFuZy9TdHJpbmc7ABlMamF2YS9sYW5nL1N0cmlu" 168 + "Z0J1aWxkZXI7ABJMamF2YS9sYW5nL1N5c3RlbTsAL1J1bm5pbmcgYWZ0ZXIgb3AyIHVzaW5nIHN0" 169 + "cnVjdHVyYWwgcmVkZWZpbml0aW9uAA1UZXN0MTk3OC5qYXZhAAlUcmFuc2Zvcm0AAVYAAlZMAANW" 170 + "TEwAC2FjY2Vzc0ZsYWdzAAZhcHBlbmQAB2RvUXVlcnkACGRvU2F5QnllAAdkb1NheUhpAARuYW1l" 171 + "AANvdXQAB3ByaW50bG4AA3J1bgAKc2F5QnllTmFtZQAFc2F5SGkACXNheUhpTmFtZQAIc2F5UXVl" 172 + "cnkAEnNvbWV0aGluZ0hhcHBlbmVkMQASc29tZXRoaW5nSGFwcGVuZWQyAAh0b1N0cmluZwAFdmFs" 173 + "dWUAdn5+RDh7ImNvbXBpbGF0aW9uLW1vZGUiOiJkZWJ1ZyIsIm1pbi1hcGkiOjEsInNoYS0xIjoi" 174 + "YTgzNTJmMjU0ODg1MzYyY2NkOGQ5MDlkMzUyOWM2MDA5NGRkODk2ZSIsInZlcnNpb24iOiIxLjYu" 175 + "MjAtZGV2In0AAgIBKhgBAgMCGgQIHxcWAwAIAAAJAQkBCQCIgAS4BAGAgATMBAEJ5AQBCbAFAQn8" 176 + "BQEJyAYBCYQHAQmsBwAAAAAAAAACAAAA8AYAAPYGAAA0BwAAAAAAAAAAAAAAAAAAEAAAAAAAAAAB" 177 + "AAAAAAAAAAEAAAAsAAAAcAAAAAIAAAALAAAAIAEAAAMAAAAFAAAATAEAAAQAAAAEAAAAiAEAAAUA" 178 + "AAAOAAAAqAEAAAYAAAABAAAAGAIAAAEgAAAIAAAAOAIAAAMgAAAIAAAA1AMAAAEQAAACAAAADAQA" 179 + "AAIgAAAsAAAAHAQAAAQgAAACAAAA8AYAAAAgAAABAAAA/wYAAAMQAAACAAAAMAcAAAYgAAABAAAA" 180 + "QAcAAAAQAAABAAAAUAcAAA=="); 181 run()182 public static void run() throws Exception { 183 Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE); 184 doTest(); 185 } 186 doTest()187 public static void doTest() throws Exception { 188 Transform.sayHi( 189 () -> { 190 System.out.println("Not doing anything here - op1"); 191 }, 192 () -> { 193 System.out.println("Not doing anything here - op2"); 194 }); 195 Transform.sayHi( 196 () -> { 197 System.out.println("transforming calling function - non-structural"); 198 Redefinition.doCommonClassRedefinition( 199 Transform.class, new byte[] {}, NON_STRUCTURAL_DEX_BYTES); 200 }, 201 () -> { 202 System.out.println("transforming calling function - structural"); 203 Redefinition.doCommonStructuralClassRedefinition(Transform.class, STRUCTURAL_DEX_BYTES); 204 }); 205 Transform.sayHi( 206 () -> { 207 System.out.println("Not doing anything here - op1"); 208 }, 209 () -> { 210 System.out.println("Not doing anything here - op2"); 211 }); 212 } 213 } 214