通过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实现百度关键词排名查询
Mar 30 Python
Python中的True,False条件判断实例分析
Jan 12 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
python中dir函数用法分析
Apr 17 Python
Python连接phoenix的方法示例
Sep 29 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
PyTorch中的拷贝与就地操作详解
Dec 09 Python
scrapy-splash简单使用详解
Feb 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示例分享
2014/04/22 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
PHP面向对象之工作单元(实例讲解)
2017/06/26 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
如何理解Vue的render函数的具体用法
2017/08/30 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
理解python中生成器用法
2017/12/20 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python开发准备工作之配置虚拟环境(非常重要)
2019/02/11 Python
对python3.4 字符串转16进制的实例详解
2019/06/12 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
物流管理毕业生自荐信范文
2014/03/15 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
对外汉语专业大学生职业生涯规划书
2014/10/11 职场文书
铁人观后感
2015/06/16 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
利用正则表达式匹配浮点型数据
2022/05/30 Java/Android