adb 和 adbd 嵌入式 c 源码分享

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: adb 和 adbd 嵌入式 c 源码分享

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 源码工程,方便大家后续交叉编译使用。


源码链接如下,需要自取。


https://github.com/Vinson-001/adb.git

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
5月前
|
安全 Java Shell
Android13 adb input 调试命令使用和源码解析
Android13 adb input 调试命令使用和源码解析
577 0
|
Java Shell Android开发
【android-tips】android程序执行adb shell命令(实例源码)
(转载请注明出处:http://blog.csdn.net/buptgshengod) package net.gimite.nativeexe; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;
1368 0
|
5月前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
421 1
|
5月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
140 0
|
开发工具 Android开发
Mac 安卓(Android) 配置adb路径
Mac 安卓(Android) 配置adb路径
737 0
|
2月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
52 0
|
5月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
295 5
|
4月前
|
Shell 开发工具 Android开发
|
5月前
|
Java Android开发
Android 对adb命令的拦截
Android 对adb命令的拦截
69 2
|
5月前
|
存储 安全 Shell
Android系统 adb shell auth授权使用
Android系统 adb shell auth授权使用
325 2

热门文章

最新文章

下一篇
无影云桌面