Android应用启动耗时

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.')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值