博客
关于我
adb查看手机设备型号、品牌、机型等信息,利用socket直接与adb的pc service通讯
阅读量:478 次
发布时间:2019-03-07

本文共 7665 字,大约阅读时间需要 25 分钟。

ADB协议是Android开发者桥梁,常用于连接手机和电脑进行设备信息获取、应用安装等操作。本文将详细介绍如何利用ADB查看和获取手机设备信息。

通过ADB协议,我们可以轻松获取手机的品牌、型号、系统版本等详细信息。以下是一些常用的操作方法:

1.查看设备型号

要查看手机的型号信息,可以使用以下命令:

adb shell getprop ro.product.model

运行该命令后,你会看到手机的型号信息。例如:

XB1082

此外,如果你想.getprop命令的字母参数失望,可以使用grep进行过滤。例如:

adb shell getprop | grep product

这样可以看到所有与“product”相关的系统属性,包括品牌、型号等信息。

2.获取系统属性信息

手机的系统属性信息通常存储在/system/build.prop文件中。我们可以通过以下命令查看这些属性:

adb shell cat /system/build.prop | grep product

这将显示与“product”相关的所有属性信息。

3.查看设备详情

ADB devices命令可以帮助你查看设备的详细信息。要查看设备ID,使用以下命令:

adb devices

要查看设备的详细信息,可以使用:

adb devices -l

此时,你将看到一长串设备信息,包括设备ID、品牌、型号、系统版本等。

关于ADB通信优化

在实际开发中,直接调用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方法同时建立设备连接并执行命令。
  • recvSocketDataOncerecvSocketDataLoop分别处理一次收数据和循环接收数据。
  • 编译与使用

    将上述类添加到工程中,更新相关路径和端口号即可使用。如果需要添加其他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/

    你可能感兴趣的文章
    Python 简明教程 --- 20,Python 类中的属性与方法
    查看>>
    稀疏数组
    查看>>
    83. Remove Duplicates from Sorted List
    查看>>
    痞子衡嵌入式:串口调试工具pzh-com诞生记(2)- 界面构建(wxFormBuilder3.8.0)
    查看>>
    Nmap扫描工具介绍
    查看>>
    常用Windows 快捷键
    查看>>
    linux命令-压缩与打包
    查看>>
    Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)
    查看>>
    oracle 11g not in 与not exists 那个高效?
    查看>>
    玩玩小爬虫——试搭小架构
    查看>>
    Javascript之旅——第九站:吐槽function
    查看>>
    Sql Server之旅——第十站 看看DML操作对索引的影响
    查看>>
    双十一来了,别让你的mongodb宕机了
    查看>>
    深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
    查看>>
    Python大神编程常用4大工具,你用过几个?
    查看>>
    一文带你了解图神经网络
    查看>>
    linux kernel version magic 不一致导致的模块 加载 (insmod) 不上
    查看>>
    centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
    查看>>
    MySQL 1064 You have an error in your SQL syntax 错误解决办法
    查看>>
    【Flink】Flink 底层RPC框架分析
    查看>>