Building Android on Arch Linux x86_64

Posted on Sat, 2012-10-13 in android

So it turns out building Android on Arch isn't quite that straight forward, but it is not impossible. There are some guides out there, but none of them is really complete. So here are my steps to get the building started.

First of all you need to enable multilib, if you haven't already [1]. Also you will have to get some stuff from AUR [2]. I use the yaourt wrapper to install AUR packages.

Obviously you should have the android-sdk stuff installed. Also take a look at the relevant page in the archlinux wiki [3].

yaourt -S android-sdk android-sdk-platform-tools android-udev repo

Get the following packages:

yaourt -S git gnupg flex bison gperf sdl wxgtk squashfs-tools zip curl ncurses zlib schedtool zip unzip

And some other packages from multilib:

yaourt -S lib32-zlib lib32-ncurses lib32-readline gcc-libs-multilib gcc-multilib lib32-gcc-libs

I found one guide [5], which suggests downgrading perl, git and make to match the versions suggested by Google/shipped with Ubuntu. This is not required. Latest git and make from arch repositories work just fine. But you have to install the perl-switch packages to get back the switch statement in perl, which is used in some scripts:

yaourt -S perl-switch

The next step is to get java. You can try to build android with openjdk6 or use the Oracle JDK. The openjdk6 package in arch repository unfortunately conflicts with jdk7-openjdk. So if you want to keep Java 7, you can install Oracle Java 6 from AUR:

yaourt -S jre6-compat jdk6-compat

To use the installed jdk6 you can use a script that is provided with the packages: "/opt/sun-java6/" Update: I just noticed that this isn't provided (anymore). You need to do this manually.

Now you have everything installed for building Android.

The next problem you will encounter is that the Android build tools require that /usr/bin/python symlinks to python version 2.X. Most guides suggest changing the symlink for building android and then changing it back [3] [5]. I think this is dangerous, because it could seriously break other stuff. So I wouldn't do this if it is a daily used system. Instead I created a directory with a symlink to python2 and put this directory in $PATH, before the regular $PATH.

mkdir /opt/android-build
cd /opt/android-build
ln -s `which python2` python
export PATH="/opt/android-build:$PATH"

So now it's like we have python2 installed

$ python -V
Python 2.7.3

Finally I wrote a special bash .profile file for building Android:

android-build-env () {
    echo "Setting up \$PATH"
    # Android tools
    export PATH="/opt/android-sdk/tools:/opt/android-sdk/platform-tools:/opt/android-build:$PATH"

    # Java6
    export J2SDKDIR=/opt/java6
    export PATH=/opt/java6/bin:/opt/java6/db/bin:$PATH
    export JAVA_HOME=/opt/java6
    export DERBY_HOME=/opt/java6/db

    # CCACHE
    export USE_CCACHE=1

    echo "Changing directory"
    if [ "$1" == "cm" ]; then
        cd $CMSRCDIR
        export PATH="$CMSRCDIR/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/:$PATH"
        cd $AOSPSRCDIR
        export PATH="$AOSPSRCDIR/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/:$PATH"

    export ARCH=arm
    export SUBARCH=arm
    export CROSS_COMPILE=arm-eabi-

    echo "Including android build source"
    export CCACHE_DIR=./.ccache
    # hmmm not enough space :( for such a big cache... let's leave default
    #./prebuilts/misc/linux-x86/ccache/ccache -M 50G
    . build/

    # reading for building androids
    if [ "$1" == "cm" ]; then
        echo "### CM10 Build Environment ###"
        echo "### AOSP Build Environment ###"

I hope I didn't forget anything here. Please tell me if there's something missing.


[3](1, 2)
[5](1, 2)