android性能优化之启动优化
作者:互联网
android性能优化之启动优化
- android启动方式有三种,冷启动、热启动和温启动,启动优化一般指冷启动优化,热启动和温启动一般无问题
- 冷启动:是指在系统没有当前应用的进程时,启动该应用。
- 热启动:是指在系统有当前应用的进程,并且当前应用的activity在运行时,启动该应用
- 温启动:是指启动应用时,后台已有当前应用的进程,但是当前应用的acitvity不在运行是,启动该应用,比如在首页点击返回按钮退出该首页
- 冷启动优化,是指在不影响业务的情况下,尽可能去减少冷启动过程中所花的时间。
白屏问题
白屏问题,是指在冷启动过程中,先出现一个白屏页,然后再出现app的第一个activity,白屏问题是第一个需要优化的点。
- 产生原因
- 白屏问题的产生原因,是因为在app启动过程中,先加载主题背景,然后再加载activity页面,中间有一定的时间差,从而引起了白屏
- 解决方案
- 主题设置为透明,启动页的主题style增加以下三项设置
<item name="android:windowContentOverlay">@null</item> <item name="android:windowBackground">@null</item> <item name="android:windowDisablePreview">true</item>
- 主题背景设置为一张图
<item name="android:windowBackground">@drawable/bg_splash</item>
常见问题
- 数据库、IO操作发生在主线程
- Application中创建线程池
- Application中做了大量的初始化操作
- MainActivity网络请求密集:是否必要、接口是否可以合并
- 工作线程使用没设置优先级:AsyncTask、AsyncQueryHandler、线程池
- 信息没缓存,重复获取同样信息
- 不合理的业务流程
- 废弃的老代码
定位问题
- 避免IO操作
- 序列化/反序列化
- 网络操作
- 布局嵌套
四个维度考虑问题
- 必要且耗时:MutiDex
- 必要不耗时:首页绘制
- 非必要耗时:数据上报,插件初始化
- 非必要不耗时:直接去掉,需要时再加载。其他第三方组件的初始化
解决问题的方向
- 分布加载:以大化小,优先级高的放前
- 异步加载:耗时多的异步化
- 延期加载:非必要的数据延时加载
通用启动优化方案
- 利用主题快速显示界面
- 异步初始化组件
- 通过梳理业务逻辑,延迟初始化组件、操作
- 正确使用线程:开启线程池比单独开启一个线程耗资源
- 去掉无用代码、重复逻辑等
如何查看冷启动时间
- 查看日志:将手机连接到android studio上,打开logcat,不要选择进程,在手机上杀死应用并重新打开,搜索关键字 Displayed , 会看到如下日志
08-23 10:23:54.266 2097-2133/? I/ActivityManager: Displayed com.jackting.test/.ui.login.LoginActivity: +557ms
- 使用adb命令:将手机连接到android studio上,杀死应用,使用命令 adb shell am start -W packagename/MainActivity打开应用,命令行界面会出现以下打印,参数一般以TotalTime为准
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.jackting.test/.ui.login.LoginActivity }
Status: ok
Activity: com.jackting.test/.ui.login.LoginActivity
ThisTime: 559
TotalTime: 559
WaitTime: 633
Complete
- 参数含义
- ThisTime:最后启动的activity的启动耗时,最后一个activity启动到startActivityAndWait调用结束
- TotalTime: 新应用启动的耗时,包括新进程的启动和activity的启动,第一个activity启动到最后一个activity的startActivityAndWait结束,如果过程只有一个activity,totalTime=thisTime
- WaitTime: ams启动app的activity的总时间(包括当前activity的onPause和自己activity的启动),startActivityAndWait方法的调用时间
冷启动优化利器 - systrace
- 功能:
- 分析UI卡顿问题
- app启动流程
- 分析 锁性能
- 准备知识
- 安装python2.7
- systrace路径是 /sdk/platform-tool/systrace
- DDMS打开方式:打开文件 /sdk/tools/monitor/monitor.bat
- 使用方式
- 先打开DDMS,再点击左上角的“Capture System trace”
- 命令,先进入 systrace路径 /sdk/platform-tool/systrace
- python systrace.py -l : 查看都有哪些参数
- 通用命令:python systrace.py [option] [category1] [category2] … [categoryN]
- python systrace.py --time=10 -o /Users/djx/Documents/android/trace/ecommalltrace.html sched gfx view wm am -a com.jackting.ecommall
- 参数问题
- 测试列表滑动,桌面滑动等流畅性问题
- 需要包含参数 gfx input view
- 若在上面的基础上,还需要分析硬件加速 HWUI
- gfx input view hwui
- 测试app启动或者进入界面的速度
- gfx input view am wm res
- 怀疑有gc或者IO导致的卡顿
- gfx input view dalvik disk
- 怀疑有电量相关的问题
- gfx input view res am wm power
- 测试列表滑动,桌面滑动等流畅性问题
- 浏览trace文件
- 蓝色:Runnable状态,Runnable状态的线程持续时间越长,则表示cpu调度越忙,没有及时处理这个任务
- 是否后台有太多的任务在跑
- 是否cpu频率太低
- 是否被限制到某个具体的cpu,cpu很满
- 此时Running状态的线程是哪个?为什么
- 白色:休眠状态,一般情况都是在等待事件驱动,或者在互斥锁上等待了
- 橘色:不可中断的睡眠状态,一般线程在IO上面阻塞了,等待磁盘操作,表明IO操作很慢,大量橘色出现 表明 系统进入低内存状态
- 紫色:可中断的睡眠状态,线程在另一个内核上被阻塞了,可能是正常的,也可能是
- 蓝色:Runnable状态,Runnable状态的线程持续时间越长,则表示cpu调度越忙,没有及时处理这个任务
标签:systrace,启动,性能,线程,冷启动,activity,android,优化 来源: https://blog.csdn.net/qq_23081779/article/details/100031518