在App自动化中,启动app时,需要输入启动信息,其中包含设备信息和apk包信息。
这次就是实测,通过apk获取包名和包的版本号等信息。
步骤:
- 通过aapt工具获取包的所有数据
- 通过正则表达式,获取所需数据
第一步:通过aapt工具获取包的所有数据
-
配置aapt变量,以MAC电脑为例:aapt工具存在已经安装的Android插件下:/Users/Wayne/Library/Android/sdk/build-tools。配置aapt环境变量:终端执行命令:sudo -s vim ~/.bash_profile
Wayne@192 30.0.3 % sudo -s vim ~/.bash_profile
输入#aapt export
PATH=${PATH}:/Users/wayne/Library/Android/sdk/build- tools/30.0.3/aapt/usr/local/bin生效环境变量:source ~/.bash_profile
Wayne@192 30.0.3 % source ~/.bash_profile
终端中执行查看具体目录下apk包数据:aapt dump badging XXX.apk
Wayne@192 30.0.3 % aapt dump badging
/Users/wangshuguang11/JD-work/install-app/wallet.apkwayne@192 30.0.3 % aapt dump badging
得到类似以下数据:🔽
/Users/Wayne/JD-work/install-app/wallet.apk package:
name=‘com.cjdfintech.wallet’ versionCode=‘1234’ versionName=‘2.7.0’
compileSdkVersion=‘29’ compileSdkVersionCodename=‘10’ sdkVersion:‘21’
targetSdkVersion:‘29’ uses-permission:
name=‘com.huawei.permission.SECURITY_DIAGNOSE’ uses-permission:
name=‘android.permission.WRITE_SETTINGS’ uses-permission:使用python进行调用,执行aapt,使用os模块执行:
aapt_path1 = "/Users/wangshuguang11/Library/Android/sdk/build-tools/30.0.3/aapt" # 解析工具aapt.exe&MAC电脑照片没喝过aapt可执行地址 apk_path1 = "/Users/wangshuguang11/JD-work/install-app/wallet.apk" # apk地址 data = os.popen("%s dump badging %s" % (aapt_path1, apk_path1)).read()#os.popen方式必须使用read模式进行读取数据 #必须使用这种方式(全路径获取aapt可执行文件),直接使用aapt命令出现错误,原因还没确定,郁闷中。
第二步:通过aapt工具获取包的所有数据
output = re.compile("launchable-activity: name='(\S+)'").search(data)
#获取到"launchable-activity: name=' 开头的字符串。此处使用serch。如果是整个字符串的第一部分。name可以使用match
data_output= output.group(1)#获取字符串后数据。
print(data)
以下代码为完整的方法调用,其中获取的具体字段可自定义获取。
# -*-coding:utf-8-*-
import os,re
import subprocess
def getAppBaseInfo(parm_aapt_path, parm_apk_path):
get_info_command = "%s dump badging %s" % (parm_aapt_path, parm_apk_path) #使用命令获取版本信息 aapt命令介绍可以相关博客
output = os.popen(get_info_command).read() #执行命令,并将结果以字符串方式返回
matchname = re.compile("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'").match(output) #通过正则匹配,获取包名,版本号,版本名称
# matchname2 = re.compile("launchable-activity: name='(\S+)'").search(output)#为获取非开头部分数据。按照需要自定义修改
if not matchname:
print (output)
raise Exception("can't get packageinfo")
packagename = matchname.group(1)
versionCode = matchname.group(2)
versionName = matchname.group(3)
print (u" 包名:%s \n 版本号:%s \n 版本名称:%s " % (packagename, versionCode, versionName))
if __name__=='__main__':
# path = os.path.abspath(os.path.dirname(__file__)) + "\\"
aapt_path = "/Users/wangshuguang11/Library/Android/sdk/build-tools/30.0.3/aapt" #解析工具aapt.exe&MAC电脑照片没喝过aapt可执行地址
apk_path = "/Users/wangshuguang11/JD-work/install-app/wallet.apk" #apk地址
getAppBaseInfo(aapt_path, apk_path)
返回结果:
/usr/bin/python3
/Users/wangshuguang11/Advances/Apptest/auto_sys/auto_app/test-driver.py
包名:com.cjdfintech.wallet 版本号:1234 版本名称:2.7.0Process finished with exit code 0