Copyright (C) 2009 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. Subject: How to build an Android SDK & ADT Eclipse plugin. Date: 2009/03/27 Updated: 2010/03/30 Table of content: 0- License 1- Foreword 2- Building an SDK for MacOS and Linux 3- Building an SDK for Windows 4- Building an ADT plugin for Eclipse 5- Conclusion ---------- 0- License ---------- Copyright (C) 2009 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. ----------- 1- Foreword ----------- This document explains how to build the Android SDK and the ADT Eclipse plugin. It is designed for advanced users which are proficient with command-line operations and know how to setup the pre-required software. Basically it's not trivial yet when done right it's not that complicated. -------------------------------------- 2- Building an SDK for MacOS and Linux -------------------------------------- First, setup your development environment and get the Android source code from git as explained here: http://source.android.com/source/download.html For example for the cupcake branch: $ mkdir ~/my-android-git $ cd ~/my-android-git $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake $ repo sync Then once you have all the source, simply build the SDK using: $ cd ~/my-android-git $ . build/envsetup.sh $ lunch sdk-eng $ make sdk This will take a while, maybe between 20 minutes and several hours depending on your machine. After a while you'll see this in the output: Package SDK: out/host/darwin-x86/sdk/android-sdk_eng.<build-id>_mac-x86.zip Some options: - Depending on your machine you can tell 'make' to build more things in parallel, e.g. if you have a dual core, use "make -j4 sdk" to build faster. - You can define "BUILD_NUMBER" to control the build identifier that gets incorporated in the resulting archive. The default is to use your username. One suggestion is to include the date, e.g.: $ export BUILD_NUMBER=${USER}-`date +%Y%m%d-%H%M%S` There are certain characters you should avoid in the build number, typically everything that might confuse 'make' or your shell. So for example avoid punctuation and characters like $ & : / \ < > , and . ------------------------------ 3- Building an SDK for Windows ------------------------------ A- SDK pre-requisite -------------------- First you need to build an SDK for MacOS and Linux. The Windows build works by updating an existing MacOS or Linux SDK zip file and replacing the unix binaries by Windows binaries. B- Cygwin pre-requisite & code checkout --------------------------------------- You must have Cygwin installed. But wait! You CANNOT use the latest Cygwin 1.7. Instead you MUST use the "legacy Cygwin 1.5" that you can find at this page: http://cygwin.org/win-9x.html Don't mind the page title, just grab setup-legacy.exe and it will works just fine under XP or Vista. Now configure it: - When installing Cygwin, set Default Text File Type to Unix/binary, not DOS/text. This is really important, otherwise you will get errors when trying to checkout code using git. - Packages that you must install or not: - Required packages: autoconf, bison, curl, flex, gcc, g++, git, gnupg, make, mingw-zlib, python, zip, unzip. - Suggested extra packages: diffutils, emacs, openssh, rsync, vim, wget. - Packages that must not be installed: readline. Once you installed Cygwin properly, checkout the code from git as you did for MacOS or Linux. Make sure to get the same branch, and if possible keep it as close to the other one as possible: $ mkdir ~/my-android-git $ cd ~/my-android-git $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake $ repo sync C- Building the Windows SDK --------------------------- Now it's time to build that Windows SDK. You need: - The path to the MacOS or Linux SDK zip. - A directory where to place the final SDK. It will also hold some temporary files. - The build number will be extracted from the SDK zip filename, but this will only work if that build number has no underscores in it. It is suggested you just define SDK_NUMBER (and not BUILD_NUMBER!) on the command line before invoking the script. Note that the "SDK number" is really a free identifier of your choice. It doesn't need to be strictly a number. As always it is suggested you avoid too much punctuation and special shell/make characters. Underscores cannot be used. To summarize, the steps on the command line would be something like this: $ mkdir ~/mysdk $ export SDK_NUMBER=${USER}-`date +%Y%m%d-%H%M%S` $ cd ~/my-android-git $ development/build/tools/make_windows_sdk.sh /path/to/macos/or/linux/sdk.zip ~/mysdk This will take a while to build some Windows-specific binaries, including the emulator, unzip the previous zip, rename & replace things and rezip the final Windows SDK zip file. A typical build time should be around 5-10 minutes. ------------------------------------- 4- Building an ADT plugin for Eclipse ------------------------------------- Requirements: - You can currently only build an ADT plugin for Eclipse under Linux. - You must have a working version of Eclipse 3.4 "ganymede" RCP installed. - You need X11 to run Eclipse at least once. - You need a lot of patience. The trick is to do the initial setup correctly once, after it's a piece of cake. A- Pre-requisites ----------------- Note for Ubuntu or Debian users: your apt repository probably only has Eclipse 3.2 available and it's probably not suitable to build plugins in the first place. Forget that and install a working 3.4 manually as described below. - Visit http://www.eclipse.org/downloads/ to grab the "Eclipse for RCP/Plug-in Developers (176 MB)" download for Linux. 32-bit and 64-bit versions are available, depending on your Linux installation. Note: we've always used a 32-bit one, so use the 64-bit one at your own risk. Note: Eclipse comes in various editions. Do yourself a favor and just stick to the RCP for building this plugin. For example the J2EE contains too many useless features that will get in the way, and the "Java" version lacks some plugins you need to build other plugins. Please just use the RCP one. - Unpack "eclipse-rcp-ganymede-SR2-linux-gtk.tar.gz" in the directory of your choice, e.g.: $ mkdir ~/eclipse-3.4 $ cd ~/eclipse-3.4 $ tar xvzf eclipse-rcp-ganymede-SR2-linux-gtk.tar.gz This will create an "eclipse" directory in the current directory. - Set ECLIPSE_HOME to that "eclipse" directory: $ export ECLIPSE_HOME=~/eclipse-3.4/eclipse Note: it is important you set ECLIPSE_HOME before starting the build. Otherwise the build process will try to download and install its own Eclipse installation in /buildroot, which is probably limited to root. - Now, before you can build anything, it is important that you start Eclipse *manually* once using the same user that you will use to build later. That's because your Eclipse installation is not finished: Eclipse must be run at least once to create some files in ~/.eclipse/. So run Eclipse now: $ ~/eclipse-3.4/eclipse/eclipse & Wait for it load, create a workspace when requested and then simply quit using the File > Quit menu. That's it. You won't need to run it manually again. B- Building ADT --------------- Finally, you have Eclipse, it's installed and it created its own config files, so now you can build your ADT plugin. To do that you'll change directories to your git repository and invoke the build script by giving it a destination directory and an optional build number: $ mkdir ~/mysdk $ cd ~/my-android-git # <-- this is where you did your "repo sync" $ development/tools/eclipse/scripts/build_server.sh ~/mysdk $USER The first argument is the destination directory. It must be absolute. Do not give a relative destination directory such as "../mysdk". This will make the Eclipse build fail with a cryptic message: BUILD SUCCESSFUL Total time: 1 minute 5 seconds **** Package in ../mysdk Error: Build failed to produce ../mysdk/android-eclipse Aborting The second argument is the build "number". The example used "$USER" but it really is a free identifier of your choice. It cannot contain spaces nor periods (dashes are ok.) If the build number is missing, a build timestamp will be used instead in the filename. The build should take something like 5-10 minutes. When the build succeeds, you'll see something like this at the end of the output: ZIP of Update site available at ~/mysdk/android-eclipse-v200903272328.zip or ZIP of Update site available at ~/mysdk/android-eclipse-<buildnumber>.zip When you load the plugin in Eclipse, its feature and plugin name will look like "com.android.ide.eclipse.adt_0.9.0.v200903272328-<buildnumber>.jar". The internal plugin ID is always composed of the package, the build timestamp and then your own build identifier (a.k.a. the "build number"), if provided. This means successive builds with the same build identifier are incremental and Eclipse will know how to update to more recent ones. ------------- 5- Conclusion ------------- This completes the howto guide on building your own SDK and ADT plugin. Feedback is welcome on the public Android Open Source forums: http://source.android.com/discuss If you are upgrading from a pre-cupcake to a cupcake or later SDK please read the accompanying document "howto_use_cupcake_sdk.txt". -end-