Android 程序启动优化

前段时间Boss说:“咱们的App启动有点慢啊,而且点击桌面ICON的时候,感觉手机有一瞬间卡死了。”问题很严重,于是决定研究一下App的启动过程。

本文从下面几个角度来分析

  • APP启动的流程
  • 启动耗时的量化
  • App运行分析工具
  • 其他

应用程序启动时序

应用程序启动时间image

启动耗时的量化

既然要优化,总不能凭感觉,终归要要拿出数据说事。这里也需要通过adb指令来实现。

操作启动指令和结果如下:当然也顺便对比一下同行的大佬微信的效率。

kangwencaideiMacBook:~ kangwencai$ adb shell am start -S -W com.yqr.expressgold/.activity.SplashScreenActivity
Stopping: com.yqr.expressgold
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.yqr.expressgold/.activity.SplashScreenActivity }
Status: ok
Activity: com.yqr.expressgold/.activity.SplashScreenActivity
ThisTime: 3334
TotalTime: 3334
WaitTime: 3354
// 对比测试一下微信的
adb shell am start -S -W com.tencent.mm/com.tencent.mm.ui.LauncherUI
Stopping: com.tencent.mm
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mm/.ui.LauncherUI }
Status: ok
Activity: com.tencent.mm/.app.WeChatSplashActivity
ThisTime: 349
TotalTime: 1481
WaitTime: 1509

乍一看差距实在是太大了,启动时间几乎是人家的两倍,大佬真是牛逼。后续分析发现原来微信在后台有个服务一直处于运行状态,如果重启手机,再启动微信启动需要2.5~2.7秒。

App运行分析工具:systrace

参考

指令 python systrace.py view --time=10 3.与您的应用进行交互。10秒后,systrace生成一个HTML报告。4.使用Web浏览器打开HTML报告。

python /Users/kangwencai/Library/Android/sdk/platform-tools/systrace/systrace.py  --time=10 -o mynewtrace.html gfx
// 结果一直提示当前是3.6的python,必须要2.7的python执行
还可以只追踪一个应用 -a  包名称

// 要求必须用2.7的版本执行,默认为3.6,怎么着都不好使,怒了,直接进入到python的path脚本,让他执行
/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/kangwencai/Library/Android/sdk/platform-tools/systrace/systrace.py  --time=10 -o mynewtrace.html gfx

Starting tracing (10 seconds)
Tracing completed. Collecting output...
Outputting Systrace results...
Tracing complete, writing results

Wrote trace HTML file: file:///Users/kangwencai/mynewtrace.html

systrace分析详解

  • 图标1: 选择之后可以选定一个区域,看这个区域方法的执行顺序和时间。
  • 图标2:图片本身比较大,用这个图标可以上下左右移动
  • 图标3:上下滑动放大缩小图片,因为按16ms一格,所以很密集很多时候需要放大缩小。
  • 图标4:选定一个区域,看这段区域的总时间

注意常见问题

application的onCreate


当您的代码覆盖Application 对象时,启动性能会受到影响,并在初始化该对象时执行繁重的工作或复杂的逻辑。如果您的应用程序子类执行不需要完成的初始化,那么您的应用程序可能会在启动过程中浪费时间。一些初始化可能是完全不必要的:例如,初始化主要活动的状态信息,当应用程序实际启动以响Intent图时。应用程序只使用以前初始化的Intent budnle数据的一个子集。

  • 与初始化同时发生的磁盘I / O,进一步阻止初始化过程。
  • 垃圾收集尤其是Dalvik运行时的一个考虑因素;Art运行时同时执行垃圾收集,最大限度地减少操作的影响。
  • 您的应用初始化的任何全局单例对象。

activity的onCreate

  • 充满大型或复杂的布局。
  • 阻塞磁盘上的屏幕绘图或网络I / O。
  • 加载和解码位图。
  • 栅格化VectorDrawable对象。
  • 初始化活动的其他子系统。
  • 反序列化

其他

启动的时候确实是有一段时间类似于卡住的感觉。分析后发现:

  • 点击ICON之后系统会很快分配一个窗口
  • 但是在Application初始化和第一个activity的onResume之间有一段很长的时间
  • 这段时间分配了窗口,却没内容显示所以点击桌面不会又任何响应,于是就出现卡死的感觉,根据主题的不一样一般会是透明或者白色的一段时间

这种现象配置一下主题设置window的背景就行,分配窗口之后会立即呈现window的背景,这样就有一种瞬间响应的感觉了。

配置App主题会让每个activity都加载下面的图片,为了节约内存这里配置一个样式在manifest里面专门给闪屏页的activity引用

    <style name="SplashTheme" parent="AppBaseTheme">
        <!-- 欢迎页背景引用刚才写好的 -->
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="android:windowFullscreen">true</item>
    </style>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值