1 /*
2  * Copyright (C) 2020 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.nio.ByteBuffer;
20 import java.util.ArrayList;
21 import java.util.Base64;
22 import java.util.concurrent.CountDownLatch;
23 import java.util.function.Supplier;
24 import java.util.concurrent.atomic.*;
25 import java.lang.reflect.*;
26 
27 public class Test2008 {
28   public static class Transform {
Transform()29     public Transform() { myField = "bar"; }
30     public Object myField;
31   }
32 
33   /**
34    * base64 encoded class/dex file for
35    * public static class Transform {
36    *   public Transform() { myField = "foo"; };
37    *   public Object myField;
38    * }
39    */
40   private static final byte[] DEX_BYTES =
41       Base64.getDecoder()
42           .decode(
43 "ZGV4CjAzNQC9mLO3NCcl4Iqwlj+DV0clWONvLK5zDAqAAwAAcAAAAHhWNBIAAAAAAAAAAMgCAAAP" +
44 "AAAAcAAAAAYAAACsAAAAAQAAAMQAAAABAAAA0AAAAAIAAADYAAAAAQAAAOgAAAB4AgAACAEAACwB" +
45 "AAA0AQAATgEAAF4BAACCAQAAogEAALYBAADFAQAA0AEAANMBAADgAQAA5QEAAO4BAAD0AQAA+wEA" +
46 "AAEAAAACAAAAAwAAAAQAAAAFAAAACAAAAAgAAAAFAAAAAAAAAAAABAALAAAAAAAAAAAAAAAEAAAA" +
47 "AAAAAAAAAAABAAAABAAAAAAAAAAGAAAAuAIAAJkCAAAAAAAAAgABAAEAAAAoAQAACAAAAHAQAQAB" +
48 "ABoACgBbEAAADgAFAA4ABjxpbml0PgAYTGFydC9UZXN0MjAwOCRUcmFuc2Zvcm07AA5MYXJ0L1Rl" +
49 "c3QyMDA4OwAiTGRhbHZpay9hbm5vdGF0aW9uL0VuY2xvc2luZ0NsYXNzOwAeTGRhbHZpay9hbm5v" +
50 "dGF0aW9uL0lubmVyQ2xhc3M7ABJMamF2YS9sYW5nL09iamVjdDsADVRlc3QyMDA4LmphdmEACVRy" +
51 "YW5zZm9ybQABVgALYWNjZXNzRmxhZ3MAA2ZvbwAHbXlGaWVsZAAEbmFtZQAFdmFsdWUAjAF+fkQ4" +
52 "eyJjb21waWxhdGlvbi1tb2RlIjoiZGVidWciLCJoYXMtY2hlY2tzdW1zIjpmYWxzZSwibWluLWFw" +
53 "aSI6MSwic2hhLTEiOiI2NjA0MGE0MGQzY2JmNDA1MDU0NzQ4YmY1YTllOWYyZjNmZThhMzRiIiwi" +
54 "dmVyc2lvbiI6IjIuMC4xMi1kZXYifQACAgENGAECAwIJBAkMFwcAAQEAAAEAgYAEiAIAAAAAAAAA" +
55 "AgAAAIoCAACQAgAArAIAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAAC" +
56 "AAAABgAAAKwAAAADAAAAAQAAAMQAAAAEAAAAAQAAANAAAAAFAAAAAgAAANgAAAAGAAAAAQAAAOgA" +
57 "AAABIAAAAQAAAAgBAAADIAAAAQAAACgBAAACIAAADwAAACwBAAAEIAAAAgAAAIoCAAAAIAAAAQAA" +
58 "AJkCAAADEAAAAgAAAKgCAAAGIAAAAQAAALgCAAAAEAAAAQAAAMgCAAA=");
59   private static final byte[] CLASS_BYTES =
60       Base64.getDecoder()
61           .decode(
62 "yv66vgAAADQAFwoABQAOCAAPCQAEABAHABIHABUBAAdteUZpZWxkAQASTGphdmEvbGFuZy9PYmpl" +
63 "Y3Q7AQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUB" +
64 "AA1UZXN0MjAwOC5qYXZhDAAIAAkBAANmb28MAAYABwcAFgEAFmFydC9UZXN0MjAwOCRUcmFuc2Zv" +
65 "cm0BAAlUcmFuc2Zvcm0BAAxJbm5lckNsYXNzZXMBABBqYXZhL2xhbmcvT2JqZWN0AQAMYXJ0L1Rl" +
66 "c3QyMDA4ACEABAAFAAAAAQABAAYABwAAAAEAAQAIAAkAAQAKAAAAIwACAAEAAAALKrcAASoSArUA" +
67 "A7EAAAABAAsAAAAGAAEAAAAFAAIADAAAAAIADQAUAAAACgABAAQAEQATAAk=");
68 
69 
run()70   public static void run() throws Exception {
71     Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
72     doTest();
73   }
74 
doTest()75   public static void doTest() throws Exception {
76     Transform t = new Transform();
77     Field f = Transform.class.getDeclaredField("myField");
78     System.out.println("PreTransform Field " + f + " = \"" + f.get(t) + "\"");
79     Redefinition.doCommonClassRedefinition(Transform.class, CLASS_BYTES, DEX_BYTES);
80     System.out.println("PostTransform Field " + f + " = \"" + f.get(t) + "\"");
81   }
82 }
83