通过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的Flask框架与数据库连接的教程
Apr 20 Python
Python利用operator模块实现对象的多级排序详解
May 09 Python
Python中使用支持向量机SVM实践
Dec 27 Python
python中返回矩阵的行列方法
Apr 04 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
numpy 返回函数的上三角矩阵实例
Nov 25 Python
Tensorflow的梯度异步更新示例
Jan 23 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
Python __slots__的使用方法
Nov 15 Python
浅析pandas随机排列与随机抽样
Jan 22 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为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
深入解析PHP中逗号与点号的区别
2013/08/05 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
2017/12/07 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
python conda操作方法
2019/09/11 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
党员自我评议个人对照检查材料
2014/09/16 职场文书
支部书记四风问题对照检查材料
2014/10/04 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
银行招聘自荐信
2015/03/06 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
经费申请报告范文
2015/05/18 职场文书
anaconda python3.8安装后降级
2021/06/11 Python
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL