本文共 7665 字,大约阅读时间需要 25 分钟。
ADB协议是Android开发者桥梁,常用于连接手机和电脑进行设备信息获取、应用安装等操作。本文将详细介绍如何利用ADB查看和获取手机设备信息。
通过ADB协议,我们可以轻松获取手机的品牌、型号、系统版本等详细信息。以下是一些常用的操作方法:
要查看手机的型号信息,可以使用以下命令:
adb shell getprop ro.product.model
运行该命令后,你会看到手机的型号信息。例如:
XB1082
此外,如果你想.getprop命令的字母参数失望,可以使用grep进行过滤。例如:
adb shell getprop | grep product
这样可以看到所有与“product”相关的系统属性,包括品牌、型号等信息。
手机的系统属性信息通常存储在/system/build.prop
文件中。我们可以通过以下命令查看这些属性:
adb shell cat /system/build.prop | grep product
这将显示与“product”相关的所有属性信息。
ADB devices命令可以帮助你查看设备的详细信息。要查看设备ID,使用以下命令:
adb devices
要查看设备的详细信息,可以使用:
adb devices -l
此时,你将看到一长串设备信息,包括设备ID、品牌、型号、系统版本等。
在实际开发中,直接调用ADB命令可能会存在一定的性能瓶颈。为了优化这一点,本文开发了一个基于socket与ADB服务通信的优化方案。这个方案通过直接与ADB服务进行socket通信,有效提升了传输速率。
以下是一个简化的socket通信实现代码示例(仅供参考):
#pragma once#include#include #include using namespace std;using namespace wstring;class AdbSocketHelper{public: AdbSocketHelper(); ~AdbSocketHelper(); string getDevices(); string getAdbVersion(); string adbShell(const string& shellCmd, const string& deviceSN); void setAdbPathAndPort(const wstring& wcspath, int server_port); 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);private: string m_wcspath; int m_serverport; static bool iniSocketLib;};
#include "AdbSocketHelper.h"#pragma comment(lib, "ws2_32.lib")bool AdbSocketHelper::iniSocketLib = false;#define MAX_BUF 1024*4+1AdbSocketHelper::AdbSocketHelper(){ m_serverport = 5037; m_wcspath = L"E:\\work\\adb\\LibAdb\\Debug\\LibAdb.exe";}AdbSocketHelper::~AdbSocketHelper(){ }void AdbSocketHelper::setAdbPathAndPort(const wstring& wcspath, int server_port){ m_wcspath = wcspath; m_serverport = server_port;}string AdbSocketHelper::getAdbVersion(){ return executeAdb("host:version");}string AdbSocketHelper::getDevices(){ return executeAdb("host:devices");}string AdbSocketHelper::adbShell(const string& shellCmd, const string& deviceSN){ if (deviceSN.empty()) { return executeDeviceAdb("shell:" + shellCmd, "-any"); } else { return executeDeviceAdb("shell:" + shellCmd, ":" + deviceSN); }}string AdbSocketHelper::executeAdb(const string& cmd){ SOCKET clientSocket = INVALID_SOCKET; if (createAdbSocket(clientSocket)) { executeSocket(clientSocket, cmd, true, retStr); closesocket(clientSocket); } return retStr;}string AdbSocketHelper::executeDeviceAdb(const string& cmd, const string& deviceSN){ if (createAdbSocket(clientSocket)) { string transportCmd = "host:transport" + deviceSN; executeSocket(clientSocket, transportCmd, false, retStr); executeSocket(clientSocket, cmd, true, retStr); closesocket(clientSocket); } return retStr;}bool AdbSocketHelper::createAdbSocket(SOCKET& socket, string& strError){ socket = socketClient(); if (socket == INVALID_SOCKET) { if (launch_server()) { return true; } else { strError = "Error:launch server fail."; return false; } } return true;}bool AdbSocketHelper::executeSocket(const SOCKET& socket, const string& cmd, bool recvLoop, string& strdata){ if (sendSocketData(socket, cmd)) { if (recvLoop) { return recvSocketDataLoop(socket, strdata); } else { return recvSocketDataOnce(socket, strdata); } } return false;}bool AdbSocketHelper::sendSocketData(const SOCKET& socket, const string& strdata){ char tmpCharLen[5] = {0}; _snprintf_s(tmpCharLen, sizeof(tmpCharLen), 4, "%04x", strdata.length()); string realData(tmpCharLen); realData += strdata; return send(socket, realData.c_str(), realData.length(), 0) != SOCKET_ERROR;}bool AdbSocketHelper::recvSocketDataOnce(const SOCKET& socket, string& strdata){ char* buf = new char[MAX_BUF+1]; ZeroMemory(buf, MAX_BUF+1); int retVal = recv(socket, buf, MAX_BUF, 0); if (SOCKET_ERROR == retVal) { printf("recvSocketData recv error %d\n", WSAGetLastError()); return false; } else if (retVal == 0) { delete[] buf; return false; } else { if (memcmp(buf, "OKAY", 4)) { strdata.append(buf); } else { return false; } } delete[] buf; return true;}bool AdbSocketHelper::recvSocketDataLoop(const SOCKET& socket, string& strdata){ strdata.clear(); char* buf = new char[MAX_BUF+1]; bool isFist = true; while(1) { ZeroMemory(buf, MAX_BUF+1); int retVal = recv(socket, buf, MAX_BUF, 0); if (SOCKET_ERROR == retVal) { printf("recvSocketData recv error %d\n", WSAGetLastError()); return false; } else if (retVal == 0) { delete[] buf; return false; } else { if (isFist) { isFist = false; if (memcmp(buf, "OKAY", 4)) { char tmp[5] = {0}; memcpy(tmp, buf+4, 4); int dataLen = strtol(tmp, NULL, 16); } else { return false; } } strdata.append(buf); } } delete[] buf; if (DataLen != strdata.length()) { printf("recvSocketData data length is error \n"); } return true;}SOCKET AdbSocketHelper::socketClient(){ if (!iniSocketLib) { WORD wVersionRequested = MAKEWORD(2,2); WSAStartup(wVersionRequested, &wsaData); if (WSAGetLastError() != 0) { return INVALID_SOCKET; } iniSocketLib = true; } if ((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket() failed with error %d\n", WSAGetLastError()); return INVALID_SOCKET; } SOCKADDR_IN InternetAddr; memset(&InternetAddr, sizeof(InternetAddr), 0); InternetAddr.sin_family = AF_INET; InternetAddr.sin_port = htons(m_serverport); InternetAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); int retVal = connect(clientSocket, (LPSOCKADDR)&InternetAddr, sizeof(InternetAddr)); if (SOCKET_ERROR == retVal) { printf("connect() socket failed with error %d\n", WSAGetLastError()); closesocket(clientSocket); clientSocket = INVALID_SOCKET; } return clientSocket;}int AdbSocketHelper::launch_server(){ ...(此处为socket通信的服务器启动代码)}
AdbSocketHelper
类实现了与ADB服务的socket通信。socketClient
方法初始化socket库并创建TCP连接。launch_server
方法启动ADB服务器。executeAdb
方法执行ADB命令。executeDeviceAdb
方法同时建立设备连接并执行命令。recvSocketDataOnce
和recvSocketDataLoop
分别处理一次收数据和循环接收数据。将上述类添加到工程中,更新相关路径和端口号即可使用。如果需要添加其他ADB命令,需要参考ADB源码进行完善。
AdbSocketHelper adbHelper;adbHelper.setAdbPathAndPort(L"E:\\work\\adb\\LibAdb\\Debug\\Adb.exe", 5037);string strRet;strRet = adbHelper.getAdbVersion(); // 获取ADB版本printf("ADB版本: %s\n", strRet.c_str());strRet = adbHelper.getDevices(); // 获取设备列表printf("设备列表:\n%s\n", strRet.c_str());strRet = adbHelper.adbShell("dumpsys iphonesubinfo", ""); // 获取iPhone订阅信息printf("iPhone订阅信息:\n%s\n", strRet.c_str());
通过以上方法,你可以轻松获取手机的详细设备信息,进行开发和调试。
转载地址:http://giedz.baihongyu.com/