1.问题
遇到一个比较苛刻的客户,测试程序adb push到开发板时间格式不一样,这都要算软件bug。
没办法,只能想办法解决。
后续在其他平台验证不会出现时间格式不一致的问题,所以把目标锁定在adbd版本的问题。于是打算重新移植个最新版本的adbd。
后面发现根本原因是设备的系统时间小于adb push文件的属性时间,由于没有联网校时导致的,因此只会显示年份。
不过还是把移植的过程记录下来。
2.过程
2.1 失败
参考交叉编译arm Linux环境下的android-tools-adb_u011281197的博客-CSDN博客_android-tools-adb
这篇文章,不过看内容描述又是移植openssl又是zlib的,把问题搞得复杂化了。
而且这个版本的源码包里面依赖的好多库,对交叉编译来说太麻烦了。
android-properties这个库都不知道在哪移植,索性放弃这个版本。
2.2 成功
我使用Ubuntu14.04,arm-oe-linux-gnueabi-gcc交叉编译器进行测试。之前没注意arm-oe-linux-gnueabi-gcc编译器已经包含zlib库和crypto库,难怪我觉得奇怪,我只编译gcc版本进行测试居然也可以链接成功。
后续改为海思编译器进行测试验证,arm-hisiv100nptl-linux-gcc。
成功移植的源码、zlib与openssl源码我都已提交的码云上android-tools相关源码
其中adb与adbd目录下的makefile我已经修改,后续直接修改CC编译器就可以直接make
需要安装zlib和openssl。
2.2.1 交叉编译zlib
1.tar zxvf zlib-1.2.11.tar.gz
2.cd zlib-1.2.11
3. CC=arm-hisiv100nptl-linux-gcc ./configure --prefix=/home/workspace/build/zlib
4.make -j8
5.make install
2.2.2 交叉编译openssl
1.tar zxvf openssl-1.0.0e.tar.gz
2.cd openssl-1.0.0e/
3. ./Configure shared os/compiler:arm-hisiv100nptl-linux-gcc --prefix=/home/workspace/build/openssl
意思默认是不支持编译编译动态库,没啥影响。
【如果有遇到编译异常,把shared选项去除。】
4.make -j8
5.make install
如果出现:
解决办法:
rm -f /usr/bin/pod2man
2.2.3 编译测试
对比下上个版本adbd的makefile
所依赖的库少很多,减少很多移植难度。
github上提交的源码已经按照操作流程拷贝了.mk文件,后续只要修改对应目录的Makefile即可。
操作流程:
- 将android-tools-4.2.2/debian/makefiles中相应的.mk文件拷贝到android-tools-4.2.2/core/对应的目录,例如adb,只需将adb.mk拷贝到adb目录并将adb.mk修改为Makefile。
- 添加编译器,链接的头文件与.c文件路径记得修改一下。
- make
对应的makefile稍微做了修改:
# Makefile for adb; from https://heiher.info/2227.html
# CC:=arm-oe-linux-gnueabi-gcc
CC:=arm-hisiv100nptl-linux-gcc
VPATH+= ./
SRCS+= adb.c
SRCS+= adb_client.c
SRCS+= adb_auth_host.c
SRCS+= commandline.c
SRCS+= console.c
SRCS+= file_sync_client.c
SRCS+= fdevent.c
SRCS+= get_my_path_linux.c
SRCS+= services.c
SRCS+= sockets.c
SRCS+= transport.c
SRCS+= transport_local.c
SRCS+= transport_usb.c
SRCS+= usb_linux.c
SRCS+= usb_vendors.c
SRCS+= utils.c
VPATH+= ../libcutils
SRCS+= abort_socket.c
SRCS+= socket_inaddr_any_server.c
SRCS+= socket_local_client.c
SRCS+= socket_local_server.c
SRCS+= socket_loopback_client.c
SRCS+= socket_loopback_server.c
SRCS+= socket_network_client.c
SRCS+= list.c
SRCS+= load_file.c
VPATH+= ../libzipfile
SRCS+= centraldir.c
SRCS+= zipfile.c
CPPFLAGS+= -DADB_HOST=1
CPPFLAGS+= -DHAVE_FORKEXEC=1
CPPFLAGS+= -DHAVE_SYMLINKS
CPPFLAGS+= -DHAVE_TERMIO_H
CPPFLAGS+= -I./
CPPFLAGS+= -I../include
# zlib openssl 头文件与库搜索路径,根据你实际编译安装的路径为准。
CPPFLAGS+= -I/home/workspace/build/openssl/include
CPPFLAGS+= -I/home/workspace/build/zlib/include
LDFLAGS+= -L/home/workspace/build/zlib/lib
LDFLAGS+= -L/home/workspace/build/openssl/lib
LIBS+= -lc -lpthread -lz -lcrypto
OBJS= $(SRCS:.c=.o)
all: adb
adb: $(OBJS)
$(CC) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)
clean:
rm -rf $(OBJS) adb
编译成功。
将交叉编译的zlib与openssl的库拷贝到设备的/usr/lib,或者在设备端设置环境变量export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/flash/arm_soft/zlib/lib
/mnt/flash/arm_soft/zlib/lib为你动态库实际想要放置设备的路径。
adb push到开发板试试看。