banner
NEWS LETTER

Android应用冷启动

Scroll down

前言

应用的冷启动总是无法避免的,也就是说冷启动时用户总要经历一个启动等待时间。开发人员唯一能做的就是在 Application 和 第一个 Activity 中,减少 onCreate() 方法的工作量,从而缩短冷启动的时间。像应用中嵌入的一些第三方 SDK,都建议在 Application 中做一些初始化工作,开发人员不妨采取懒加载的形式移除这部分代码,而在真正需要用到第三方 SDK 时再进行初始化。

我们可以通过主题中的 windowBackground 属性,自定义应用启动时的窗口背景

1.在res/drawable下创建一个launch_screen.xml文件,并写下下面的内容

其中@drawable/ic_app_logo是一张图片,来自drawable文件夹下
其中@color/background_material_light,来自colors.xml文件

1
2
3
4
5
6
7
8
9
10
11
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<color android:color="@color/background_material_light" />
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_app_logo"
android:tileMode="disabled" />
</item>
</layer-list>

2. 在styles.xml文件下创建SplashTheme的主题,引入bg_splash

1
2
3
4
5
6
7
8
9
10
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
</resources>

3.在你的启动界面中引入SplashTheme,如下

1
2
3
4
5
6
7
8
9
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
android:noHistory="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

扩展

冷启动耗时统计

adb 命令统计

参考如何计算 App 的启动时间

adb命令 : adb shell am start -S -W 包名/启动类的全限定名 , -S 表示重启当前应用

更多adb命令

1
2
3
4
5
6
7
8
9
C:\Android\Demo>adb shell am start -S -W com.example.moneyqian.demo/com.example.moneyqian.demo.MainActivity
Stopping: com.example.moneyqian.demo
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.moneyqian.demo/.MainActivity }
Status: ok
Activity: com.example.moneyqian.demo/.MainActivity
ThisTime: 2247
TotalTime: 2247
WaitTime: 2278
Complete
  1. ThisTime : 最后一个 Activity 的启动耗时(例如从 LaunchActivity - >MainActivity「adb命令输入的Activity」 , 只统计 MainActivity 的启动耗时)

  2. TotalTime : 启动一连串的 Activity 总耗时.(有几个Activity 就统计几个)

  3. WaitTime : 应用进程的创建过程 + TotalTime .

Application 优化

Application 作为 应用程序的整个初始化配置入口,时常担负着它不应该有的负担~
有很多第三方组件(包括App应用本身)都在 Application 中抢占先机,完成初始化操作。
但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能
通常,有机会优化这些工作以实现性能改进,这些常见问题包括:

  • 复杂繁琐的布局初始化
  • 阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.
  • Bitmap 大图片或者 VectorDrawable加载
  • 其它占用主线程的操作
    我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :
  1. 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
  2. 组件一定要在主线程中初始化,但是可以延迟初始化。
  3. 组件可以在子线程中初始化。

放在子线程的组件初始化建议延迟初始化 ,这样就可以了解是否会对项目造成影响!
所以对于上面的分析,我们可以在项目中 Application 的加载组件进行如下优化 :

将Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)

1
2
3
4
5
6
7
8
9
new Thread(new Runnable() {
@Override
public void run() {
//设置线程的优先级,不与主线程抢资源
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//子线程初始化第三方组件
Thread.sleep(5000);//建议延迟初始化,可以发现是否影响其它功能,或者是崩溃!
}
}).start();

将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(原本是想在入口 Activity 中进行此项操作,不过组件的初始化放在 Application 中统一管理为妙.)

1
2
3
4
5
6
handler.postDelayed(new Runnable() {
@Override
public void run() {
//延迟初始化组件
}
}, 3000);

如何统计Android App启动时间

来源

Android 性能优化—— 启动优化提升60%

其他文章
目录导航 置顶
  1. 1. 前言
    1. 1.1. 1.在res/drawable下创建一个launch_screen.xml文件,并写下下面的内容
    2. 1.2. 2. 在styles.xml文件下创建SplashTheme的主题,引入bg_splash
    3. 1.3. 3.在你的启动界面中引入SplashTheme,如下
  2. 2. 扩展
    1. 2.1. 冷启动耗时统计
  3. 3. Application 优化
  4. 4. 来源
请输入关键词进行搜索