通过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 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
Python批量转换文件编码格式
May 17 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
python一键升级所有pip package的方法
Jan 16 Python
Python面向对象编程基础解析(二)
Oct 26 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
pytorch实现MNIST手写体识别
Feb 14 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 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
php实现上传图片生成缩略图示例
2014/04/13 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
thinkphp诸多限制条件下如何getshell详解
2020/12/09 PHP
javascript编程起步(第二课)
2007/02/27 Javascript
JavaScript 解析读取XML文档 实例代码
2009/07/07 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
详细分析JavaScript函数定义
2015/07/16 Javascript
jquery实现的用户注册表单提示操作效果代码分享
2015/08/28 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
初学Python实用技巧两则
2014/08/29 Python
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
群众路线自查自纠工作情况报告
2014/10/28 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
交通事故代理词范文
2015/05/23 职场文书
地球上的星星观后感
2015/06/02 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
JavaScript组合继承详解
2021/11/07 Javascript