zoukankan      html  css  js  c++  java
  • 《自拍教程56》Python 批量安装卸载1000个apk

    接上2篇案例:Python_批量下载1000个apk, Python_批量验证1000个apk
    都下载完了, 也验证了下载文件的版本号和MD5后,就要开始批量安装了,
    然后开始尝试运行打开这个app, 做最基本的功能检点,最后就要考虑卸载App了。
    本篇内容主要介绍如何用Python来批量实现安装apk,卸载apk。
    备注:
    一个手机不可能同时安装1000个apk,需要考虑每50-100个作为一组,进行安装,验证后卸载测试。


    准备阶段
    1. adb install -d -r XXX.apk 是安装apk的具体命令,
      -d :downgrade的简称,编码出现提示说系统里已经有该app且其版本比当前安装的版本更高,即允许低版本的apk安装
      -r : reinstall的简称,避免出现提示说这个app已经在系统里了而导致本次安装失败,即允许重装apk
      综上:加了-d, -r就会更保险,确保apk最终能安装成功。
    2. adb shell pm list package -3 可以列出所有已安装的第三方的App的包名。
      何为第三方的App,即非系统自带(built-in)的App,后续自行安装的App都是属于第三方App, 比如以下是自行安装的百度地图,酷狗音乐,非系统App:
    3. 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运行,当然也可以双击运行。

    更多更好的原创文章,请访问官方网站:www.zipython.com
    自拍教程(自动化测试Python教程,武散人编著)
    原文链接:https://www.zipython.com/#/detail?id=eaefc83153e64cadb2f74b90f509de0b
    也可关注“武散人”微信订阅号,随时接受文章推送。

  • 相关阅读:
    2018 ICPC 徐州网络赛
    2018 CCPC网络赛
    2013 NEERC
    2015 Dhaka
    2018ICPC南京网络赛
    Codeforces Round #505
    Codeforces Round #504 E. Down or Right
    Codeforces Round #504 D. Array Restoration
    2018 Multi-University Training Contest 3
    2018 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/zipython/p/12669672.html
Copyright © 2011-2022 走看看