接上2篇案例: "Python_批量下載1000個apk" , "Python_批量驗證1000個apk" , 都下載完了, 也驗證了下載文件的版本號和MD5後,就要開始批量安裝了, 然後開始嘗試運行打開這個app, 做最基本的功能檢點,最後就要考慮卸載App了。 本篇內容主要介紹如何用Python ...
接上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運行,當然也可以雙擊運行。
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測試Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=eaefc83153e64cadb2f74b90f509de0b
也可關註“武散人”微信訂閱號,隨時接受文章推送。