Fly

未来 ,为谁而来我不知道 ;我知道的是 ,今天 ,必定为我们而来 !

android app的启动优化方法

qq交流群:668524118


1. 安卓的启动方式

1.1 冷启动

冷启动时app的进程没有被创建。系统冷启动一个app需要完成三个任务:1. 加载和启动app 2.在app刚启动时立即为app显示一个空白的开始窗口 3.创建app进程 当系统创建了app进程后,app进程负责处理接下来的任务: 1.创建app这个对象 2.启动主线程 3.创建main activity 4.加载相应的views 5.layout the screen 6.执行初始的绘制流程 当app进程完成初始画面的绘制之后,系统进程会将当前显示的空白后台窗口替换为main activity的画面。

1.2 热启动

热启动时,系统做的是将你的activity移到前台。如果该app的activity依然在内存中,那么就可以避免对象初始化,布局加载和渲染的时间。 热启动和冷启动的场景一样,都会在activity结束渲染该activity之前先显示一个空白的窗口。

1.3 微热启动

2. app启动时的一些常见问题

2.1 比较重的app初始化

一些不需要的初始化操作,application的onCreate中执行一些diskIO或者发生GC。诊断问题的方法包括method tracing或者inline tracing。 Method tracing可以诊断出Application.onCreate函数的执行是否花费了较多时间。 Inline tracing则可以发现一些全局单例对象、diskI/o,反序列化或者循环导致的问题。

解决这些问题的方法: 如果是非必要的初始化或者diskI/O导致的问题,那么可以通过懒加载的方式来解决,即只初始化那些拿上需要用的对象。例如,与其创建全局的静态对象,不如把它移到一个单例中,这样对象只会在首次需要的时候才初始化。或者采用类似Dagger之类的依赖注入框架,这种框架只会在需要的时候才加载该类并创建对象。

2.2 比较重的activity初始化

常见的activity导致启动较慢的问题有:

  • 加载大的或者复杂的布局
  • 在ui线程中进行磁盘或者网络io
  • 加载和加码bitmap
  • 初始化activity的其他子系统 诊断方式:通过method tracing或者inline tracing。 

解决问题的方法: 

             1.减少布局的层级,并且不加载不需要显示的view,可以用viewstub来替代。

  1. 将所有的资源的初始化工作到另一个线程。
  2. 先显示部分view,然后再更新一些依赖bitmap或者资源的视觉特性

2.3 改变起始的启动窗口

如果你想提升app的视觉提升体验,给用户更快的启动速度体验。你可以将app显示首屏画面前的那个空白的背景窗口改成与app主题类似的主题或者直接禁止显示该空白窗口。

例如,你可以创建一个drawble文件,然后在style中创建一个theme并且引用你创建的drawble。 然后再在Androidmanifest文件中设置主题为你新建的那个样式。

Layout XML file:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
  <!-- The background color, preferably the same as your normal theme -->
  <item android:drawable="@android:color/white"/>
  <!-- Your product logo - 144dp color version of your app icon -->
  <item>
    <bitmap
      android:src="@drawable/product_logo_144dp"
      android:gravity="center"/>
  </item>
</layer-list>

Manifest file:

<activity ...
android:theme="@style/AppTheme.Launcher" />

然后在Activity的oncreate中在super.onCreate()函数前将主题设置回你需要的样子。

public class MyMainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.Theme_MyApp);
    super.onCreate(savedInstanceState);
    // ...
  }
}
阅读更多
个人分类: Android开发
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

android app的启动优化方法

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