115a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com/* 215a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * Copyright (C) 2009 The Android Open Source Project 315a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * 415a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * Licensed under the Apache License, Version 2.0 (the "License"); 515a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * you may not use this file except in compliance with the License. 615a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * You may obtain a copy of the License at 715a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * 815a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * http://www.apache.org/licenses/LICENSE-2.0 915a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * 1015a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * Unless required by applicable law or agreed to in writing, software 1115a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * distributed under the License is distributed on an "AS IS" BASIS, 1215a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * See the License for the specific language governing permissions and 1415a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com * limitations under the License. 1515a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com */ 1615a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com 1715a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.compackage vogar; 1815a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com 19c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.comimport java.util.ArrayList; 20c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.comimport java.util.Arrays; 21c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.comimport java.util.List; 22c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 2315a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.compublic enum ModeId { 24c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** ART (works >= L) */ 25c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com DEVICE, 26c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** ART (works >= L) */ 27c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com HOST, 28c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** Local Java */ 29c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com JVM, 30c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** Device, execution as an Android app with Zygote */ 31c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com ACTIVITY, 32c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** Device using app_process binary */ 33c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com APP_PROCESS; 34c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 35c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com // $BOOTCLASSPATH defined by system/core/rootdir/init.rc 366373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally private static final String[] DEVICE_JARS = new String[] { 376373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally "core-libart", 388585b93f7dc80afb5192f68f9a4c8363fe45bf4eYi Kong "core-oj", 39c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "conscrypt", 40c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "okhttp", 415d207eee36d4909365498264d7d1bd67f1648561Paul Duffin "legacy-test", 42c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "bouncycastle", 43c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "ext", 44c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "framework", 45c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "telephony-common", 46c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "mms-common", 47c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "framework", 48c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "android.policy", 49c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "services", 50c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "apache-xml"}; 51c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 526373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally private static final String[] HOST_JARS = new String[] { 536373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally "core-libart-hostdex", 548585b93f7dc80afb5192f68f9a4c8363fe45bf4eYi Kong "core-oj-hostdex", 55c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "conscrypt-hostdex", 56c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "okhttp-hostdex", 57c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com "bouncycastle-hostdex", 58cced4b8bab645ddc48a2c833dbd94e93fe7f626cNarayan Kamath "apache-xml-hostdex" 59c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com }; 6015a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com 6115a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com public boolean acceptsVmArgs() { 6215a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com return this != ACTIVITY; 6315a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com } 6415a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com 65c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** 66c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com * Returns {@code true} if execution happens on the local machine. e.g. host-mode android or a 67c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com * JVM. 68c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com */ 69c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com public boolean isLocal() { 70c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return isHost() || this == ModeId.JVM; 71c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 72c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 73c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** Returns {@code true} if execution takes place with a host-mode Android runtime */ 7415a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com public boolean isHost() { 756373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally return this == HOST; 76c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 77c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 78c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** Returns {@code true} if execution takes place with a device-mode Android runtime */ 79c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com public boolean isDevice() { 806373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally return this == ModeId.DEVICE || this == ModeId.APP_PROCESS; 8115a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com } 8215a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com 8315a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com public boolean requiresAndroidSdk() { 848937db33722a081d33ae6691d109fbe721cdb7edenh@google.com return this != JVM; 8515a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com } 86f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com 87c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com public boolean supportsVariant(Variant variant) { 88f001fb6d617275688e71e5a29e2eb8b967f7150cCalin Juravle return (variant == Variant.X32) 89f001fb6d617275688e71e5a29e2eb8b967f7150cCalin Juravle || ((this == HOST || this == DEVICE) && (variant == Variant.X64)); 90c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 91c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 92c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** The default command to use for the mode unless overridden by --vm-command */ 93c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com public String defaultVmCommand(Variant variant) { 940bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com if (!supportsVariant(variant)) { 950bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com throw new AssertionError("Unsupported variant: " + variant + " for " + this); 96f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 97c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com switch (this) { 98c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case DEVICE: 99c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case HOST: 1000bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com if (variant == Variant.X32) { 1010bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com return "dalvikvm32"; 1020bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com } else { 1030bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com return "dalvikvm64"; 1040bfe27ed7e3a2a83e45688ecb420df7b30a59a85nfuller@google.com } 1056373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally 106c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case JVM: 107c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return "java"; 108c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case APP_PROCESS: 109c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return "app_process"; 110c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case ACTIVITY: 111c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return null; 112c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com default: 113c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com throw new IllegalArgumentException("Unknown mode: " + this); 114f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 115c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com } 116c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com 117c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com /** 118c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com * Return the names of jars required to compile in this mode when android.jar is not being used. 119c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com * Also used to generated the classpath in HOST* and DEVICE* modes. 120c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com */ 121c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com public String[] getJarNames() { 122c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com List<String> jarNames = new ArrayList<String>(); 123c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com switch (this) { 124c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case ACTIVITY: 125c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case APP_PROCESS: 126c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case DEVICE: 1276373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally jarNames.addAll(Arrays.asList(DEVICE_JARS)); 128c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com break; 129c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com case HOST: 1306373ab628b4a93a375b8cfde633229816ba101afRayhaan Jaufeerally jarNames.addAll(Arrays.asList(HOST_JARS)); 131c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com break; 132c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com default: 133c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com throw new IllegalArgumentException("Unsupported mode: " + this); 134f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 135c620846e4044b3b3a8abfc42ddba4adca4e545d9nfuller@google.com return jarNames.toArray(new String[jarNames.size()]); 136f1622c3bd3278fefaab9fa78aca445908362a74abdc@google.com } 13715a0413cb10b69802f9082b828ee8ce646b8c28djessewilson@google.com} 138