通过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入门篇之列表和元组
Oct 17 Python
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
centos6.4下python3.6.1安装教程
Jul 21 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
Python中的默认参数实例分析
Jan 29 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
基于python检查矩阵计算结果
May 21 Python
运行Python编写的程序方法实例
Oct 21 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 session应用实例 登录验证
2009/03/16 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
利用Vue实现移动端图片轮播组件的方法实例
2017/08/23 Javascript
Angular4.x Event (DOM事件和自定义事件详解)
2018/10/09 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
Vuex 模块化使用详解
2019/07/31 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
通过C++学习Python
2015/01/20 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
技校生自我鉴定范文
2013/09/26 职场文书
教师演讲稿范文
2014/01/08 职场文书
社团活动总结模板
2014/06/30 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
政工师工作总结2015
2015/05/26 职场文书
外出培训学习心得体会
2016/01/18 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电