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

使用发动速度

一个使用App的发动速度能够影响用户的初次体会,发动速度较慢(感官上)的使用或许导致用户再次敞开App的意图下降,或许卸载放弃该使用程序

本文将从两个方向优化使用的发动速度 :

1.视觉体会优化 2.代码逻辑优化

视觉优化

使用程序发动有三种状况,每种状况都会影响使用程序对用户可见所需的时刻:冷发动,热发动和温发动

关于这3种发动办法,能够检查谷歌开发文档

咱们常说的是冷发动和热发动

1.冷发动:当发动使用时,后台没有该使用的进程,这时体系会从头创立一个新的进程分配给该使用,这个发动办法便是冷发动 2.热发动:当发动使用时,后台已有该使用的进程(例:按back键、home键,使用虽然会退出,可是该使用的进程是依然会保留在后台,可进入使命列表检查),所以在已有进程的情况下,这种发动会从已有的进程中来发动使用,这个办法叫热发动

在冷发动时,使用程序从头开始。在其他状况下,体系需要将正在运转的使用程序从后台运转到前台。咱们建议您始终依据冷发动的假定进行优化。这样做也能够改善热发动和温发动的功用

在冷发动开始时,体系有三个使命。这些使命是:

1.加载并发动使用程序 2.发动后当即显现使用程序空白的发动窗口 3.创立使用程序进程

一旦体系创立使用程序进程,使用程序进程就会负责下一阶段,这些阶段包括:

1.创立app对象 2.发动主线程(main thread) 3.填充加载布局Views 4.在屏幕上履行View的制作进程.measure -> layout -> draw

使用程序进程完结第一次制作后,体系进程会交换当前显现的布景窗口,将其替换为主活动。此刻,用户能够开始使用该使用程序

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

由于App使用进程的创立进程是由手机的软硬件决定的,所以咱们只能在这个创立进程中视觉优化

发动主题优化

所谓的主题优化,便是使用程序在冷发动的时分(1~2阶段),设置发动窗口的主题

由于现在 App 使用发动都会先进入一个闪屏页(LaunchActivity) 来展现使用信息

默许情况下会出现白屏现象,体系默许会在发动使用程序的时分 发动空白窗口 ,直到 App 使用程序的进口 Activity 创立成功,视图制作结束体系默许会在发动使用程序的时分 发动空白窗口 ,直到 App 使用程序的进口 Activity 创立成功,视图制作结束体系默许会在发动使用程序的时分 发动空白窗口 ,直到 App 使用程序的进口 Activity 创立成功,视图制作结束

解决办法可检查Android发动界面SplashActivit的完结办法

代码优化

Android中如何核算 App 的发动时刻

依据上面发动时刻的输出统计,咱们就能够先记载优化前的冷发动耗时,然后再比照优化之后的发动时刻

Application 优化

Application 作为 使用程序的整个初始化配置进口,经常担负着它不应该有的负担~

有很多第三方组件(包括App使用自身)都在 Application 中抢占先机,完结初始化操作

可是在 Application 中完结繁重的初始化操作和杂乱的逻辑就会影响到使用的发动功用

一般,有时机优化这些工作以完结功用改善,这些常见问题包括:

1.杂乱繁琐的布局初始化 2.堵塞主线程 UI 制作的操作,如 I/O 读写或许是网络拜访 3.Bitmap 大图片或许 VectorDrawable加载 4.其它占用主线程的操作

咱们能够依据这些组件的轻重缓急之分,对初始化做一下分类

1.必要的组件一定要在主线程中当即初始化(进口 Activity 或许当即会用到) 2.组件一定要在主线程中初始化,可是能够推迟初始化 3.组件能够在子线程中初始化

放在子线程的组件初始化建议推迟初始化 ,这样就能够了解是否会对项目造成影响

所以对于上面的剖析,咱们能够在项目中 Application 的加载组件进行如下优化 :

  • 将Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)
new Thread(new Runnable() {
      @Override
      public void run() {
        //设置线程的优先级,不与主线程抢资源
        Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
        //子线程初始化第三方组件
        Thread.sleep(5000);//建议推迟初始化,能够发现是否影响其它功用,或许是溃散!
       }
     }).start();
  • 将需要在主线程中初始化可是能够不用当即完结的动作推迟加载(原本是想在进口 Activity 中进行此项操作,不过组件的初始化放在 Application 中统一管理为妙)
