通过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 相关文章推荐
机器学习经典算法-logistic回归代码详解
Dec 22 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
Python with语句和过程抽取思想
Dec 23 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
python实现同一局域网下传输图片
Mar 20 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
基于python图书馆管理系统设计实例详解
Aug 05 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中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
js实现轮播图的完整代码
2020/10/26 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
JS实现手风琴特效
2020/11/08 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
假日旅行社实习自我鉴定
2013/09/24 职场文书
平面设计的岗位职责
2013/11/08 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
环保倡议书50字
2014/05/15 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书