1. 编译前准备
1.1 下载源码
git clone https://github.com/karfield/adb
1.2 编译环境准备
安装 automake 和libtool
sudo apt-get install automake sudo apt-get install libtool
2. 交叉编译 adbd
2.1 修改Makefile
- 修改顶层Makefile.am, 删除fastboot 和其他无关选项。
AUTOMAKE_OPTIONS = foreign SUBDIRS = libcutils src
- 修改src/Makefile.am
AUTOMAKE_OPTIONS = foreign INCLUDES = -I$(top_srcdir)/include bin_PROGRAMS = adbd if HOST_IS_LINUX source_deps = usb_linux_client.c libs_deps = -lrt endif #if HOST_IS_DARWIN # source_deps = usb_osx.c get_my_path_darwin.c # libs_deps = -framework CoreFoundation -framework IOKit -framework Carbon #endif adbd_SOURCES = adb.c backup_service.c transport.c transport_local.c transport_usb.c \ services.c file_sync_service.c utils.c jdwp_service.c framebuffer_service.c \ remount_service.c log_service.c fdevent.c sockets.c $(source_deps) adbd_CFLAGS = -O2 -g -Wall -Wno-unused-parameter \ ¦ -DADB_HOST=0 -D_XOPEN_SOURCE -D_GNU_SOURCE -DHAVE_FORKEXEC LIBS = -lpthread $(libs_deps) adbd_LDADD = $(top_srcdir)/libcutils/libcutils.a
adbd 需要编译的文件主要有以下:
adb.c
backup_service.c
transport.c
transport_local.c
transport_usb.c
services.c
file_sync_service.c
utils.c
jdwp_services.c
framebuffer_service.c
remount_service.c
log_service.c
fdevent.c
sockets.c
usb_linux_client.c
2.2 编译配置
配置工具链,安装路径。
rm out -rf mkdir out cp Makefile.adbd.am Makefile.am cd ./src cp Makefile.adbd.am Makefile.am cd - make distclean ./autogen.sh CFLAGS+=-muclibc ./configure --prefix=$HOME/work/github/mygit/adb/out --host=arm-linux-gnu make make install
2.3 错误解决
- 解决 undefined reference to rpl_malloc
修改config.h.in,注释掉这两项
#undef malloc #undef realloc
- 错误2
adb.c::main():Handling main() adb.c::adb_main():Local port disabled usb_linux_client.c::usb_init():failed to open /dev/android_adb_enable usb_linux_client.c::usb_init():[ usb_init - starting thread ] adb.c::adb_main():adb_main(): pre init_jdwp() jdwp_service.c::jdwp_control_init():jdwp control socket started (5) adb.c::adb_main():adb_main(): post init_jdwp() adb.c::adb_main():Event loop starting usb_linux_client.c::usb_open_thread():[ usb_thread - opening device ]
修改adb.c 权限
int adb_main(int is_daemon, int server_port) { ...... /* don't listen on a port (default 5037) if running in secure mode */ /* don't run as root if we are running in secure mode */ secure = 0; // 这里设为0 if (secure) { ...... } }
- 错误3
/system/bin/sh' failed: No such file or directory (2) -
修改SHELL_COMMAND 到正确路径。
这样交叉编译的adbd 就可以到板子里面运行了。
3. 编译adb
adb 一般在主机上编译,故不用交叉编译。
3.1 修改Makefile
- 顶层Makeile.am:去掉fastboot
UTOMAKE_OPTIONS = foreign SUBDIRS = libcutils libzipfile src
- src/Makefile.am
AUTOMAKE_OPTIONS = foreign INCLUDES = -I$(top_srcdir)/include bin_PROGRAMS = adb if HOST_IS_LINUX source_deps = usb_linux.c get_my_path_linux.c libs_deps = -lrt -lncurses endif if HOST_IS_DARWIN source_deps = usb_osx.c get_my_path_darwin.c libs_deps = -framework CoreFoundation -framework IOKit -framework Carbon endif adb_SOURCES = adb.c console.c transport.c transport_local.c transport_usb.c \ commandline.c adb_client.c services.c file_sync_client.c utils.c \ usb_vendors.c fdevent.c sockets.c $(source_deps) adb_CFLAGS = -O2 -g -Wall -Wno-unused-parameter \ ¦ -DADB_HOST=1 -D_XOPEN_SOURCE -D_GNU_SOURCE -DHAVE_FORKEXEC LIBS = -lpthread -lz $(libs_deps) adb_LDADD = $(top_srcdir)/libcutils/libcutils.a $(top_srcdir)/libzipfile/libzipfile.a
需要编译的主要文件:
adb.c
console.c
transport.c
transport_local.c
transport_usb.c
commandline.c
adb_client.c
services.c
file_sync_client.c
utils.c
usb_vendors.c
fdevent.c
sockets.c
usb_linux.c
get_my_path_linux.c
3.2 编译配置
m out -rf mkdir out ADB=$1 cd ./src cp Makefile.$ADB.am Makefile.am cd - make distclean ./autogen.sh ./configure --prefix=$HOME/work/github/mygit/adb/out make make install
主机端编译很简单,基本无错误。
如果对adb 源码比较感兴趣的朋友,可用深入阅读源码,并对其裁减做一些定制化需求。
总结
本文主要整理了一下,adb 和adbd 交叉过程遇到的问题,方便后续使用。有关adb 纯 C 源码,现基本不好找了。基于原作者的base code 修改了一份,支持adb/adbd 源码工程,方便大家后续交叉编译使用。
源码链接如下,需要自取。