您的位置:首页 > 其它

Windows下adb编译详解

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

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

adb包含三个文件adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll,其中后两个非常容易编译:

源代码目录:
https://android.googlesource.com/?format=HTML
platform/development

platform/system/core

我是在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: