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 import static art.Redefinition.doCommonClassRedefinition; 18*795d594fSAndroid Build Coastguard Worker import java.util.Base64; 19*795d594fSAndroid Build Coastguard Worker import java.util.OptionalLong; 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker /** 23*795d594fSAndroid Build Coastguard Worker * This is the base64 encoded class/dex. 24*795d594fSAndroid Build Coastguard Worker * 25*795d594fSAndroid Build Coastguard Worker * To regenerate these constants: 26*795d594fSAndroid Build Coastguard Worker * 1) Update src-optional/java/util/OptionalLong.java 27*795d594fSAndroid Build Coastguard Worker * 2) run convert-to-base64.sh script, specifying 28*795d594fSAndroid Build Coastguard Worker * required parameters (path to d8 tool and path to android.jar; 29*795d594fSAndroid Build Coastguard Worker * both can be found in Android sdk) 30*795d594fSAndroid Build Coastguard Worker * 3) copy and paste base64 text below 31*795d594fSAndroid Build Coastguard Worker * 32*795d594fSAndroid Build Coastguard Worker */ 33*795d594fSAndroid Build Coastguard Worker private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( 34*795d594fSAndroid Build Coastguard Worker "LyoKICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QK" + 35*795d594fSAndroid Build Coastguard Worker "ICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhl" + 36*795d594fSAndroid Build Coastguard Worker "ICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBs" + 37*795d594fSAndroid Build Coastguard Worker "aWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBM" + 38*795d594fSAndroid Build Coastguard Worker "aWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VO" + 39*795d594fSAndroid Build Coastguard Worker "U0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQg" + 40*795d594fSAndroid Build Coastguard Worker "dG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2Ug" + 41*795d594fSAndroid Build Coastguard Worker "aXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVT" + 42*795d594fSAndroid Build Coastguard Worker "IE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAq" + 43*795d594fSAndroid Build Coastguard Worker "IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJt" + 44*795d594fSAndroid Build Coastguard Worker "aXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdl" + 45*795d594fSAndroid Build Coastguard Worker "IGphdmEudXRpbDsKaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nQ29uc3VtZXI7CmltcG9y" + 46*795d594fSAndroid Build Coastguard Worker "dCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1N1cHBsaWVyOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0" + 47*795d594fSAndroid Build Coastguard Worker "aW9uLlN1cHBsaWVyOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Mb25nU3RyZWFtOwpwdWJsaWMg" + 48*795d594fSAndroid Build Coastguard Worker "ZmluYWwgY2xhc3MgT3B0aW9uYWxMb25nIHsKICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIDxjbGlu" + 49*795d594fSAndroid Build Coastguard Worker "aXQ+IGZ1bmN0aW9uIHNpbmNlIHRoZSByZWFsIGltcGxlbWVudGF0aW9uIG9mIE9wdGlvbmFsTG9u" + 50*795d594fSAndroid Build Coastguard Worker "ZyBkb2VzLgogIHN0YXRpYyB7IEVNUFRZID0gbnVsbDsgfQogIHByaXZhdGUgc3RhdGljIGZpbmFs" + 51*795d594fSAndroid Build Coastguard Worker "IE9wdGlvbmFsTG9uZyBFTVBUWTsKICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNQcmVzZW50Owog" + 52*795d594fSAndroid Build Coastguard Worker "IHByaXZhdGUgZmluYWwgbG9uZyB2YWx1ZTsKICBwcml2YXRlIE9wdGlvbmFsTG9uZygpIHsgaXNQ" + 53*795d594fSAndroid Build Coastguard Worker "cmVzZW50ID0gZmFsc2U7IHZhbHVlID0gMDsgfQogIHByaXZhdGUgT3B0aW9uYWxMb25nKGxvbmcg" + 54*795d594fSAndroid Build Coastguard Worker "bCkgeyB0aGlzKCk7IH0KICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsTG9uZyBlbXB0eSgpIHsgcmV0" + 55*795d594fSAndroid Build Coastguard Worker "dXJuIG51bGw7IH0KICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsTG9uZyBvZihsb25nIHZhbHVlKSB7" + 56*795d594fSAndroid Build Coastguard Worker "IHJldHVybiBudWxsOyB9CiAgcHVibGljIGxvbmcgZ2V0QXNMb25nKCkgeyByZXR1cm4gMDsgfQog" + 57*795d594fSAndroid Build Coastguard Worker "IHB1YmxpYyBib29sZWFuIGlzUHJlc2VudCgpIHsgcmV0dXJuIGZhbHNlOyB9CiAgcHVibGljIGJv" + 58*795d594fSAndroid Build Coastguard Worker "b2xlYW4gaXNFbXB0eSgpIHsgcmV0dXJuIGZhbHNlOyB9CiAgcHVibGljIHZvaWQgaWZQcmVzZW50" + 59*795d594fSAndroid Build Coastguard Worker "KExvbmdDb25zdW1lciBjKSB7IH0KICBwdWJsaWMgdm9pZCBpZlByZXNlbnRPckVsc2UoTG9uZ0Nv" + 60*795d594fSAndroid Build Coastguard Worker "bnN1bWVyIGFjdGlvbiwgUnVubmFibGUgZW1wdHlBY3Rpb24pIHsgfQogIHB1YmxpYyBMb25nU3Ry" + 61*795d594fSAndroid Build Coastguard Worker "ZWFtIHN0cmVhbSgpIHsgcmV0dXJuIG51bGw7IH0KICBwdWJsaWMgbG9uZyBvckVsc2UobG9uZyBs" + 62*795d594fSAndroid Build Coastguard Worker "KSB7IHJldHVybiAwOyB9CiAgcHVibGljIGxvbmcgb3JFbHNlR2V0KExvbmdTdXBwbGllciBzKSB7" + 63*795d594fSAndroid Build Coastguard Worker "IHJldHVybiAwOyB9CiAgcHVibGljIGxvbmcgb3JFbHNlVGhyb3coKSB7IHJldHVybiAwOyB9CiAg" + 64*795d594fSAndroid Build Coastguard Worker "cHVibGljPFggZXh0ZW5kcyBUaHJvd2FibGU+IGxvbmcgb3JFbHNlVGhyb3coU3VwcGxpZXI8PyBl" + 65*795d594fSAndroid Build Coastguard Worker "eHRlbmRzIFg+IHMpIHRocm93cyBYIHsgcmV0dXJuIDA7IH0KICBwdWJsaWMgYm9vbGVhbiBlcXVh" + 66*795d594fSAndroid Build Coastguard Worker "bHMoT2JqZWN0IG8pIHsgcmV0dXJuIGZhbHNlOyB9CiAgcHVibGljIGludCBoYXNoQ29kZSgpIHsg" + 67*795d594fSAndroid Build Coastguard Worker "cmV0dXJuIDA7IH0KICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIlJlZGVmaW5l" + 68*795d594fSAndroid Build Coastguard Worker "ZCBPcHRpb25hbExvbmchIjsgfQp9Cg=="); 69*795d594fSAndroid Build Coastguard Worker private static final byte[] DEX_BYTES = Base64.getDecoder().decode( 70*795d594fSAndroid Build Coastguard Worker "ZGV4CjAzNQBVWRCACMU+HJ9PqTkRRt+Gpa1jx32x1C8kCQAAcAAAAHhWNBIAAAAAAAAAAGAIAAAw" + 71*795d594fSAndroid Build Coastguard Worker "AAAAcAAAAA8AAAAwAQAADwAAAGwBAAADAAAAIAIAABMAAAA4AgAAAQAAANACAAA0BgAA8AIAAL4E" + 72*795d594fSAndroid Build Coastguard Worker "AADMBAAA0QQAANsEAADjBAAA5wQAAO4EAADxBAAA9AQAAPgEAAD8BAAA/wQAAAMFAAAiBQAAPgUA" + 73*795d594fSAndroid Build Coastguard Worker "AFIFAABoBQAAfAUAAJMFAACtBQAA0AUAAPMFAAASBgAAMQYAAFAGAABjBgAAfAYAAH8GAACDBgAA" + 74*795d594fSAndroid Build Coastguard Worker "hwYAAIwGAACPBgAAkwYAAJoGAACiBgAArQYAALcGAADCBgAA0wYAANwGAADnBgAA6wYAAPMGAAD+" + 75*795d594fSAndroid Build Coastguard Worker "BgAACwcAABMHAAAdBwAAJAcAAAYAAAAHAAAADAAAAA0AAAAOAAAADwAAABAAAAARAAAAEgAAABMA" + 76*795d594fSAndroid Build Coastguard Worker "AAAUAAAAFQAAABcAAAAaAAAAHgAAAAYAAAAAAAAAAAAAAAcAAAABAAAAAAAAAAgAAAABAAAAkAQA" + 77*795d594fSAndroid Build Coastguard Worker "AAkAAAABAAAAmAQAAAkAAAABAAAAoAQAAAoAAAAGAAAAAAAAAAoAAAAIAAAAAAAAAAsAAAAIAAAA" + 78*795d594fSAndroid Build Coastguard Worker "kAQAAAoAAAAMAAAAAAAAABoAAAANAAAAAAAAABsAAAANAAAAkAQAABwAAAANAAAAqAQAAB0AAAAN" + 79*795d594fSAndroid Build Coastguard Worker "AAAAsAQAAB4AAAAOAAAAAAAAAB8AAAAOAAAAuAQAAAgACAAFAAAACAAOACcAAAAIAAEALgAAAAQA" + 80*795d594fSAndroid Build Coastguard Worker "CQADAAAACAAJAAIAAAAIAAkAAwAAAAgACgADAAAACAAGACAAAAAIAA4AIQAAAAgAAQAiAAAACAAA" + 81*795d594fSAndroid Build Coastguard Worker "ACMAAAAIAAsAJAAAAAgADAAlAAAACAANACYAAAAIAA0AJwAAAAgABwAoAAAACAACACkAAAAIAAMA" + 82*795d594fSAndroid Build Coastguard Worker "KgAAAAgAAQArAAAACAAEACsAAAAIAAgALAAAAAgABQAtAAAACAAAABEAAAAEAAAAAAAAABgAAABI" + 83*795d594fSAndroid Build Coastguard Worker "CAAA3QcAAAAAAAACAAIAAAAAAAAAAAACAAAAEgEPAQIAAQAAAAAAAAAAAAIAAAASAA8AAgABAAAA" + 84*795d594fSAndroid Build Coastguard Worker "AAAAAAAAAgAAABIADwACAAEAAAAAAAAAAAACAAAAEgAPAAIAAQAAAAAAAAAAAAMAAAAaABkAEQAA" + 85*795d594fSAndroid Build Coastguard Worker "AAEAAAAAAAAAAAAAAAIAAAASABEAAgACAAAAAAAAAAAAAgAAABIAEQACAAEAAAAAAAAAAAACAAAA" + 86*795d594fSAndroid Build Coastguard Worker "EgARAAMAAQAAAAAAAAAAAAMAAAAWAAAAEAAAAAMAAwAAAAAAAAAAAAMAAAAWAQAAEAEAAAQAAgAA" + 87*795d594fSAndroid Build Coastguard Worker "AAAAAAAAAAMAAAAWAAAAEAAAAAMAAQAAAAAAAAAAAAMAAAAWAAAAEAAAAAQAAgAAAAAAAAAAAAMA" + 88*795d594fSAndroid Build Coastguard Worker "AAAWAAAAEAAAAAAAAAAAAAAAAAAAAAEAAAAOAAAAAwABAAEAAACGBAAACwAAAHAQAAACABIAXCAB" + 89*795d594fSAndroid Build Coastguard Worker "ABYAAABaIAIADgAAAAMAAwABAAAAigQAAAQAAABwEAIAAAAOAAIAAgAAAAAAAAAAAAEAAAAOAAAA" + 90*795d594fSAndroid Build Coastguard Worker "AwADAAAAAAAAAAAAAQAAAA4AGwAOABwBAA4AAAEAAAABAAAAAQAAAAoAAAABAAAACwAAAAEAAAAJ" + 91*795d594fSAndroid Build Coastguard Worker "AAAAAgAAAAkABQABAAAABAAMK1RYOz47KUpeVFg7AAM8WDoACDxjbGluaXQ+AAY8aW5pdD4AAj4o" + 92*795d594fSAndroid Build Coastguard Worker "AAVFTVBUWQABSQABSgACSkoAAkpMAAFMAAJMSgAdTGRhbHZpay9hbm5vdGF0aW9uL1NpZ25hdHVy" + 93*795d594fSAndroid Build Coastguard Worker "ZTsAGkxkYWx2aWsvYW5ub3RhdGlvbi9UaHJvd3M7ABJMamF2YS9sYW5nL09iamVjdDsAFExqYXZh" + 94*795d594fSAndroid Build Coastguard Worker "L2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAFUxqYXZhL2xhbmcvVGhyb3dhYmxl" + 95*795d594fSAndroid Build Coastguard Worker "OwAYTGphdmEvdXRpbC9PcHRpb25hbExvbmc7ACFMamF2YS91dGlsL2Z1bmN0aW9uL0xvbmdDb25z" + 96*795d594fSAndroid Build Coastguard Worker "dW1lcjsAIUxqYXZhL3V0aWwvZnVuY3Rpb24vTG9uZ1N1cHBsaWVyOwAdTGphdmEvdXRpbC9mdW5j" + 97*795d594fSAndroid Build Coastguard Worker "dGlvbi9TdXBwbGllcjsAHUxqYXZhL3V0aWwvZnVuY3Rpb24vU3VwcGxpZXI8AB1MamF2YS91dGls" + 98*795d594fSAndroid Build Coastguard Worker "L3N0cmVhbS9Mb25nU3RyZWFtOwART3B0aW9uYWxMb25nLmphdmEAF1JlZGVmaW5lZCBPcHRpb25h" + 99*795d594fSAndroid Build Coastguard Worker "bExvbmchAAFWAAJWSgACVkwAA1ZMTAABWgACWkwABWVtcHR5AAZlcXVhbHMACWdldEFzTG9uZwAI" + 100*795d594fSAndroid Build Coastguard Worker "aGFzaENvZGUACWlmUHJlc2VudAAPaWZQcmVzZW50T3JFbHNlAAdpc0VtcHR5AAlpc1ByZXNlbnQA" + 101*795d594fSAndroid Build Coastguard Worker "Am9mAAZvckVsc2UACW9yRWxzZUdldAALb3JFbHNlVGhyb3cABnN0cmVhbQAIdG9TdHJpbmcABXZh" + 102*795d594fSAndroid Build Coastguard Worker "bHVlAJ4Bfn5EOHsiYmFja2VuZCI6ImRleCIsImNvbXBpbGF0aW9uLW1vZGUiOiJyZWxlYXNlIiwi" + 103*795d594fSAndroid Build Coastguard Worker "aGFzLWNoZWNrc3VtcyI6ZmFsc2UsIm1pbi1hcGkiOjEsInNoYS0xIjoiOWM5OGM2ZGRmZDc0ZGVj" + 104*795d594fSAndroid Build Coastguard Worker "ZThiOTdlOGEyODc4ZDIwOGEwNjJmZGJmNCIsInZlcnNpb24iOiIzLjAuNDEtZGV2In0AAgIBLhwF" + 105*795d594fSAndroid Build Coastguard Worker "FwEXERcEFxYXAAIDAS4cARgHAQIFDQAaARIBEgGIgASMCAGCgASgCAGCgATICAEJ2AYICewGBQHw" + 106*795d594fSAndroid Build Coastguard Worker "BQEBlAcBAawGAQHgCAEB9AgBAYQGAQGYBgIBrAcBAcQHAQHcBwEB9AcBAYAHAQHABgAAAAAAAAAC" + 107*795d594fSAndroid Build Coastguard Worker "AAAAxQcAANUHAAA4CAAAAAAAAAEAAAAAAAAAEAAAADwIAAAQAAAAAAAAAAEAAAAAAAAAAQAAADAA" + 108*795d594fSAndroid Build Coastguard Worker "AABwAAAAAgAAAA8AAAAwAQAAAwAAAA8AAABsAQAABAAAAAMAAAAgAgAABQAAABMAAAA4AgAABgAA" + 109*795d594fSAndroid Build Coastguard Worker "AAEAAADQAgAAASAAABIAAADwAgAAAyAAAAIAAACGBAAAARAAAAYAAACQBAAAAiAAADAAAAC+BAAA" + 110*795d594fSAndroid Build Coastguard Worker "BCAAAAIAAADFBwAAACAAAAEAAADdBwAAAxAAAAIAAAA4CAAABiAAAAEAAABICAAAABAAAAEAAABg" + 111*795d594fSAndroid Build Coastguard Worker "CAAA"); 112*795d594fSAndroid Build Coastguard Worker main(String[] args)113*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 114*795d594fSAndroid Build Coastguard Worker // OptionalLong is a class that is unlikely to be used by the time this test starts and is not 115*795d594fSAndroid Build Coastguard Worker // likely to be changed in any meaningful way in the future. 116*795d594fSAndroid Build Coastguard Worker OptionalLong ol = OptionalLong.of(0xDEADBEEF); 117*795d594fSAndroid Build Coastguard Worker System.out.println("ol.toString() -> '" + ol.toString() + "'"); 118*795d594fSAndroid Build Coastguard Worker System.out.println("Redefining OptionalLong!"); 119*795d594fSAndroid Build Coastguard Worker doCommonClassRedefinition(OptionalLong.class, CLASS_BYTES, DEX_BYTES); 120*795d594fSAndroid Build Coastguard Worker System.out.println("ol.toString() -> '" + ol.toString() + "'"); 121*795d594fSAndroid Build Coastguard Worker } 122*795d594fSAndroid Build Coastguard Worker } 123