通过Python 获取Android设备信息的轻量级框架


Posted in Python onDecember 18, 2017

今天跟大家分享一下,如何通过Python实现一个轻量级的库来获取电脑上连接的Android设备信息,为什么说轻量呢因为整个库也就4KB,相比其他诸如Appetizer这样动辄就8MB多的库要轻很多,而且也基本满足项目中的需求。

这个库只有一个文件,通过封装Android的ADB命令实现,返回的是一个包含所有设备信息的标准json格式的列表方便解析,下面简单介绍一下:

检查环境变量

# 判断是否设置环境变量ANDROID_HOME
if "ANDROID_HOME" in os.environ:
  command = os.path.join(
    os.environ["ANDROID_HOME"],
    "platform-tools",
    "adb")
else:
  raise EnvironmentError(
    "Adb not found in $ANDROID_HOME path: %s." %
    os.environ["ANDROID_HOME"])

命令执行

class Shell:
  def __init__(self):
    pass
  @staticmethod
  def invoke(cmd):
    output, errors = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
    o = output.decode("utf-8")
    return o

ADB命令封装

class ADB(object):
  """
   参数: device_id
  """
  def __init__(self, device_id=""):
    if device_id == "":
      self.device_id = ""
    else:
      self.device_id = "-s %s" % device_id
  def adb(self, args):
    cmd = "%s %s %s" % (command, self.device_id, str(args))
    return Shell.invoke(cmd)
  def shell(self, args):
    cmd = "%s %s shell %s" % (command, self.device_id, str(args),)
    return Shell.invoke(cmd)
  def get_device_state(self):
    """
    获取设备状态: offline | bootloader | device
    """
    return self.adb("get-state").stdout.read().strip()
  def get_device_id(self):
    """
    获取设备id号,return serialNo
    """
    return self.adb("get-serialno").stdout.read().strip()
  def get_android_version(self):
    """
    获取设备中的Android版本号,如4.2.2
    """
    return self.shell(
      "getprop ro.build.version.release").strip()
  def get_sdk_version(self):
    """
    获取设备SDK版本号,如:24
    """
    return self.shell("getprop ro.build.version.sdk").strip()
  def get_product_brand(self):
    """
    获取设备品牌,如:HUAWEI
    """
    return self.shell("getprop ro.product.brand").strip()
  def get_product_model(self):
    """
    获取设备型号,如:MHA-AL00
    """
    return self.shell("getprop ro.product.model").strip()
  def get_product_rom(self):
    """
    获取设备ROM名,如:MHA-AL00C00B213
    """
    return self.shell("getprop ro.build.display.id").strip()

设备信息获取

class DeviceInfo:
  def __init__(self, uid, os_type, os_version, sdk_version, brand, model, rom_version):
    self.uid = uid
    self.os_type = os_type
    self.os_version = os_version
    self.sdk_version = sdk_version
    self.brand = brand
    self.model = model
    self.rom_version = rom_version
class Device:
  def __init__(self):
    pass
  @staticmethod
  def get_android_devices():
    android_devices_list = []
    android_devices_infos = []
    for device in Shell.invoke('adb devices').splitlines():
      if 'device' in device and 'devices' not in device:
        device = device.split('\t')[0]
        android_devices_list.append(device)
    for device_uid in android_devices_list:
      device_info = DeviceInfo(device_uid, "Android", ADB(device_uid).get_android_version(),
                   ADB(device_uid).get_sdk_version(),
                   ADB(device_uid).get_product_brand(), ADB(device_uid).get_product_model(),
                   ADB(device_uid).get_product_rom())
      android_devices_infos.append(device_info.__dict__)
    return android_devices_infos

设备信息数据结构

[
  {
    "uid": "BY2WKN1519078327",
    "rom_version": "Che2-UL00 V100R001CHNC00B287",
    "brand": "Honor",
    "os_version": "4.4.2",
    "sdk_version": "19",
    "os_type": "Android",
    "model": "Che2-UL00"
  },
  {
    "uid": "GWY0217414001213",
    "rom_version": "MHA-AL00C00B213",
    "brand": "HUAWEI",
    "os_version": "7.0",
    "sdk_version": "24",
    "os_type": "Android",
    "model": "MHA-AL00"
  }
]

总结

以上所述是小编给大家介绍的通过Python 获取Android设备信息的轻量级框架,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
python实现简单tftp(基于udp协议)
Jul 30 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
python3中property使用方法详解
Apr 23 Python
基于python实现百度翻译功能
May 09 Python
python flask解析json数据不完整的解决方法
May 26 Python
python函数与方法的区别总结
Jun 23 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Python根据指定文件生成XML的方法
Jun 29 Python
Python中glob库实现文件名的匹配
Jun 18 Python
python中列表和元组的区别
Dec 18 #Python
Django REST为文件属性输出完整URL的方法
Dec 18 #Python
Python3计算三角形的面积代码
Dec 18 #Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 #Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 #Python
python中闭包Closure函数作为返回值的方法示例
Dec 17 #Python
django模板语法学习之include示例详解
Dec 17 #Python
You might like
回首过去10年中最搞笑的10部动漫,哪一部让你节操尽碎?
2020/03/03 日漫
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python中作用域的深入讲解
2018/12/10 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
比利时家具购买网站:Home24
2019/01/03 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
家长会邀请书
2014/01/25 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
自我评价优缺点范文
2015/03/11 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书