diff options
author | Raphael Moll <ralf@android.com> | 2011-07-06 23:41:57 -0400 |
---|---|---|
committer | Raphael Moll <ralf@android.com> | 2011-08-04 17:05:59 -0700 |
commit | e6414c7985411e8a56e2ae84bf8354fd77dd9b03 (patch) | |
tree | 632d12417c6f69260da28ded0771c8272ca7684e /sdklauncher | |
parent | 2f142053f2985defb71324d4d202a6588c16e373 (diff) | |
download | sdk-e6414c7985411e8a56e2ae84bf8354fd77dd9b03.zip sdk-e6414c7985411e8a56e2ae84bf8354fd77dd9b03.tar.gz sdk-e6414c7985411e8a56e2ae84bf8354fd77dd9b03.tar.bz2 |
Experimental Java-version of the sdk launcher.
The goal is to have this in $SDK/tools/lib/sdklauncher.jar
with 2 $SDK/SDK Manager|AVD Manager.exe wrappers (built using
jsmooth) that will run the launcher.jar, which in turns can
run/restart the SDK manager itself or the AVD manager.
The original launcher is still available by doing
$ USE_MINGW=1 make sdklauncher
whereas the new experimenal one is available by doing
$ make sdklauncher_exp
Change-Id: Iddb6c59b334a6197865f798b3d12fcf70880a141
Diffstat (limited to 'sdklauncher')
-rw-r--r-- | sdklauncher/Android.mk | 13 | ||||
-rwxr-xr-x | sdklauncher/app/.classpath | 8 | ||||
-rwxr-xr-x | sdklauncher/app/.project | 15 | ||||
-rwxr-xr-x | sdklauncher/app/Android.mk | 36 | ||||
-rwxr-xr-x | sdklauncher/app/NOTICE | 190 | ||||
-rwxr-xr-x | sdklauncher/app/etc/manifest.txt | 3 | ||||
-rwxr-xr-x | sdklauncher/app/src/com/android/sdklauncher/Main.java | 217 | ||||
-rwxr-xr-x | sdklauncher/app/tests/com/android/sdklauncher/MainTest.java | 37 |
8 files changed, 517 insertions, 2 deletions
diff --git a/sdklauncher/Android.mk b/sdklauncher/Android.mk index 8f0141b..8fda183 100644 --- a/sdklauncher/Android.mk +++ b/sdklauncher/Android.mk @@ -7,12 +7,14 @@ # and currently simply executes tools\android.bat. # Eventually it should simply replace the batch file. -ifeq ($(HOST_OS),windows) -LOCAL_PATH:= $(call my-dir) +#----- The current C++ sdklauncher ----- +LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +ifeq ($(HOST_OS),windows) + LOCAL_SRC_FILES := \ sdklauncher.c @@ -49,3 +51,10 @@ include $(BUILD_HOST_EXECUTABLE) $(call dist-for-goals,droid,$(LOCAL_BUILT_MODULE)) endif + +#----- New experimental sdklauncher. Not ready for production. ----- + +include $(LOCAL_PATH)/app/Android.mk + + + diff --git a/sdklauncher/app/.classpath b/sdklauncher/app/.classpath new file mode 100755 index 0000000..c7b186a --- /dev/null +++ b/sdklauncher/app/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry excluding="**/Android.mk" kind="src" path="src"/> + <classpathentry excluding="**/Android.mk|/" kind="src" path="tests"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/sdklauncher/app/.project b/sdklauncher/app/.project new file mode 100755 index 0000000..25abeb4 --- /dev/null +++ b/sdklauncher/app/.project @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>SdkLauncher</name>
+ <comment></comment>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/sdklauncher/app/Android.mk b/sdklauncher/app/Android.mk new file mode 100755 index 0000000..e801c96 --- /dev/null +++ b/sdklauncher/app/Android.mk @@ -0,0 +1,36 @@ +# Copyright 2011 The Android Open Source Project +# +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_JAVA_RESOURCE_DIRS := src + +LOCAL_JAR_MANIFEST := etc/manifest.txt + +# TODO figure out what to keep here and remove obsolete stuff +# +# IMPORTANT: if you add a new dependency here, please make sure +# to also check the following files: +# sdkmanager/app/etc/manifest.txt +# sdkmanager/app/etc/android.bat +# (Note that we don't reference swt.jar in these files since +# it is dynamically added by android.bat/.sh based on whether the +# current VM is 32 or 64 bit.) +#LOCAL_JAVA_LIBRARIES := \ +# androidprefs \ +# sdklib \ +# sdkuilib \ +# swt \ +# org.eclipse.jface_3.4.2.M20090107-0800 \ +# org.eclipse.equinox.common_3.4.0.v20080421-2006 \ +# org.eclipse.core.commands_3.4.0.I20080509-2000 + +LOCAL_MODULE := sdklauncher_exp +LOCAL_MODULE_TAGS := optional + +include $(BUILD_HOST_JAVA_LIBRARY) + +# Build all sub-directories +include $(call all-makefiles-under,$(LOCAL_PATH)) + diff --git a/sdklauncher/app/NOTICE b/sdklauncher/app/NOTICE new file mode 100755 index 0000000..c5b1efa --- /dev/null +++ b/sdklauncher/app/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2005-2008, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/sdklauncher/app/etc/manifest.txt b/sdklauncher/app/etc/manifest.txt new file mode 100755 index 0000000..d52eb7f --- /dev/null +++ b/sdklauncher/app/etc/manifest.txt @@ -0,0 +1,3 @@ +Main-Class: com.android.sdklauncher.Main +Class-Path: + diff --git a/sdklauncher/app/src/com/android/sdklauncher/Main.java b/sdklauncher/app/src/com/android/sdklauncher/Main.java new file mode 100755 index 0000000..c2dd2b3 --- /dev/null +++ b/sdklauncher/app/src/com/android/sdklauncher/Main.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.sdklauncher; + +import java.awt.*; +import java.awt.event.*; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; + +/** + * Main class for the sdklauncher application. + * <p/> + * Right now this is just experimental. + * This is designed to eventually replace the current sdklauncher.exe + * that is written in C++, which merely runs the android.bat. + * <p/> + * The new workflow is to have: + * - $SDK/tools/lib/sdkmanager.jar + * - $SDK/SDK Manager.exe + * - $SDK/AVD Manager.exe + * + * The 2 exe in the root of the $SDK are created using jsmooth + * and directly *embed* (not call) the equivalent of sdklauncher.jar. + * The launcher copies all the JARs to run to the TEMP dir and loads + * them from there, thus ideally removing any lock to the tools + * directory. In case of tools update, the sdkmanager.jar sends a + * signal to the launcher to restart itself after updating the temp copy. + */ +public class Main { + + /** + * Title shown in the AWT message box in case of error. + */ + private static final String AWT_MSG_BOX_TITLE = "Android SDK Error"; + + /** + * The main class of the SdkManager + */ + private static final String SDK_MAN_MAIN_CLASS = "com.android.sdkmanager.Main"; + + // these must match the Main from Sdk Manager + + /** Java property that defines the location of the sdk/tools directory. */ + private final static String TOOLSDIR = "com.android.sdkmanager.toolsdir"; + /** Java property that defines the working directory. On Windows the current working directory + * is actually the tools dir, in which case this is used to get the original CWD. */ + private final static String WORKDIR = "com.android.sdkmanager.workdir"; + + + + public static void main(String[] args) { + new Main().run(args); + } + + /** + * Runs the sdk manager app. + * <p/> + * Command-line arguments will be directly given to the SDK Manager.jar. + * Tyicall this would be just "sdk" or "avd" to display the corresponding manager. + */ + private void run(String[] args) { + // Get current directory, which should be where this app is running from + File currDir = new File("."); + try { + currDir = new File(System.getProperty("user.dir")); + + // Set the tools dir and working dir properties + System.setProperty(TOOLSDIR, mkPath(currDir, "tools").getAbsolutePath()); + System.setProperty(WORKDIR, currDir.getAbsolutePath()); + + // Load sdkmanager in a custom class loader with the following + // class path, in that specific order: + // - $SDK/tools/lib/sdkmanager.jar + // - $SDK/tools/lib/* + // - $SDK/tools/lib/$ARCH/swt.jar + + File libDir = mkPath(currDir, "tools", "lib"); + File sdkManJar = mkPath(libDir, "sdkmanager.jar"); + File archDir = mkPath(libDir, archQuery()); + File swtJar = mkPath(archDir, "swt.jar"); + + if (!sdkManJar.exists()) { + // Probably not started from an SDK directory... + throw new FileNotFoundException(sdkManJar.getAbsolutePath()); + } + if (!swtJar.exists()) { + // Could the architecture be unsupported? + throw new FileNotFoundException(swtJar.getAbsolutePath()); + } + + URL[] urls = { + sdkManJar.toURI().toURL(), + libDir.toURI().toURL(), + swtJar.toURI().toURL() + }; + URLClassLoader loader = new URLClassLoader(urls); + + Class<?> clazz = loader.loadClass(SDK_MAN_MAIN_CLASS); + Method m = clazz.getMethod("main", new Class[] { String[].class }); + m.invoke(null, new Object[] { args }); + + System.exit(0); + + } catch(Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + sw.flush(); + + showAwtDialog(sw.toString()); + + System.exit(1); + } + } + + /** + * Appends one or more path components to a base directory. + */ + private File mkPath(File baseDir, String...paths) { + for (String path : paths) { + baseDir = new File(baseDir, path); + } + return baseDir; + } + + /** + * Returns the current architecture string, e.g. "x86" or "x86_64". + * This matches the folder name at $SDK/tools/lib/$ARCH. + * + * This code is extracted from sdk/archquery/src/.../Main.java + */ + private String archQuery() { + // Values listed from http://lopica.sourceforge.net/os.html + String arch = System.getProperty("os.arch"); + + if (arch.equalsIgnoreCase("x86_64") || arch.equalsIgnoreCase("amd64")) { + return "x86_64"; + + } else if (arch.equalsIgnoreCase("x86") + || arch.equalsIgnoreCase("i386") + || arch.equalsIgnoreCase("i686")) { + return "x86"; + + } else if (arch.equalsIgnoreCase("ppc") || arch.equalsIgnoreCase("PowerPC")) { + return "ppc"; + + } else { + return arch; + } + } + + /** + * Displays the given text content in a message box-like AWT window. + * We surely don't have SWT or Swing or anything fancy in case of error so AWT will have to do. + */ + private void showAwtDialog(String content) { + Frame f = new Frame(); + AwtErrorDialog mb = new AwtErrorDialog(f, content); + mb.dispose(); + } + + /** + * A simple AWT window with one "Close" button that displays whatever + * error we might have to show the user. It uses a TextArea and so can + * display multi-line content with scrollbars. + */ + private static class AwtErrorDialog extends Dialog { + + public AwtErrorDialog(Frame f, String content) { + super(f, AWT_MSG_BOX_TITLE, true /*modal*/); + setLayout(new BorderLayout()); + add(new TextArea(content), BorderLayout.CENTER); + + Panel bottom = new Panel(); + add(bottom, BorderLayout.SOUTH); + Button close = new Button("Close"); + bottom.add(close); + close.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + + this.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + setVisible(false); + } + }); + + pack(); + setVisible(true); + } + } + + +} diff --git a/sdklauncher/app/tests/com/android/sdklauncher/MainTest.java b/sdklauncher/app/tests/com/android/sdklauncher/MainTest.java new file mode 100755 index 0000000..ef28988 --- /dev/null +++ b/sdklauncher/app/tests/com/android/sdklauncher/MainTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.sdklauncher; + +import junit.framework.TestCase; + +public class MainTest extends TestCase { + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + public void testPlaceholder() { + assertTrue(true); + } + +} |