App启动优化

App的启动被分成了:

  • 冷启动:系统没有为该程序创建进程,程序从头开始启动;例如,安装后第一次启动,应用程序被系统完全终止之后再打开。
  • 热启动:此程序仍然留在内存中,只是被系统从后台带到前台,可避免重复对像初始化和避免重复加载和渲染;例如,使用home键退到桌面,再重新启动。
  • 暖启动:包含了冷启动和热启动的部分操作,消耗比热启动多一些,与热启动的区别在于,它启动时会调用onCreate方法,相当于是介于冷启动和热启动之间的情况;例如,使用back键退出应用并重新启动。

因为冷启动的流程,会先加载并启动app,启动后会马上显示一个空白窗口,然后再创建app进程,创建launchActivity,加载和绘制布局。

这个过程中我们能优化处理的部分就是:

  • 空白窗口
  • Application的onCreate方法
  • launchActivity的onCreate,onStart,onResume方法

注意:如果在Application和launchActivity的以上方法中有启动其他activity的,那么启动的这个activity的onCreate,onStart,onResume方法也需要优化

黑白屏优化

这个空白窗口在有些主题下是白色有些主题下是黑色,这样就出现了黑白屏的问题。

如果app启动的过程中,有耗时操作或者性能差一些的手机,这个黑白屏的显示时间就会让用户感知到,影响体验,而我们能对这个空白窗口的样式进行改变,变成我们启动页的样式或者大体和启动页的样式一致,这样我们就比较优雅的解决了黑白屏的问题。

还有对于直接使用将背景透明化的也不太合适,因为这样会使用户感觉点了app之后没有响应,这段时间也是和启动时是否耗时和手机性能有关,所以这样的处理并不优雅,也违背了google的设计。

知道原理之后其实就很简单:

  • 设置启动主题
<style name="LauncherTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/launcher_bg</item>
    <item name="android:windowFullscreen">true</item>
</style>
  • 配置LauncherActivity
<activity
    android:name=".LauncherActivity"
    android:theme="@style/LauncherTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
  • LauncherActivity布局背景也设置成launcher_bg
<RelativeLayout 
    ...
    android:background="@drawable/launcher_bg"
    >
</RelativeLayout>    

launcher_bg例如:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/colorAccent" />

    <item android:top="150dp">
        <bitmap
            android:gravity="top"
            android:src="@drawable/ic_launcher" />
    </item>
</layer-list>

这里有点讲究,设计最好启动页使用纯色的背景和简单的icon处理,这样方便代码设置颜色,避免直接使用一张很大的图,也影响性能。

  • LauncherActivity中启动MainActivity逻辑:
postDelayed(new Runnable() {
    @Override
    public void run() {
        startActivity(new Intent(LauncherActivity.this, MainActivity.class));
        LauncherActivity.this.finish();
    }
}, 2000);

例如这里的简单延时两秒启动过MainActivity。

代码优化

黑白屏结局之后,我们再来看看代码的优化,其实代码的优化,只需要知道在哪些点上去检测,然后尽量不要做耗时操作即可。

  • 优化的点:

    • Application的onCreate方法
    • 第一个启动的Activity的onCreate,onStart,onResume方法

对于这个优化,我们直接看有可能不那么直观,Android中也提供了分析工具,可以检测app启动时间,以onCreate方法为例:

@Override
public void onCreate() {
    super.onCreate();
    File file = new File(Environment.getExternalStorageState(), "app.trace");
    Debug.startMethodTracing(file.getAbsolutePath());
    //业务逻辑
    Debug.stopMethodTracing();
}

这里在app.trace文件中就保存下来了业务逻辑部分执行的时间,通过

adb pull /storage/emulated/0/app.trace

这个命令就能得到app.trace文件,然后放到Android Studio中就能看到,业务逻辑部分哪些方法执行了多少时间,我们就能针对优化了。

  • 优化的方式

    • 异步线程方式,前提:对异步要求不高
    • 懒加载的方式,用的时候再初始化

具体的方式还是需要根据具体业务处理。

UI渲染优化

代码优化部分处理完了之后,我们还有就是UI布局的优化,其中就涉及到过度绘制问题,因为gpu的绘制完全根据cpu的指令来的,所以只要我们UI布局有重复绘制的部分,gpu依然会重复绘制,而这部分就是可以优化的,这也是导致过度绘制的原因。

优化的点包括:

  • 布局的背景是否重复,或者是否合理(原则:尽量不在相同区域重复设置背景)
  • 是否可以减少UI布局的层级
  • 自定义View绘制是否包含覆盖
  • 使用merge标签排除相同ViewGroup容器
  • 使用ViewStub进行布局的懒加载,在需要显示的时候再使用inflater加载
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 大家都遇到过自己 app 启动时间有些长,屏幕白屏的问题吧。一个正常的商业 app 在启动时时会加载一大票组件的初...
    前行的乌龟阅读 3,355评论 0 14
  • 应用启动的时间作为应用的门面,重要性可想而知。尤其在如今的快时代,一款秒开的App比一款启动需要耗费好几秒的App...
    付十一v阅读 919评论 0 10
  • 1.启动分为两种方式: 1)冷启动:当直接从桌面上直接启动,同时后台没有该进程的缓存,这个时候系统就需要重新创建一...
    孤独的根号十二阅读 113评论 0 1
  • title: Android app 启动优化date: 2017-03-12 18:44:12tags: App...
    苏州韭菜明阅读 1,134评论 0 5
  • 1.操作系统启动流程和Launcher点击事件流程2.启动方式以及首次启动3.黑白屏优化4.启动时间内代码优化 操...
    ArcherZang阅读 1,177评论 1 11