| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 1 | page.title=Initializing a Build Environment | 
 | 2 | @jd:body | 
 | 3 |  | 
 | 4 | <!-- | 
| Clay Murphy | cb789ba | 2015-02-02 11:11:24 -0800 | [diff] [blame] | 5 |     Copyright 2015 The Android Open Source Project | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 6 |  | 
 | 7 |     Licensed under the Apache License, Version 2.0 (the "License"); | 
 | 8 |     you may not use this file except in compliance with the License. | 
 | 9 |     You may obtain a copy of the License at | 
 | 10 |  | 
 | 11 |         http://www.apache.org/licenses/LICENSE-2.0 | 
 | 12 |  | 
 | 13 |     Unless required by applicable law or agreed to in writing, software | 
 | 14 |     distributed under the License is distributed on an "AS IS" BASIS, | 
 | 15 |     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | 16 |     See the License for the specific language governing permissions and | 
 | 17 |     limitations under the License. | 
 | 18 | --> | 
 | 19 | <div id="qv-wrapper"> | 
 | 20 |   <div id="qv"> | 
 | 21 |     <h2>In this document</h2> | 
 | 22 |     <ol id="auto-toc"> | 
 | 23 |     </ol> | 
 | 24 |   </div> | 
 | 25 | </div> | 
 | 26 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 27 | <p>This section describes how to set up your local work environment to build | 
 | 28 | the Android source files. You will need to use Linux or Mac OS. Building under | 
 | 29 | Windows is not currently supported.</p> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 30 | <p>For an overview of the entire code-review and code-update process, see <a | 
 | 31 | href="life-of-a-patch.html">Life of a Patch</a>.</p> | 
 | 32 | <h2 id="choosing-a-branch">Choosing a Branch</h2> | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 33 | <p>Some of the requirements for your build environment are determined by which | 
 | 34 | version of the source code you plan to compile. See | 
 | 35 | <a href="build-numbers.html">Build Numbers</a> for a full listing of branches you may | 
 | 36 | choose from. You may also choose to download and build the latest source code | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 37 | (called <code>master</code>), in which case you will simply omit the branch specification | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 38 | when you initialize the repository.</p> | 
 | 39 | <p>Once you have selected a branch, follow the appropriate instructions below to | 
 | 40 | set up your build environment.</p> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 41 | <h2 id="setting-up-a-linux-build-environment">Setting up a Linux build environment</h2> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 42 | <p>These instructions apply to all branches, including <code>master</code>.</p> | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 43 | <p>The Android build is routinely tested in house on recent versions of | 
| Clay Murphy | d95a71f | 2015-02-24 11:06:04 -0800 | [diff] [blame] | 44 | Ubuntu LTS (14.04), but most distributions should have the required | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 45 | build tools available. Reports of successes or failures on other | 
 | 46 | distributions are welcome.</p> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 47 | <p>For Gingerbread (2.3.x) and newer versions, including the <code>master</code> | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 48 | branch, a 64-bit environment is required. Older versions can be | 
 | 49 | compiled on 32-bit systems.</p> | 
| Bert McMeen | 3bb4b8f | 2015-05-06 17:21:27 -0700 | [diff] [blame] | 50 | <p class="note"><strong>Note:</strong> See the <a href="building.html">Downloading and | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 51 | Building</a> page for the list of hardware and software requirements. Then | 
 | 52 | follow the detailed instructions for Ubuntu and Mac OS below.</p> | 
| Conley Owens | 6c2621e | 2013-10-08 09:45:30 -0700 | [diff] [blame] | 53 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 54 | <h3 id="installing-the-jdk">Installing the JDK</h3> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 55 | <p>The <code>master</code> branch of Android in the <a | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 56 | href="https://android.googlesource.com/">Android Open Source Project (AOSP)</a> | 
 | 57 | requires Java 7. On Ubuntu, use <a href="http://openjdk.java.net/install/">OpenJDK</a>.</p> | 
 | 58 | <p>Java 7: For the latest version of Android</p> | 
 | 59 | <pre><code>$ sudo apt-get update | 
 | 60 | $ sudo apt-get install openjdk-7-jdk | 
 | 61 | </code></pre> | 
 | 62 |  | 
 | 63 | <p>Optionally, update the default Java version by running:</p> | 
 | 64 | <pre><code>$ sudo update-alternatives --config java | 
 | 65 | $ sudo update-alternatives --config javac | 
 | 66 | </code></pre> | 
 | 67 |  | 
