平常我们使用命令行调用adb去获取信息或者是与手机通讯,了解过adb源码的都清除,在pc端的adb是有adb client和adb service两部分的,正常我们调用的都是adb的client,adb client自己内部会去查询adb service是否已经启动,如果没有就会去启动adb service,再利用socket去通讯,正常我们在代码里面需要利用管道去获取cmd里面adb返回的结果。
本文就是在我们自己的代码里面直接利用socket与adb service通讯,绕过执行cmd和利用管道获取数据,这种方式在速度上面会快很多,基本原理就是参考adb的源码 把socket与adb service相关的代码移植到自己的工程里面,下面就是一个demo代码,真正移植到项目还需要修改。
(由于在公司有加密软件的原因,源代码只能以文本方式一部分一部分拷贝到博客,所有下面的布局会不清晰)
AdbSocketHelper.h
#pragma once
#include <Winsock2.h>//这个需要放在 windows.h前面
#include <string>
#include <vector>
using std::string;
using std::wstring;
class AdbSocketHelper
{
public:
AdbSocketHelper(void);
~AdbSocketHelper(void);
string getDevices();
string getAdbVersion();
string adbShell(const string shellCmd,const string deviceSN);
void setAdbPathAndPort(wstring wcspath,int server_port);
private:
string executeAdb(const string cmd);
string executeDeviceAdb(const string cmd,const string deviceSN);
bool createAdbSocket(SOCKET &Socket,string &strError);
int launch_server();
SOCKET socketClient();
bool executeSocket(const SOCKET Socket,const string cmd,bool recvLoop,string &strdata);
bool sendSocketData(const SOCKET Socket,const string strdata);
bool recvSocketDataOnce(const SOCKET Socket,string &strdata);
bool recvSocketDataLoop(const SOCKET Socket,string &strdata);
int m_serverport;
wstring m_wcspath;
static bool iniSocketLib;
};
下面是AdbSocketHelper.cpp文件
#include "AdbSocketHelper.h"
#pragma comment(lib,"ws2_32.lib")
bool AdbSocketHelper::iniSocketLib = false;
#define MAX_BUF 1024*4+1
AdbSocketHelper::AdbSocketHelper(void)
{
//test 的默认值设置
m_serverport = 6037;
m_wcspath = L"E:\\work\\adb\\LibAdb\\Debug\\LibAdb.exe";
}
AdbSocketHelper::~AdbSocketHelper(void)
{
}
void AdbSocketHelper::setAdbPathAndPort(wstring wcspath,int server_port)
{
m_wcspath = wcspath;
m_serverport = server_port;
}
string AdbSocketHelper::getAdbVersion()
{
string retStr = executeAdb("host:version