APP专项测试实战2
综合性能
针对所有APP的性能,从大局观去看性能数据。
命令:adb shell vmstat
r:表示运行队列
b:阻塞的进程
swpd:虚拟内存使用的大小
free:空闲的物理内存的大小
buff:缓存
cache:缓冲
si:每秒从磁盘读入虚拟内存的大小
so:每秒虚拟内存写入磁盘的大小
bi:块设备每秒接收的块数量
bo:块设备每秒发送的块数量
in:每秒CPU的中断次数
cs:每秒上下文切换次数
us:用户CPU时间
sy:系统CPU时间
id:空闲CPU时间
wt:等待IO CPU时间
使用bash提取指标
adb shell vmstat | tail -1 | awk '{print $15}'
反复提取:while true; do adb shell vmstat | tail -1 | awk '{print $15}';done
虚拟内存的运行速度要比正常内存慢一百倍以上。
appium使用vmstat
cmd = 'adb shell vmstat'
res = subprocess.Popen(cmd,shell =true,sdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(res.stdout.read().decode("utf-8").split("\r\n")[2].split()[3]
webview性能
每一个web操作都有操作码,根据操作码来分析
window.performance.navigation.type
刷新--1
跳转--0
后退--2
可以进行js自动化模拟上述操作
window.location.href="https://www.baidu.com/"
windows.location.reload()
windows.location.back()
利用Appium
def test_navigation():
caps = {}
caps["platformName"] = "Android"
caps["deviceName"] = "127.0.0.1:7555"
caps["appPackage"] = "com.xueqiu.android"
caps["appActivity"] = ".view.WelcomeActivityAlias"
caps["noReset"] = "true"
caps["chromedriverExectable"] = "D:/develop/chromedriver/2.20.exe"
driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)
driver.implicitly_wait(15)
driver.find_element(By.XPATH,"//*[@text='交易']").click()
webview = driver.contexts[-1]
driver.switch_to.context(webview)
print(driver.execut_script("return window.performance.navigation.type"))
url=driver.execute_script("window.location.herf='https://www.baidu.com'")
driver.execute_script("window.location.reload()")
driver.execute_script("return window.performance.navigation.type")
print(url)
使用location.herf查看前端代码位置
driver.execute_script("return window.location.herf")
把内容存入本地:adb pull 文件路径
adb logcat | grep "http://danjuanapp.com"
耗电量
电量问题和检测
只从应用和操作看,是不知道为什么耗电量的增加
常见的电量问题
唤醒锁(acquire)
- 关闭屏幕显示,让CPU后台运行
- APP长期获取唤醒锁,不释放
- 阻止设备进入低电量模块
唤醒锁
电池会话:再次充满电之间
- 消耗整个电池会话的0.7%
- 在后台运行时,消耗整个电池会话的0.1%
利用工具Google play,我的开发的应用会反馈唤醒锁
问题代码:void doSomethingAndRelease() throws MyException{
wakeLock.acquire();
doSomethingThatThrows();
wakeLock.release();
}
代码改进:
void doSomethingAndRelease() throws MyException{
try{
wakeLock.acquire();
doSomethingThatThrows();
}finally{
wakeLock.release();
}
}
#最后都会释放锁 ,异常处理
查看唤醒锁
- play console
- Battery Historian 可视化的,锁屏电量查看
- dumpsys adb shell dumpsys power
-
建议:唤醒锁改进
- 使用前台服务
- 确保锁的获取和释放简单
有些应用渲染问题,CPU和GPU,内存占用都比较高。导致耗电量比较高,是正常的。
dumpsys
查看所有服务
adb shell dumpsys
查看可用服务
adb shell dumpsys -l
adb shell dumpsys -l | wc -l
adb shell dumpsys input
卡顿检测
奔溃问题
Amdahl