ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android性能优化之启动优化

2019-08-23 11:09:29  阅读:289  来源: 互联网

标签:systrace 启动 性能 线程 冷启动 activity android 优化


android性能优化之启动优化

  • android启动方式有三种,冷启动、热启动和温启动,启动优化一般指冷启动优化,热启动和温启动一般无问题
    1. 冷启动:是指在系统没有当前应用的进程时,启动该应用。
    2. 热启动:是指在系统有当前应用的进程,并且当前应用的activity在运行时,启动该应用
    3. 温启动:是指启动应用时,后台已有当前应用的进程,但是当前应用的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操作
  • 序列化/反序列化
  • 网络操作
  • 布局嵌套

四个维度考虑问题

  1. 必要且耗时:MutiDex
  2. 必要不耗时:首页绘制
  3. 非必要耗时:数据上报,插件初始化
  4. 非必要不耗时:直接去掉,需要时再加载。其他第三方组件的初始化

解决问题的方向

  • 分布加载:以大化小,优先级高的放前
  • 异步加载:耗时多的异步化
  • 延期加载:非必要的数据延时加载

通用启动优化方案

  • 利用主题快速显示界面
  • 异步初始化组件
  • 通过梳理业务逻辑,延迟初始化组件、操作
  • 正确使用线程:开启线程池比单独开启一个线程耗资源
  • 去掉无用代码、重复逻辑等

如何查看冷启动时间

  1. 查看日志:将手机连接到android studio上,打开logcat,不要选择进程,在手机上杀死应用并重新打开,搜索关键字 Displayed , 会看到如下日志
08-23 10:23:54.266 2097-2133/? I/ActivityManager: Displayed com.jackting.test/.ui.login.LoginActivity: +557ms
  1. 使用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操作很慢,大量橘色出现 表明 系统进入低内存状态
    • 紫色:可中断的睡眠状态,线程在另一个内核上被阻塞了,可能是正常的,也可能是

标签:systrace,启动,性能,线程,冷启动,activity,android,优化
来源: https://blog.csdn.net/qq_23081779/article/details/100031518

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有