编译linux adb,Android源码编译之ADB编译

How to build adb, the Android debugger

adbis the Android debugger (officially the “Android debug bridge” I think). It is a tool for getting shell access to an Android phone across a USB connection. It can also be used to copy files to and from the Android device and do port-forwarding. In short, it is similar to ssh, but isnotssh. (Why couldn’t they have just used ssh?)

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 amonolithic build systemwhich wants to download along list of Git repositoriesand build everything. If youfollow 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 hasa 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 java

and

# Check for the correct version of javac

Since 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 image

I 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/adb

If 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 device

So 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/.git

It 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值