| Clay Murphy | 019d914 | 2014-05-06 14:22:54 -0700 | [diff] [blame] | 68 | <p>If you encounter version errors for Java, set its | 
 | 69 | path as described in the <a href="building-running.html#wrong-java-version">Wrong | 
 | 70 | Java Version</a> section.</p> | 
 | 71 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 72 | <p>To develop older versions of Android, download and install the corresponding version of the <a | 
 | 73 | href="http://www.oracle.com/technetwork/java/javase/archive-139210.html">Java JDK</a>:<br/> | 
 | 74 | Java 6: for Gingerbread through KitKat<br/> | 
 | 75 | Java 5: for Cupcake through Froyo</p> | 
 | 76 |  | 
| Bert McMeen | 3bb4b8f | 2015-05-06 17:21:27 -0700 | [diff] [blame] | 77 | <p class="note"><strong>Note:</strong> The <code>lunch</code> command in the build step will ensure that the Sun JDK is | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 78 | used instead of any previously installed JDK.</p> | 
 | 79 |  | 
| Clay Murphy | d95a71f | 2015-02-24 11:06:04 -0800 | [diff] [blame] | 80 | <h3 id="installing-required-packages-ubuntu-1404">Installing required packages (Ubuntu 14.04)</h3> | 
 | 81 | <p>You will need a 64-bit version of Ubuntu. Ubuntu 14.04 is recommended.</p> | 
| Brian Carlstrom | 65c5ab4 | 2015-03-19 17:52:52 -0700 | [diff] [blame] | 82 | <pre><code>$ sudo apt-get install bison g++-multilib git gperf libxml2-utils make zlib1g-dev:i386 zip</code></pre> | 
| Clay Murphy | d95a71f | 2015-02-24 11:06:04 -0800 | [diff] [blame] | 83 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 84 | <h3 id="installing-required-packages-ubuntu-1204">Installing required packages (Ubuntu 12.04)</h3> | 
| Clay Murphy | d95a71f | 2015-02-24 11:06:04 -0800 | [diff] [blame] | 85 | <p>You may use Ubuntu 12.04 to build older versions of Android. Version 12.04 is not supported on master or recent releases.</p> | 
| Conley Owens | 6c2621e | 2013-10-08 09:45:30 -0700 | [diff] [blame] | 86 | <pre><code>$ sudo apt-get install git gnupg flex bison gperf build-essential \ | 
 | 87 |   zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ | 
 | 88 |   libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ | 
 | 89 |   libgl1-mesa-dev g++-multilib mingw32 tofrodos \ | 
 | 90 |   python-markdown libxml2-utils xsltproc zlib1g-dev:i386 | 
 | 91 | $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so | 
 | 92 | </code></pre> | 
 | 93 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 94 | <h3 id="installing-required-packages-ubuntu-1004-1110">Installing required packages (Ubuntu 10.04 -- 11.10)</h3> | 
| Conley Owens | 6c2621e | 2013-10-08 09:45:30 -0700 | [diff] [blame] | 95 | <p>Building on Ubuntu 10.04-11.10 is no longer supported, but may be useful for building older | 
 | 96 | releases of AOSP.</p> | 
| David Friedman | d530252 | 2015-01-12 15:20:52 -0800 | [diff] [blame] | 97 | <pre><code>$ sudo apt-get install git gnupg flex bison gperf build-essential \ | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 98 |   zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \ | 
 | 99 |   x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ | 
 | 100 |   libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ | 
 | 101 |   libxml2-utils xsltproc | 
 | 102 | </code></pre> | 
 | 103 | <p>On Ubuntu 10.10:</p> | 
 | 104 | <pre><code>$ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so | 
 | 105 | </code></pre> | 
 | 106 | <p>On Ubuntu 11.10:</p> | 
 | 107 | <pre><code>$ sudo apt-get install libx11-dev:i386 | 
 | 108 | </code></pre> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 109 | <h3 id="configuring-usb-access">Configuring USB Access</h3> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 110 | <p>Under GNU/Linux systems (and specifically under Ubuntu systems), | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 111 | regular users can't directly access USB devices by default. The | 
 | 112 | system needs to be configured to allow such access.</p> | 
 | 113 | <p>The recommended approach is to create a file | 
 | 114 | <code>/etc/udev/rules.d/51-android.rules</code> (as the root user) and to copy | 
 | 115 | the following lines in it. <code><username></code> must be replaced by the | 
 | 116 | actual username of the user who is authorized to access the phones | 
 | 117 | over USB.</p> | 
 | 118 | <pre><code># adb protocol on passion (Nexus One) | 
 | 119 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" | 
 | 120 | # fastboot protocol on passion (Nexus One) | 
 | 121 | SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" | 
 | 122 | # adb protocol on crespo/crespo4g (Nexus S) | 
 | 123 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" | 
 | 124 | # fastboot protocol on crespo/crespo4g (Nexus S) | 
 | 125 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" | 
 | 126 | # adb protocol on stingray/wingray (Xoom) | 
 | 127 | SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>" | 
 | 128 | # fastboot protocol on stingray/wingray (Xoom) | 
 | 129 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>" | 
 | 130 | # adb protocol on maguro/toro (Galaxy Nexus) | 
 | 131 | SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>" | 
 | 132 | # fastboot protocol on maguro/toro (Galaxy Nexus) | 
 | 133 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>" | 
 | 134 | # adb protocol on panda (PandaBoard) | 
 | 135 | SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>" | 
