I have not been able to find any Debian/Ubuntu packages for adb. The reason why it has not been packaged becomes apparent if you try to build the thing. Android has a monolithic build system which wants to download a long list of Git repositories and build everything. If you follow the instructions, it will download 1.1Gb from Git and leave you with a source+build directory of 6Gb. It isn't really designed for building subsets of components, unlike, say, JHBuild. It's basically a huge makefile. It doesn't know about dependencies between components. However, it does have some idea about dependencies between output files.
Based on a build-of-all-Android, I figured out how to build a much smaller subset containing adb. This downloads a more manageable 11Mb and finishes with a source+build directory containing 40Mb. This is also preferable to downloading the pre-built Android SDK, which has a non-free licence.
Instructions:
$ sudo apt-get install build-essential libncurses5-dev $ git clone git://android.git.kernel.org/platform/system/core.git system/core $ git clone git://android.git.kernel.org/platform/build.git build $ git clone git://android.git.kernel.org/platform/external/zlib.git external/zlib $ git clone git://android.git.kernel.org/platform/bionic.git bionic $ echo "include build/core/main.mk" >Makefile
Now edit build/core/main.mk and comment out the parts labelled
# Check for the correct version of javaand
# Check for the correct version of javacSince adb doesn't need Java, these checks are unnecessary.
Also edit build/target/product/sdk.mk and comment out the "include" lines after
# include available languages for TTS in the system imageI don't know exactly what this is about but it avoids having to download language files that aren't needed for adb. Then building the adb target should work:
make out/host/linux-x86/bin/adbIf you try running "adb shell" you might get this:
ubuntu$ ./out/host/linux-x86/bin/adb shell * daemon not running. starting it now * * daemon started successfully * error: insufficient permissions for deviceSo you probably need to do "adb start-server" as root first:
ubuntu$ sudo ./out/host/linux-x86/bin/adb kill-server ubuntu$ sudo ./out/host/linux-x86/bin/adb start-server * daemon not running. starting it now * * daemon started successfully * ubuntu$ ./out/host/linux-x86/bin/adb shell $For the record, here are the errors I got that motivated each step:
-
make: *** No rule to make target `external/svox/pico/lang/PicoLangItItInSystem.mk'. Stop.
- hence commenting out the picolang includes. -
system/core/libzipfile/zipfile.c:6:18: error: zlib.h: No such file or directory
- I'm guessing adb needs libzipfile which needs zlib. -
system/core/libcutils/mspace.c:59:50: error: ../../../bionic/libc/bionic/dlmalloc.c: No such file or directory
- This is why we need to download bionic (the C library used on Android), even though we aren't building any code to run on an Android device. This is the ugliest part and it illustrates why this is not a modular build system. The code does#include "../../../bionic/libc/bionic/dlmalloc.c"
to #include a file from another module. It seems any part of the build can refer to any other part, via relative pathnames, so the modules cannot be build separately. I don't know whether this is an isolated case, but it makes it difficult to put adb into a Debian package. -
host Executable: adb (out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb) /usr/bin/ld: cannot find -lncurses
- hence the ncurses-dev dependency above. However, this error is a little odd because if adb really depended on ncurses, it would fail when it tried to #include a header file. Linking with "-lncurses" is probably superfluous.
The instructions above will probably stop working as new versions are pushed to the public Git branches. (However, this happens infrequently because Android development is not done in the open.) For reproducibility, here are the Git commit IDs:
$ find -name "*.git" -exec sh -c 'echo "`git --git-dir={} rev-parse HEAD` {}"' ';' 91a54c11cbfbe3adc1df2f523c75ad76affb0ae9 ./system/core/.git 95604529ec25fe7923ba88312c590f38aa5e3d9e ./bionic/.git 890bf930c34d855a6fbb4d09463c1541e90381d0 ./external/zlib/.git b7c844e7cf05b4cea629178bfa793321391d21de ./build/.gitIt looks like the current version is Android 1.6 (Donut):
$ find -name "*.git" -exec sh -c 'echo "`git --git-dir={} describe` {}"' ';' android-1.6_r1-80-g91a54c1 ./system/core/.git android-1.6_r1-43-g9560452 ./bionic/.git android-1.6_r1-7-g890bf93 ./external/zlib/.git android-sdk-1.6-docs_r1-65-gb7c844e ./build/.git