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