Android应用启动时间可以直接使用adb命令来获取:
adb shell am start -W -n "应用包名"/"应用启动Activity名"
但是,很多时候我们无法获知应用的包名和应用启动的Activity名。这时我们采用一个比较稳妥的方式:
1. 获取应用包名;
2. 获取安装包所在路径;
3. 安装包adb pull到本地;
4. aapt获取启动Activity信息;
5. 使用上面提到的adb shell am start命令获取应用启动时间.
当然以上的步骤不止需要我们有adb环境,还需要我们有aapt环境。这两个环境的配置这里不介绍了,主要记录一下自己的实现过程:
1. 获取应用包名:
adb shell pm list packages -f (会返回包名的列表,这里暂记我们要的包名为"targetpack")
2. 获取应用所在路径:
adb shell pm path "targetpack" (会返回应用在手机中的存放路径,暂记"mobilepath")
3. 将应用pull到本地路径:
adb pull "mobilepath" "localpath" (这里"localpath"是指本地路径,应用拖到本地路径)
4. aapt获取应用启动Activity信息:
aapt d badging "localpath + 应用名" | findstr "launchable-activity" (得到启动Activity,暂记为"launchactivity")
5. 测算启动activity的启动时间
adb shell am start -w -n "targetpack"/"launchactivity"
最后提供大家一份自己写的水货脚本,已经有python环境,adb环境,和aapt环境的同事可以直接使用。
import os
#手机名称通配
def extractDict(target):
mBool = (target.find("android") < 0) and (target.find("huawei") < 0) and (target.find("samsung") < 0) and (target.find("xiaomi") < 0) and (target.find("miui") < 0)
return mBool
#执行adb命令,返回结果
def adbCallback(cmd):
arr = []
mRequest = os.popen("adb shell " + cmd)
for line in mRequest.readlines():
if (line.find("=") > 0) and extractDict(line):
head = line.index("=") + 1
end = line.index("\r")
line = line[head:end]
arr.append(line)
else:
pass
return arr
#对返回结果进行处理,选择要启动应用的包
def arrEdit(arr):
for i in range(0, len(arr)):
print(str(i) + ". " + arr[i])
tempInt = -1
while(tempInt<0):
tempInt = int(input('\nPlease input the Number you wanna start:\n'))
if tempInt<len(arr):
print "You choose package \'" + arr[tempInt] + "\' to start."
print "Please wait...\n"
return arr[tempInt]
else:
print "Illegal input detected!"
tempInt = -1
#获取该包所在路径
def getPath(pac):
mRequest = os.popen("adb shell pm path " + pac)
mResult = mRequest.read()
print mResult
return mResult
#提取apk至本地路径,并获取当前路径+文件名
def pullApk(pat):
mCurrentPath = os.getcwd()
mRequest = os.popen("adb pull " + pat + mCurrentPath)
mPosition = pat[::-1].find("/")
mAppName = pat[len(pat)-mPosition:]
tempPath = mCurrentPath + "\\" + mAppName
return tempPath
#aapt解析apk包中AndroidManifest.xml中启动activity
def analyzeXml(pat):
pat = '"' + pat.strip('\n') + '"' #去掉换行符,添加双引号
mRequest = os.popen('aapt d badging ' + pat + ' | findstr "launchable-activity"')
mResult = mRequest.read()
mResult = mResult[mResult.find("name=") + 6 : mResult.find("' ")]
print "Launchable-activity name: " + mResult
return mResult
#开启Activity并测算时间
def startTime(pac, act):
mRequest = os.popen("adb shell am start -W -n " + pac + "/" + act)
mResult = mRequest.read()
print mResult
#入口函数
if __name__ == '__main__':
myCmd = "pm list packages -f"
myArr = adbCallback(myCmd)
myPac = arrEdit(myArr)
myPat = getPath(myPac)
myPat = myPat[myPat.find("/"):]
myApk = pullApk(myPat)
myAct = analyzeXml(myApk)
startTime(myPac, myAct)
raw_input('Press <Enter> to exit.')