Windows下adb编译详解

Adb编译一开始觉得挺难的,但是理顺了还是挺容易的,这里介绍一下自己的编译过程,尽量把我遇到的问题说的清楚一点。

首先官方adb的编译是在linux下完成,并没有提供直接可以在windows下编译的代码和工程文件,所以要想在windows下面编译需要对代码作一些等价调整,即把一些linux上的函数和代码在windows找一个替代的或是写一个同样功能的函数。

adb包含三个文件adb.exeAdbWinApi.dllAdbWinUsbApi.dll,其中后两个非常容易编译:

源代码目录:

..\android_source\development\host\windows\usb\api

..\android_source\host\windows\usb\winusb

我是在Windows 7上编译的,从微软官网下载Windows 7 DDK,然源代码目录中都有一个BUILDME.txt文件,按照上面的说明敲一个命令就完成编译了。

 

头痛是编译adb,这个东西上面已经说了源码不能直接在Windows编译,需要做调整。先看一下我的代码目录按排:

 

其中adb目录存放adb源代码以及一些从其他目录拷由过来的.c文件和.h文件。包括

centraldir.czipfile.cprivate.h原来在system\core\libzipfile下面

list.c:原来在system\core\libcutils下面

然后工程目录的样子如下:

 

 

然后还依赖其的头文件和库文件,看include下面的安排:

其中cutilsmincryptzipfile直接从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.hzconf.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.libAdbWinUsbApi.lib是最开始通过DDK编译生成的,直接拷贝过来。

zdll.lib官网上在编译好的,直接下载拷贝过一就行了。

libeay32.libssleay32.libopenssl编译出来的。这个东西编译需要用到ActivePerl,具体如何编译网上一大堆说的,需要注意的是网上一般是说编译共享库,而这里是编译静态库,大概步骤如下:

1、安装ActivePerl//初始化的时候,需要用到perl解释器

2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)

3、解压缩openssl的包,进入openssl的目录

4perl configure VC-WIN32

尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。

5ms\do_ms

在解压目录下执行ms\do_ms命令

6nmake -f ms\nt.mak

然后libeay32.libssleay32.lib会在out32目录下面,拷贝过来。

 

Bin目录把最开始编译的两个AdbWinApi.dllAdbWinUsbApi.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.hwinsock2.h里面的类型冲突,也会产生大量错误。这个问题是同时引入windows.hwinsock2.h的造成的,因为windows.h中引入winsock.h。解决这个问题只要在#include 的前面定义#define WIN32_LEAN_AND_MEAN ,win32_adb.h已经包含这个宏,可以直接在#include 的前面添加#include 解决。

#include

#include

#include

 

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://download.csdn.net/detail/kevin3683/6885311


你可能感兴趣的:(Windows,Android)