| Martin Storsjo | 62678bb | 2013-09-30 13:38:16 +0300 | [diff] [blame] | 136 | # adb protocol on panda (PandaBoard ES) | 
 | 137 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>" | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 138 | # fastboot protocol on panda (PandaBoard) | 
 | 139 | SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>" | 
 | 140 | # usbboot protocol on panda (PandaBoard) | 
 | 141 | SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>" | 
 | 142 | # usbboot protocol on panda (PandaBoard ES) | 
 | 143 | SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>" | 
 | 144 | # adb protocol on grouper/tilapia (Nexus 7) | 
 | 145 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>" | 
 | 146 | # fastboot protocol on grouper/tilapia (Nexus 7) | 
 | 147 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>" | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 148 | # adb protocol on manta (Nexus 10) | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 149 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>" | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 150 | # fastboot protocol on manta (Nexus 10) | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 151 | SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>" | 
 | 152 | </code></pre> | 
 | 153 | <p>Those new rules take effect the next time a device is plugged in. | 
 | 154 | It might therefore be necessary to unplug the device and plug it | 
 | 155 | back into the computer.</p> | 
 | 156 | <p>This is known to work on both Ubuntu Hardy Heron (8.04.x LTS) and | 
 | 157 | Lucid Lynx (10.04.x LTS). Other versions of Ubuntu or other | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 158 | variants of GNU/Linux might require different configurations.</p> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 159 | <h3 id="using-a-separate-output-directory">Using a separate output directory</h3> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 160 | <p>By default, the output of each build is stored in the <code>out/</code> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 161 | subdirectory of the matching source tree.</p> | 
 | 162 | <p>On some machines with multiple storage devices, builds are | 
 | 163 | faster when storing the source files and the output on | 
 | 164 | separate volumes. For additional performance, the output | 
 | 165 | can be stored on a filesystem optimized for speed instead | 
 | 166 | of crash robustness, since all files can be re-generated | 
 | 167 | in case of filesystem corruption.</p> | 
 | 168 | <p>To set this up, export the <code>OUT_DIR_COMMON_BASE</code> variable | 
 | 169 | to point to the location where your output directories | 
 | 170 | will be stored.</p> | 
 | 171 | <pre><code>export OUT_DIR_COMMON_BASE=<path-to-your-out-directory> | 
 | 172 | </code></pre> | 
 | 173 | <p>The output directory for each separate source tree will be | 
 | 174 | named after the directory holding the source tree.</p> | 
 | 175 | <p>For instance, if you have source trees as <code>/source/master1</code> | 
 | 176 | and <code>/source/master2</code> and <code>OUT_DIR_COMMON_BASE</code> is set to | 
 | 177 | <code>/output</code>, the output directories will be <code>/output/master1</code> | 
 | 178 | and <code>/output/master2</code>.</p> | 
 | 179 | <p>It's important in that case to not have multiple source | 
 | 180 | trees stored in directories that have the same name, | 
 | 181 | as those would end up sharing an output directory, with | 
 | 182 | unpredictable results.</p> | 
 | 183 | <p>This is only supported on Jelly Bean (4.1) and newer, | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 184 | including the <code>master</code> branch.</p> | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 185 | <h2 id="setting-up-a-mac-os-x-build-environment">Setting up a Mac OS build environment</h2> | 
 | 186 | <p>In a default installation, Mac OS runs on a case-preserving but case-insensitive | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 187 | filesystem. This type of filesystem is not supported by git and will cause some | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 188 | git commands (such as <code>git status</code>) to behave abnormally. Because of this, we | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 189 | recommend that you always work with the AOSP source files on a case-sensitive | 
 | 190 | filesystem. This can be done fairly easily using a disk image, discussed below.</p> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 191 | <p>Once the proper filesystem is available, building the <code>master</code> branch in a modern | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 192 | Mac OS environment is very straightforward. Earlier branches, including ICS, | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 193 | require some additional tools and SDKs.</p> | 
 | 194 | <h3 id="creating-a-case-sensitive-disk-image">Creating a case-sensitive disk image</h3> | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 195 | <p>You can create a case-sensitive filesystem within your existing Mac OS environment | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 196 | using a disk image. To create the image, launch Disk | 
 | 197 | Utility and select "New Image".  A size of 25GB is the minimum to | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 198 | complete the build; larger numbers are more future-proof. Using sparse images | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 199 | saves space while allowing to grow later as the need arises. Be sure to select | 
 | 200 | "case sensitive, journaled" as the volume format.</p> | 
 | 201 | <p>You can also create it from a shell with the following command:</p> | 
 | 202 | <pre><code># hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg | 
 | 203 | </code></pre> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 204 | <p>This will create a <code>.dmg</code> (or possibly a <code>.dmg.sparsefile</code>) file which, once mounted, acts as a drive with the required formatting for Android development.  | 
 | 205 | <p>If you need a larger volume later, you can also resize the sparse image with the following command:</p> | 
 | 206 | <pre><code># hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage | 
 | 207 | </code></pre> | 
 | 208 | For a disk image named <code>android.dmg</code> stored in your home directory, you can add helper functions to your <code>~/.bash_profile</code>: | 
 | 209 | <ul> | 
 | 210 | <li> | 
 | 211 | To mount the image when you execute <code>mountAndroid</code>:</p> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 212 | <pre><code># mount the android file image | 
 | 213 | function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; } | 
 | 214 | </code></pre> | 
