Adb编译一开始觉得挺难的,但是理顺了还是挺容易的,这里介绍一下自己的编译过程,尽量把我遇到的问题说的清楚一点。
首先官方adb的编译是在linux下完成,并没有提供直接可以在windows下编译的代码和工程文件,所以要想在windows下面编译需要对代码作一些等价调整,即把一些linux上的函数和代码在windows找一个替代的或是写一个同样功能的函数。
adb包含三个文件adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll,其中后两个非常容易编译:
源代码目录:
https://android.googlesource.com/?format=HTML
我是在Windows 7上编译的,从微软官网下载Windows 7 DDK,然源代码目录中都有一个BUILDME.txt文件,按照上面的说明敲一个命令就完成编译了。
头痛是编译adb,这个东西上面已经说了源码不能直接在Windows编译,需要做调整。先看一下我的代码目录按排:
其中adb目录存放adb源代码以及一些从其他目录拷由过来的.c文件和.h文件。包括
centraldir.c、zipfile.c、private.h:原来在system\core\libzipfile下面
list.c:原来在system\core\libcutils下面
然后工程目录的样子如下:
然后还依赖其的头文件和库文件,看include下面的安排:
其中cutils、mincrypt、zipfile直接从system\core\include下面拷贝过来。
openssl我是从官网(http://www.openssl.org/)上下载的,然后然后其中的包含头文件的openssl文件直接拷贝过来。
adb_api.h直接从..\development\host\windows\usb\api下面拷贝过来。
usb100.h直接从ddk目录下C:\WinDDK\7600.16385.1\inc\api下面都拷贝过来。
zlib.h和zconf.h也是直接从官网(http://www.zlib.net/)上下载的
win32_adb.h这个文件是我自己写的里面包含一些linux下特有宏定义,内容如下:
#ifndef _WIN32_ADB_H_
#define _WIN32_ADB_H_
#pragma warning(disable: 4996)
#define WIN32_LEAN_AND_MEAN
#define __inline__ _inline
#define snprintf _snprintf
#define PATH_MAX MAX_PATH
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned int mode_t;
/* Values for the second argument to access.
These may be OR'd together. */
#define R_OK 4 /* Test for read permission. */
#define W_OK 2 /* Test for write permission. */
#define X_OK 1 /* Test for execute permission. */
#define F_OK 0 /* Test for existence. */
#define __S_ISTYPE(mode, mask) (((mode) & _S_IFMT) == (mask))
#define S_ISDIR(mode) __S_ISTYPE((mode), _S_IFDIR)
#define S_ISCHR(mode) __S_ISTYPE((mode), _S_IFCHR)
#define S_ISBLK(mode) 0
#define S_ISREG(mode) __S_ISTYPE((mode), _S_IFREG)
#endif // _WIN32_ADB_H_
在lib目录内容如下:
其中AdbWinApi.lib和AdbWinUsbApi.lib是最开始通过DDK编译生成的,直接拷贝过来。
zdll.lib官网上在编译好的,直接下载拷贝过一就行了。
libeay32.lib和ssleay32.lib是openssl编译出来的。这个东西编译需要用到ActivePerl,具体如何编译网上一大堆说的,需要注意的是网上一般是说编译共享库,而这里是编译静态库,大概步骤如下:
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms\do_ms
在解压目录下执行ms\do_ms命令
6、nmake -f ms\nt.mak
然后libeay32.lib和ssleay32.lib会在out32目录下面,拷贝过来。
Bin目录把最开始编译的两个AdbWinApi.dll和AdbWinUsbApi.dll拷贝过来。
在工程中:
1、“C/C++ ->附加包含目录”中填上../include
2、“C/C++ ->预处理器 ->预处理器定义”填上ADB_HOST;HAVE_WIN32_IPC;HAVE_WIN32_PROC;HAVE_WINSOCK;
3、选中所有.cpp文件,然后右键属性,“C/C++ -> 预编译头 ->预编译头”,选择“不使用预编译头”
4、“链接器 ->常规 ->附加库目录”中填上../lib
5、“链接器 ->输入 ->附加依赖项”中填上ws2_32.lib;zdll.lib;libeay32.lib;ssleay32.lib;AdbWinApi.lib;
走到这里准备工作做好,下面是对源代码进行修改,这里没有办法每个细小的地方都说到,说一下要关注的点。
1、把上面工程目录中所有.c文件全部改为.cpp文件。因为C语言(要么就是VC有这个要求)要求变量全部在函数的一开始声明,而实际adb源代码中变量是在任意地方声明的,直接直接编译会产生大量的编译错误。
2、编译时产生winsock.h和winsock2.h里面的类型冲突,也会产生大量错误。这个问题是同时引入windows.h和winsock2.h的造成的,因为windows.h中引入winsock.h。解决这个问题只要在#include <windows.h>的前面定义#define WIN32_LEAN_AND_MEAN ,win32_adb.h已经包含这个宏,可以直接在#include <windows.h>的前面添加#include <win32_adb.h>解决。
#include <win32_adb.h>
#include <windows.h>
#include <winsock2.h>
3、源代码中一些头文件在windows下并不存在,直接注释掉如unistd.h、sys/time.h、inttypes.h
4、一些windows下不具备的函数自己写一个gettimeofday
int gettimeofday(structtimeval *tp,void *tzp)
{
time_t clock;
struct tm tm;
SYSTEMTIME wtm;
GetLocalTime(&wtm);
tm.tm_year =wtm.wYear - 1900;
tm.tm_mon =wtm.wMonth - 1;
tm.tm_mday =wtm.wDay;
tm.tm_hour =wtm.wHour;
tm.tm_min =wtm.wMinute;
tm.tm_sec =wtm.wSecond;
tm. tm_isdst = -1;
clock = mktime(&tm);
tp->tv_sec =clock;
tp->tv_usec =wtm.wMilliseconds * 1000;
return (0);
}
5、还有一些函数windows下面存在,需要把相关的头文件加上,这个VC助手可以自动帮你加上。不再说了。
6、还有就是在需要的地方包含前面自己写的win32_adb.h文件,解决一些宏未定义的问题。
差不多就是上面这些,可能还有一些问题,自己改改就行了。本文仅供参考,欢迎交流。
转自:http://blog.csdn.net/kevin3683/article/details/11251609