接上 2 篇案例: Python_批量下载 1000 个 apk, Python_批量验证 1000 个 apk,
都下载完了, 也验证了下载文件的版本号和 MD5 后, 就要开始批量安装了,
然后开始尝试运行打开这个 App, 做最基本的功能检点, 最后就要考虑卸载 App 了.
本篇内容主要介绍如何用 Python 来批量实现安装 apk, 卸载 apk.
备注:
一个手机不可能同时安装 1000 个 apk, 需要考虑每 50-100 个作为一组, 进行安装, 验证后卸载测试.
准备阶段
adb install -d -r XXX.apk 是安装 apk 的具体命令,
-d :downgrade 的简称, 编码出现提示说系统里已经有该 App 且其版本比当前安装的版本更高, 即允许低版本的 apk 安装
-r : reinstall 的简称, 避免出现提示说这个 App 已经在系统里了而导致本次安装失败, 即允许重装 apk
综上: 加了 - d, -r 就会更保险, 确保 apk 最终能安装成功.
adb shell pm list package -3 可以列出所有已安装的第三方的 App 的包名.
何为第三方的 App, 即非系统自带 (built-in) 的 App, 后续自行安装的 App 都是属于第三方 App, 比如以下是自行安装的百度地图, 酷狗音乐, 非系统 App:
adb shell pm uninstall + App 包名, 可以卸载指定的包名的 App.
Python 批处理脚本形式
记住批处理脚本的精髓: 批量顺序执行语句,
以下是 "安装 apk" 脚本形式:
- # coding=utf-8
- import os
- # 读取 downloaded_apk 文件夹下的所有 App 文件, 进行批量安装
- curpath = os.getcwd()
- apk_dir = os.path.join(curpath, "downloaded_apk")
- apk_list = os.listdir(apk_dir)
- for apk in apk_list:
- print("正在安装 %s..." % apk)
- apk_path = os.path.join(apk_dir, apk)
- os.system("adb install -d -r %s" % apk_path)
- print("所有 App 已经安装完毕!...")
- os.system("pause")
以下是 "卸载 apk" 脚本形式:
- # coding=utf-8
- import os
- # 读取第三方 App 列表并进行卸载
- s = os.popen("adb shell pm list package -3").read()
- for line in s.splitlines():
- if len(line)> 2:
- appname = line.replace("package:", "")
- print("正在卸载包名为 %s 的 App" % appname)
- os.system("adb shell pm uninstall %s" % appname)
- print("所有 App 已经卸载完毕!...")
- os.system("pause")
Python 面向过程函数形式
其实这个案例批处理形式的脚本实现即可,
如果硬要用面向过程函数形式, 也是可以考虑简单的把代码块预计封装下即可.
以下是 "安装 apk" 函数形式:
- # coding=utf-8
- import os
- def install_apk():
- '''读取 downloaded_apk 文件夹下的所有 App 文件, 进行批量安装'''
- curpath = os.getcwd()
- apk_dir = os.path.join(curpath, "downloaded_apk")
- apk_list = os.listdir(apk_dir)
- for apk in apk_list:
- print("正在安装 %s..." % apk)
- apk_path = os.path.join(apk_dir, apk)
- os.system("adb install -d -r %s" % apk_path)
- print("所有 App 已经安装完毕!...")
- install_apk()
- os.system("pause")
以下是 "卸载 apk" 函数形式:
- # coding=utf-8
- import os
- def uninstall_apk():
- '''读取第三方 App 列表并进行卸载'''
- s = os.popen("adb shell pm list package -3").read()
- for line in s.splitlines():
- if len(line)> 2:
- appname = line.replace("package:", "")
- print("正在卸载包名为 %s 的 App" % appname)
- os.system("adb shell pm uninstall %s" % appname)
- print("所有 App 已经卸载完毕!...")
- uninstall_apk()
- os.system("pause")
Python 面向对象类形式
其实这个案例批处理形式的脚本实现即可,
如果硬要用面向对象类形式, 也是可以考虑简单地用以下类来实现.
本次优化, class 类名(object): 后续尽量加上 object, 代表是父类,
类其最基本特征就是: 继承, 默认如果我们不知道当前类的父类是啥,
就直接用 object, 代表是一切类的父类, 如果知道其父类啥, 这类就要换成具体的父类类名了.
以下是 "安装 apk" 类形式:
- # coding=utf-8
- import os
- class ApkInstaller(object):
- '''用于安装 apk'''
- def __init__(self):
- pass
- def install_apk(self):
- '''读取 downloaded_apk 文件夹下的所有 App 文件, 进行批量安装'''
- curpath = os.getcwd()
- apk_dir = os.path.join(curpath, "downloaded_apk")
- apk_list = os.listdir(apk_dir)
- for apk in apk_list:
- print("正在安装 %s..." % apk)
- apk_path = os.path.join(apk_dir, apk)
- os.system("adb install -d -r %s" % apk_path)
- print("所有 App 已经安装完毕!...")
- if __name__ == '__main__':
- a_obj = ApkInstaller()
- a_obj.install_apk()
- os.system("pause")
以下是 "卸载 apk" 类形式:
- # coding=utf-8
- import os
- class ApkUnstaller(object):
- '''用于卸载 App'''
- def __init__(self):
- pass
- def uninstall_apk(self):
- '''读取第三方 App 列表并进行卸载'''
- s = os.popen("adb shell pm list package -3").read()
- for line in s.splitlines():
- if len(line)> 2:
- appname = line.replace("package:", "")
- print("正在卸载包名为 %s 的 App" % appname)
- os.system("adb shell pm uninstall %s" % appname)
- print("所有 App 已经卸载完毕!...")
- if __name__ == '__main__':
- a_obj = ApkUnstaller()
- a_obj.uninstall_apk()
- os.system("pause")
运行方式
确保 Android 设备通过 USB 线与电脑连接了, adb 设备有效连接,
以上代码的 3 种实现形式都可以直接运行,
比如保存为 install_app.py, uninstall_app.py 并放在桌面,
建议 python install_app.py, python uninstall_app.py 运行, 当然也可以双击运行.
更多更好的原创文章, 请访问官方网站: https://www.zipython.com/
自拍教程(自动化测试 Python 教程, 武散人编著)
来源: http://www.bubuko.com/infodetail-3499946.html