| Bert McMeen | 3bb4b8f | 2015-05-06 17:21:27 -0700 | [diff] [blame] | 215 | <p class="note"><strong>Note:</strong> If your system created a <code>.dmg.sparsefile</code> file, replace <code>~/android.dmg</code> with <code>~/android.dmg.sparsefile</code>.</p> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 216 | </li> | 
 | 217 | <li> | 
 | 218 | <p>To unmount it when you execute <code>umountAndroid</code>:</p> | 
 | 219 | <pre><code># unmount the android file image | 
 | 220 | function umountAndroid() { hdiutil detach /Volumes/android; } | 
 | 221 | </code></pre> | 
 | 222 | </li> | 
 | 223 | </ul> | 
 | 224 | <p>Once you've mounted the <code>android</code> volume, you'll do all your work there. You can eject it (unmount it) just like you would with an external drive.</p> | 
| Clay Murphy | 82779c2 | 2014-12-09 10:46:19 -0800 | [diff] [blame] | 225 |  | 
 | 226 | <h3 id="installing-the-mac-jdk">Installing the JDK</h3> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 227 | <p>The <code>master</code> and <code>5.0.x</code> branches of Android in the <a | 
| Clay Murphy | 82779c2 | 2014-12-09 10:46:19 -0800 | [diff] [blame] | 228 | href="https://android.googlesource.com/">Android Open Source Project (AOSP)</a> | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 229 | require Java 7. On Mac OS, use <a | 
| Clay Murphy | cb789ba | 2015-02-02 11:11:24 -0800 | [diff] [blame] | 230 | href="https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR">jdk-7u71-macosx-x64.dmg</a>.</p> | 
| Clay Murphy | 82779c2 | 2014-12-09 10:46:19 -0800 | [diff] [blame] | 231 |  | 
 | 232 | <p>To develop for versions of Android Gingerbread through KitKat, download and | 
 | 233 | install the Java 6 version of the <a | 
 | 234 | href="http://support.apple.com/kb/dl1572">Java JDK</a>.</p> | 
 | 235 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 236 | <h3 id="master-branch">Master branch</h3> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 237 | <p>To build the latest source in a Mac OS environment, you will need an Intel/x86 | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 238 | machine running Mac OS X v10.8 (Mountain Lion) or later, along with Xcode | 
| Al Sutton | 656d092 | 2014-11-27 08:04:34 +0000 | [diff] [blame] | 239 | 4.5.2 or later including the Command Line Tools.</p> | 
 | 240 |  | 
