项目优化实战 —— App启动时间优化

一顿骚操作写完项目之后,运行一看炸裂了;在冷启动的时候,APP启动时间居然要十几秒,当遇到白屏或者黑屏的时候,更多的是想到了使用background的方式来替换刚刚启动时候的界面显示,但是这样通常是治标不治本的;因为使用background的方式应用的启动时间是不变的,导致用户停留在闪屏页面时间过长,接下来我们来分析一下应用启动耗时

看完本篇文章你将了解到:
· 在`logcat`中查看界面启动时间
· 使用`adb`方式启动`Activity`查看耗时时间
· 使用`Debug`来追踪方法中函数耗时
· 使用`Android Studio`来查看`trace`文件,分析`trace`文件中耗时方法
· 优化应用启动时间

在logcat中查看应用启动时间

使用真机调试的时候,往往因为logcat打印太快而忽略了系统打印的一些信息,比如displayed 是用来记录Activity的启动时间:

在logcat中查看.png

注意 画框 的地方: 选中自己调试的应用,在过滤输入框中输入 displayed 启动自己的调试的应用之后,将会看到如图中显示的打印时间; 可以看到,当前应用启动时间是非常久的,我使用该应用之后的第一个想法是卸载(摊手)

使用logcat查看可能觉得太low,不能展示我们装逼的格调,接下来我们使用adb的方式启动应用:

使用adb shell命令的方式启动Activity查看启动时间

adbsdk platform-tools 中的一个工具,我们先将其添加到环境变量中,然后在终端调用adb ,可以看到一系列的命令; 我们这里不作命令的讲解,既然是要查看Activity启动时间,而Activity的启动都是由ActivityManager am 管理; 当我们在官网查看adb命令时,下面则对am进行了讲解:
https://developer.android.com/studio/command-line/adb?hl=zh-cn#shellcommands

接下来我们使用 adb shell am的方式启动Activity:

优化前使用adb shell 查看启动时间.png

可以看到总的启动时间为 3096 毫秒 , 在logcat中最后一次的SplashActivity启动时间一样;上面使用了两种方法来查看应用启动到第一个界面的等待总时间,可以看到当点击应用图标时进入到页面花费了大量的时间,那这个时间做什么去了呢?

分析Application中 onCreate 耗时

点击应用图标启动到进入界面的这段逻辑中,系统做了大量的初始化操作,而这些操作我们是无法进行优化的,所以只能在onCreate()方法中进行优化处理;

官网中对日志追踪有详细的介绍,这里不再赘述;我们直接使用
官网介绍:https://developer.android.com/studio/profile/generate-trace-logs?hl=zh-cn#instrument

假设在这里你已经看懂了使用Debug来追踪调试日志的方法,我们使用Debug.startMethodTracing(file.getAbsolutePath()); 来告诉系统开始追踪方法,使用 Debug.stopMethodTracing() 停止追踪,两个方法之间就是你需要追踪调用时间的代码;

具体使用 :

@Override
public void onCreate() {
    super.onCreate();

    File file = new File(Environment.getExternalStorageDirectory(), "app");
    Log.d("Debug ====", file.getAbsolutePath());
    Debug.startMethodTracing(file.getAbsolutePath());
    dbApplication = this;

    // .... 省略实际代码

    Debug.stopMethodTracing();
}

当然作为调试,这里没有做权限申请,你需要在应用启动之前设置允许该应用的存储权限;加入该代码之后,重新运行一次,你将在/storage/emulated/0 目录下看到 app.trace文件,使用adb pull 命令将该文件导出:

导出trace追踪文件.png

接着将该文件拖动到android studio中,接下来你将看到最新的Android studio 分析 trace文件:

android studio查看trace文件.png

和之前的版本不同的是,最新版本的分析可以清楚的看到哪些调用耗时时间;在分析出的结果中,我们看到项目中使用的Mob分享和小米推送两个耗时最多,接下来我们将一个个优化,既然是第三方的sdk,最先考虑的是能不能将其放入到子线程中和启动页面中,这样既避免了启动耗时,同样也不会影响后面的操作流程; 当然,有些第三方sdk需要使用到Handler, 这样我们另做考虑; 接下来我们将优化其中的耗时调用,

优化第三方SDK

  • 优化 mob sdk

我将MobSDK.init放入到闪屏页面中的子线程中

// 使用Rxjava
Observable.just("").subscribeOn(Schedulers.io()).subscribe(s -> getModel().MobSDKInit());

一开始,我们是不知道第三方sdk是否能放入到子线程中的,所以,我们只能试探性的运行尝试,不行再尝试其他方法;修改完代码之后,我们再次Debug调试,重复Debug ApplicationonCreate() 方法, 调出trace文件查看结果:

去掉Mob sdk之后.png

调试之后,看到运行时间轴消耗时间,别吓到了,每次显示的是占用时间最长的,这里我们使用同样的方式优化接下来的第三方sdk;

  • 优化 mi push sdk

我们将小米推送放入到闪屏的子线程中,看到trace文件中没有了耗时,而且要用正常执行,没有报错:


优化小米推送之后.png

接下来,我们看到一长条的FeedbackApi 这是阿里的反馈初始化,优化它

  • 优化 ali feedback sdk

优化阿里反馈.png

按照如上的操作,我相信同学们应该都会优化了;将所有的优化进行完之后,我们看下启动时间:


最后启动时间.png

上面详细讲解了从启动时间的获取到第三方sdk的优化,当然我这里都是在子线程执行,因为大部分第三方的sdk不涉及到Handler的使用,但是不可避免的是会遇到;下面就有这种情况,当使用腾讯的IM的时候,使用到了Handler,所以在这里建议使用IntentService,关于IntentService使用,大家自行谷歌吧~

总结

到最后, 应该都懂得了启动优化,不再简单的使用background的方式来填充了,应该找到根本原因~

优化主要分为:

  • Debug.startMethodTrace 开始Trace
    Debug.stopMethodTrace 结束Trace
  • 获取到trace文件
  • 分析方法中耗时调用
  • 优化
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 请保持淡定,分析代码,记住:性能很重要。 启动时间优化 毫无疑问,应用的启动速度越快越好。 本文可以帮助你优化应用...
    Mupceet阅读 11,367评论 5 19
  • 1、前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,性能问题从应用的启...
    萧竹阅读 14,866评论 1 24
  • Android 调试桥 Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 A...
    guanjm阅读 1,442评论 0 1
  • 我想了很久很久,虽然我的文笔很烂。不!甚至可以说是没有。我想把我这二十几年所有发生的所谓的劫记录下来,希望有一天我...
    LIU花花阅读 522评论 0 0
  • 现在脑袋有点儿晕晕的,刚看了小说《岛上书店》,一口气读完。太喜欢这类书了,不愧是畅销书。一直在手机上看书,会不会把...
    一哈哈儿阅读 320评论 0 0