handler.postDelayed(new Runnable() {
      @Override
      public void run() {
        //推迟初始化组件
       }
     }, 3000);

闪屏页事务优化

最终还剩下那些为数不多的组件在主线程初始化动作,例如埋点,点击流,数据库初始化等,不过这些耗费的时刻能够在其它地方相抵

需求布景: 使用App一般会设置一个固定的闪屏页展现时刻,例如2000ms,所以咱们能够依据用户手机的运转速度,对展现时刻做出调整,可是总时刻仍然为 2000ms

闪屏页展现总时刻 = 组件初始化时刻 + 剩下展现时刻

也便是2000ms的总时刻,组件初始化了800ms,那么就再展现1200ms即可

Application 初始化后会调用 attachBaseContext() 办法,再调用 Application 的 onCreate(),再到进口 Activity的创立和履行 onCreate() 办法。所以咱们就能够在 Application 中记载发动时刻

//Application
@Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    SPUtil.putLong("application_attach_time", System.currentTimeMillis());//记载Application初始化时刻
   }

有了发动时刻,咱们得知道进口的 Acitivty 显现给用户的时刻(View制作结束),在onWindowFocusChanged()的回调时机中表示能够获取用户的触摸时刻和View的流程制作结束,所以咱们能够在这个办法里记载显现时刻

//Activity
@Override
  public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
 
     long appAttachTime = SPUtil.getLong("application_attach_time");
     long diffTime = System.currentTimeMillis() - appAttachTime;//从application到进口Acitity的时刻
     //所以闪屏页展现的时刻为 2000ms - diffTime.
   }

所以咱们就能够动态的设置使用闪屏的显现时刻,尽量让每一部手机展现的时刻共同,这样就不会让手机配置较低的用户感觉漫长难熬的闪屏页时刻(例如初始化了2000ms,又要展现2000ms的闪屏页时刻.),优化用户体会

广告页优化

闪屏页过后就要展现金主爸爸们的广告页了

由于项目中广告页图片有或许是大图,APng动态图片,所以需要将这些图片下载到本地文件,下载完结后再显现,这个进程往往会遇到以下两个问题 :

  • 广告页的下载,由于这个是一个异步进程,所以往往不知道加载到页面的适宜时机
  • 广告页的保存,由于保存是 I/O 流操作,很有或许被用户中断,下次拿到破损的图片

由于不清楚用户的网络环境,有些用户下载广告页或许需要一段时刻,这时分又不或许无限的等候。所以针对这个问题咱们能够敞开 IntentService 用来下载广告页图片

在进口 Acitivity 中敞开 IntentService 来下载广告页。 或许是其它异步下载操作

在广告页图片 文件流完全写入后 记载图片大小,或许记载一个标识

在下次的广告页加载中能够判别是否已经下载好了广告页图片以及图片是否完整,否则删除而且再次下载图片

另外由于在闪屏页中仍然有 剩下展现时刻,所以在这个时刻段里假如用户已经下载好了图片而且图片完整,就能够显现广告页。否则进入主 Activity , 由于 IntentService 仍然在后台持续默默的下载并保存图片~

最终

假如你看到了这儿,觉得文章写得不错就给个赞呗?假如你觉得那里值得改善的,请给我留言。一定会仔细查询,批改不足。谢谢。

更多Android进阶指南 能够具体Vx重视大众号:Android老皮 解锁 《Android十大板块文档》

1.Android车载使用开发体系学习指南(附项目实战)

2.Android Framework学习指南,助力成为体系级开发高手

3.2023最新Android中高级面试题汇总+解析,离别零offer

4.企业级Android音视频开发学习道路+项目实战(附源码)

5.Android Jetpack从入门到通晓,构建高质量UI界面

6.Flutter技术解析与实战,跨渠道首要之选

7.Kotlin从入门到实战,全方面提升架构根底

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 功用优化实战+360全方面功用调优

10.Android零根底入门到通晓,高手进阶之路

敲代码不易,重视一下吧。ღ( ・ᴗ・` )