| Al Sutton | 656d092 | 2014-11-27 08:04:34 +0000 | [diff] [blame] | 241 | <h3 id="branch-50x-and-all-earlier-branches">Branch 5.0.x and earlier branches</h3> | 
 | 242 | <p>To build 5.0.x and earlier source in a Mac OS environment, you will need an Intel/x86 | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 243 | machine running Mac OS X v10.8 (Mountain Lion), along with Xcode | 
| Al Sutton | 656d092 | 2014-11-27 08:04:34 +0000 | [diff] [blame] | 244 | 4.5.2 and Command Line Tools.</p> | 
 | 245 |  | 
| Al Sutton | 656d092 | 2014-11-27 08:04:34 +0000 | [diff] [blame] | 246 | <h3 id="branch-44x-and-all-earlier-branches">Branch 4.4.x and earlier branches</h3> | 
| Conley Owens | 6c2621e | 2013-10-08 09:45:30 -0700 | [diff] [blame] | 247 | <p>To build 4.2.x and earlier source in a Mac OS environment, you will need an Intel/x86 | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 248 | machine running Mac OS X v10.6 (Snow Leopard) or Mac OS X v10.7 (Lion), along with Xcode | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 249 | 4.2 (Apple's Developer Tools). Although Lion does not come with a JDK, it should | 
 | 250 | install automatically when you attempt to build the source.</p> | 
| Clay Murphy | 2de21e8 | 2014-12-15 16:42:47 -0800 | [diff] [blame] | 251 | <p>The remaining sections for Mac OS apply only to those who wish to build | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 252 | earlier branches.</p> | 
| Clay Murphy | 82779c2 | 2014-12-09 10:46:19 -0800 | [diff] [blame] | 253 |  | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 254 | <h3 id="branch-40x-and-all-earlier-branches">Branch 4.0.x and all earlier branches</h3> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 255 | <p>To build android-4.0.x and earlier branches in a Mac OS environment, you need an | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 256 | Intel/x86 machine running Mac OS X v10.5 (Leopard) or Mac OS X v10.6 (Snow Leopard). You | 
 | 257 | will need the Mac OS X v10.5 SDK.</p> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 258 | <h4 id="installing-required-packages">Installing required packages</h4> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 259 | <ul> | 
 | 260 | <li> | 
 | 261 | <p>Install Xcode from <a href="http://developer.apple.com/">the Apple developer site</a>. | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 262 | We recommend version 3.1.4 or newer (e.g., gcc 4.2). | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 263 | Version 4.x could cause difficulties. | 
 | 264 | If you are not already registered as an Apple developer, you will have to | 
 | 265 | create an Apple ID in order to download.</p> | 
 | 266 | </li> | 
 | 267 | <li> | 
 | 268 | <p>Install MacPorts from <a href="http://www.macports.org/install.php">macports.org</a>.</p> | 
| Bert McMeen | 3bb4b8f | 2015-05-06 17:21:27 -0700 | [diff] [blame] | 269 | <p class="note"><strong>Note:</strong> Make sure that <code>/opt/local/bin</code> appears in your path <strong>before</strong> <code>/usr/bin</code>. If not, please add the following to your <code>~/.bash_profile</code> file:</p> | 
 | 270 | <pre> | 
 | 271 | <code>export PATH=/opt/local/bin:$PATH</code> | 
 | 272 | </pre> | 
 | 273 | <p class="note"><strong>Note:</strong> If you do not have a <code>.bash_profile</code> file in your home directory, create one.</p> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 274 | </li> | 
 | 275 | <li> | 
 | 276 | <p>Get make, git, and GPG packages from MacPorts: </p> | 
| Clay Murphy | cb789ba | 2015-02-02 11:11:24 -0800 | [diff] [blame] | 277 | <pre><code>$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 278 | </code></pre> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 279 | <p>If using Mac OS X v10.4, also install bison:</p> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 280 | <pre><code>$ POSIXLY_CORRECT=1 sudo port install bison | 
 | 281 | </code></pre> | 
 | 282 | </li> | 
 | 283 | </ul> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 284 | <h4 id="reverting-from-make-382">Reverting from make 3.82</h4> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 285 | <p>For versions of Android before ICS, there is a bug in gmake 3.82 that prevents android from building.  You can install version 3.81 using MacPorts by taking the following steps:</p> | 
 | 286 | <ul> | 
 | 287 | <li> | 
 | 288 | <p>Edit <code>/opt/local/etc/macports/sources.conf</code> and add a line that says</p> | 
 | 289 | <pre><code>file:///Users/Shared/dports | 
 | 290 | </code></pre> | 
 | 291 | <p>above the rsync line.  Then create this directory: </p> | 
 | 292 | <pre><code>$ mkdir /Users/Shared/dports | 
 | 293 | </code></pre> | 
 | 294 | </li> | 
 | 295 | <li> | 
 | 296 | <p>In the new <code>dports</code> directory, run </p> | 
 | 297 | <pre><code>$ svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/ | 
 | 298 | </code></pre> | 
 | 299 | </li> | 
 | 300 | <li> | 
 | 301 | <p>Create a port index for your new local repository: </p> | 
 | 302 | <pre><code>$ portindex /Users/Shared/dports | 
 | 303 | </code></pre> | 
 | 304 | </li> | 
 | 305 | <li> | 
 | 306 | <p>Finally, install the old version of gmake with </p> | 
 | 307 | <pre><code>$ sudo port install gmake @3.81 | 
 | 308 | </code></pre> | 
 | 309 | </li> | 
 | 310 | </ul> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 311 | <h4 id="setting-a-file-descriptor-limit">Setting a file descriptor limit</h4> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 312 | <p>On Mac OS, the default limit on the number of simultaneous file descriptors open is too low and a highly parallel build process may exceed this limit.<br /> | 
| Robert Ly | 40e3b6d | 2013-04-17 18:12:10 -0700 | [diff] [blame] | 313 | </p> | 
| Robert Ly | 35f2fda | 2013-01-29 16:27:05 -0800 | [diff] [blame] | 314 | <p>To increase the cap, add the following lines to your <code>~/.bash_profile</code>: </p> | 
 | 315 | <pre><code># set the number of open files to be 1024 | 
 | 316 | ulimit -S -n 1024 | 
 | 317 | </code></pre> | 
| Collin El-Hossari | ba472e9 | 2015-02-03 16:44:00 -0800 | [diff] [blame] | 318 | <h2 id="optimizing-a-build-environment">Optimizing a build environment (optional)</h2> | 
 | 319 | <p><a name="ccache"></a></p> | 
 | 320 | <h3 id="setting-up-ccache">Setting up ccache</h3> | 
 | 321 | <p>You can optionally tell the build to use the ccache compilation tool. | 
 | 322 | Ccache acts as a compiler cache that can be used to speed up rebuilds. | 
 | 323 | This works very well if you use <code>make clean</code> often, or if you frequently | 
 | 324 | switch between different build products.</p> | 
 | 325 | <p>Put the following in your <code>.bashrc</code> (or equivalent):</p> | 
 | 326 | <pre><code>export USE_CCACHE=1 | 
 | 327 | </code></pre> | 
 | 328 | <p>By default the cache will be stored in <code>~/.ccache</code>. | 
 | 329 | If your home directory is on NFS or some other non-local filesystem, | 
 | 330 | you will want to specify the directory in your <code>.bashrc</code> file as well:</p> | 
 | 331 | <pre><code>export CCACHE_DIR=<path-to-your-cache-directory> | 
 | 332 | </code></pre> | 
 | 333 | <p>The suggested cache size is 50-100GB. | 
 | 334 | You will need to run the following command once you have downloaded | 
 | 335 | the source code:</p> | 
 | 336 | <pre><code>prebuilts/misc/linux-x86/ccache/ccache -M 50G | 
 | 337 | </code></pre> | 
 | 338 | <p>On Mac OS, you should replace <code>linux-x86</code> with <code>darwin-x86</code>:</p> | 
 | 339 | <pre><code>prebuilts/misc/darwin-x86/ccache/ccache -M 50G | 
 | 340 | </code></pre> | 
 | 341 | <p>When building Ice Cream Sandwich (4.0.x) or older, ccache is in | 
 | 342 | a different location:</p> | 
 | 343 | <pre><code>prebuilt/linux-x86/ccache/ccache -M 50G | 
 | 344 | </code></pre> | 
 | 345 | <p>This setting is stored in the CCACHE_DIR and is persistent.</p> | 
| Clay Murphy | 6d00f3b | 2014-03-26 17:39:24 -0700 | [diff] [blame] | 346 | <h2 id="next-download-the-source">Next: Download the source</h2> | 
 | 347 | <p>Your build environment is good to go! Proceed to <a href="downloading.html">downloading the source</a>.</p> |