通过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 相关文章推荐
在Django中创建动态视图的教程
Jul 15 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
5款非常棒的Python工具
Jan 05 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
python爬虫使用正则爬取网站的实现
Aug 03 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
Pycharm中使用git进行合作开发的教程详解
Nov 17 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 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
访问编码后的中文URL返回404错误的解决方法
2014/08/20 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
php中错误处理操作实例分析
2019/08/23 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
antd design table更改某行数据的样式操作
2020/10/31 Javascript
在Python中使用__slots__方法的详细教程
2015/04/28 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python下的Softmax回归函数的实现方法(推荐)
2017/01/26 Python
Python排序算法实例代码
2017/08/10 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
详解flask入门模板引擎
2018/07/18 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
企业安全生产演讲稿
2014/05/09 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
兵马俑的导游词
2015/02/02 职场文书
病人慰问信范文
2015/02/15 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle