关于Android冷启动耗时优化详解

目录
  • 1,背景
  • 2,调研
    • 2.1,Android中启动的方式
    • 2.2,冷启动流程
    • 2.3,启动时间
  • 3,方案
    • 1,冷启动白屏现象
    • 2,启动时间优化
  • 总结

1,背景

最近开发了一个新的App,前期工期紧,做的比较粗放,上线以后发现App启动时间比较长,达到3秒,

启动有白屏,体验也不好,这个只能后期优化了,最好是前期开发就考虑的

2,调研

2.1,Android中启动的方式

1,冷启动:如果App启动时,后台没有该应用进程,那么系统会重新创建一个进程分配给该应用,这种启动方式就是冷启动

2,热启动:如果App启动时,后台有该应用进程,那么系统就是直接使用已有进程

从两种启动方式的含义就可以看出,冷启动比较耗时,热启动一般比较快,我们要做的启动优化一般做的就是冷启动优化

2.2,冷启动流程

系统创建应用进程时间我们一般无法优化,这个是系统创建简单的流程

我们可以优化的地方就是

1,Application
2,SplashActivity
3,MainActivity

2.3,启动时间

1,通过命令

adb shell am start -W [packageName]/[packageName.MainActivity]
这个时候,如果启动的activity在Manifest中没有设置export:true,可能无法通过命令打开,需要设置这个

2,自己埋点

从上面的启动过程就可以知道,Android冷启动,系统要先创建一个进程,然后创建Application,系统创建进程的过程,我们可以在Application的attachBaseContext方法中开始埋点

/**
* 统计冷启动各个时间点的耗时
*/
public class StartLogHelper {

    private static final String TAG = "StartLogHelper";
    private static long startTime;

    /**
     * 设置开始时间,暂时放到启动的时间,放到Application的attachBaseContext方法中
     * @param start
     */
    public static void setStart(long start){
        startTime = start;
    }

    /**
     * application初始化的时间,放到Application的onCreate方法最后
     */
    public static void getApplicationTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getApplicationTime==" + (end - startTime));

    }

    /**
     * 欢迎页初始化的时间
     */
    public static void getWelcomeTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getWelcomeTime==" + (end - startTime));
    }

    /**
     * Main页面初始化的时间
     */

    public static void getMainTime(){
        long end = System.currentTimeMillis();
        DebugLog.e(TAG,"==================getMainTime==" + (end - startTime));
    }

3,在studio的logcat日志中

在logcat日志中输入应用的包名

然后就可以看到各个阶段的时间了

3,方案

从调研冷启动的原理就可以得出,我们要优化的地方

1,冷启动白屏现象

冷启动的时候,我们发现会有白屏现象,会先出现一个白屏,然后在出现欢迎页的UI,这个跟系统的设置的背景windowBackground有关系

解决方案:

在欢迎页设置一个自定义的theme属性

SplashActivity的清单文件设置
   android:theme="@style/SplashScreenTheme”

SplashScreenTheme属性定义
   <style name="SplashScreenTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/bg_splash</item>
   </style>

bg_splash定义
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />
        <bitmap
            android:antialias="true"
            android:gravity="center"
            android:src="@drawable/bg_show" />
    </item>
</layer-list>
其中bg_show的图片和欢迎页的初始图片一样,这样就可以实现启动白屏的样式
和欢迎页样式一样,给人没有白屏的感觉

2,启动时间优化

我们从上面的启动时间就可以知道

1,Application onCreate中初始化三方sdk耗时

public class AppConfigHelper {
    public void setAppConfig(Application application){
        addSyncTask(application);
        addAsyncTask(application);
        TaskConfigManager.getInstance().startInit();
    }

    private void addSyncTask(Application application) {
        TaskConfigManager.getInstance().addTask(new ZMLTask("oneLogin") {
            @Override
            public void run() {
                JVerifyHelper.init(application);
            }
        });
    }
}
把需要在Application中同步执行的放到一起

可以异步执行的放到一起

2,首页耗时方法

到首页的时候,我们埋点的时间,小于用户看到数据的时间 这个是因为首页加载的数据比较多 我们首页同时加载了7个Fragment,同时请求10个以上接口

1,首页做懒加载,保证App启动接口只请求3个左右

2,首页UI优化,同时显示出ui以后在执行后面逻辑处理

3,首页部分不重要逻辑做延时加载,比如请求升级弹窗等

总结

到此这篇关于关于Android冷启动耗时优化详解的文章就介绍到这了,更多相关Android冷启动优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android冷启动实现app秒开的实现代码

    本文介绍了Android冷启动实现app秒开的实现代码,分享给大家,具体如下: AndroidManifest里对应activity添加属性android:theme="@style/AppSplash" <activity android:name="com.senyint.edu.college.stu.view.activity.SplashActivity" android:screenOrientation="portrait"

  • 解决Android应用冷启动时出现的白屏问题的方法

    Android 应用冷启动时,需要从Application开始启动,加载时间就会比较长,容易出现白色或黑色闪屏,观察一下手机上一些 其他APP 比如 微信.京东等就不存在这个现象. 原因分析 分析一下原因,其实是跟闪屏Activity的主题有关,比如使用了Theme.AppCompat.Light.DarkActionBar主题的话,其中指定了windowBackground,所以背景就是白色的了. 复制代码 代码如下: <itemname="android:windowBackgroun

  • 浅谈android性能优化之启动过程(冷启动和热启动)

    本文介绍了浅谈android性能优化之启动过程(冷启动和热启动) ,分享给大家,具体如下: 一.应用的启动方式 通常来说,启动方式分为两种:冷启动和热启动. 1.冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动. 2.热启动:当启动应用时,后台已有该应用的进程(例:按back键.home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热

  • 详解Android冷启动实现APP秒开的方法

    一.前言 在阅读这篇文章之前,首先需要理解几个东西: 1.什么是Android的冷启动时间? 冷启动时间是指用户从手机桌面点击APP的那一刻起到启动页面的Activity调用onCreate()方法之间的这个时间段. 2.在冷启动的时间段内发生了什么? 首先我们要知道当打开一个Activity的时候发生了什么,在一个Activity打开时,如果该Activity所属的Application还没有启动,那么系统会为这个Activity创建一个进程(每创建一个进程都会调用一次Application,

  • Android性能之冷启动优化详析

    1.前言 APP冷启动比较慢,点击桌面图片需要用户等待很久,体验较差. 2.APP启动方式 冷启动(Cold start) 场景:冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动. 可见冷启动的必要条件是该APP进程不存在,这就意味着系统需要创建进程,APP需要初始化.在这三种启动方式中,冷启动耗时最长,对于冷启动的优化也是最具挑战的.因此本文重点谈论的是对冷启动相关的优化. 生命周期:Process.start->Application创建->attachBas

  • 关于Android冷启动耗时优化详解

    目录 1,背景 2,调研 2.1,Android中启动的方式 2.2,冷启动流程 2.3,启动时间 3,方案 1,冷启动白屏现象 2,启动时间优化 总结 1,背景 最近开发了一个新的App,前期工期紧,做的比较粗放,上线以后发现App启动时间比较长,达到3秒, 启动有白屏,体验也不好,这个只能后期优化了,最好是前期开发就考虑的 2,调研 2.1,Android中启动的方式 1,冷启动:如果App启动时,后台没有该应用进程,那么系统会重新创建一个进程分配给该应用,这种启动方式就是冷启动 2,热启动

  • Android Gradle同步优化详解

    目录 动态修改gradle配置 hook agp ProjectsServices 方法签名检查是否存在support包 年初开始我们就开始了关于Gradle Sync阶段的优化.之前和大家都简单的介绍过工程相关的背景情况了,我们大概有400+的Module,然后一次的同步时间就非常的慢,我们迫切的需要对这个问题进行优化.大部分工作都是和团队内的同学一起完成的,我也只出了一点点力而已. 这次写文章真的很倒霉,之前忘了保存导致要重新开始写了.如果不是白嫖了掘金的端午礼盒,拿人手短啊,我已经打算鸽了

  • Android图片性能优化详解

    1. 图片的格式 目前移动端Android平台原生支持的图片格式主要有:JPEG.PNG.GIF.BMP.和WebP(自从Android 4.0开始支持),但是在Android应用开发中能够使用的编解码格式只有三种:JPEG.PNG.WebP,图片格式可以通过查看Bitmap类的CompressFormat枚举值来确定. public static enum CompressFormat { JPEG. PNG. WebP; private CompressFormat() { } } 如果要在

  • Android性能优化之弱网优化详解

    目录 弱网优化 1.Serializable原理 1.1 分析过程 1.2 Serializable接口 1.3 ObjectOutputStream 1.4 序列化后二进制文件的一点解读 1.5 常见的集合类的序列化问题 1.5.1 HashMap 1.5.2 ArrayList 2.Parcelable 2.1 Parcel的简介 2.2 Parcelable的三大过程介绍(序列化.反序列化.描述) 2.2.1 描述 2.2.2 序列化 2.2.3 反序列化 2.3 Parcelable的实

  • Android分包MultiDex策略详解

    1.分包背景 这里首先介绍下MultiDex的产生背景. 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一

  • Android HandlerThread使用方法详解

    Android HandlerThread使用方法详解 HandlerThread 继承自Thread,内部封装了Looper. 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作). 用法: import android.app.Activity; import android.os.Bundle; import androi

  • Android UI 实现老虎机详解及实例代码

    Android UI 实现老虎机详解 listview 的使用步骤 简单的listview老虎机实现 1.实现效果图 2.需要掌握的知识 listview的使用步骤 listview的Adapter接口的实现 listview中的MVC 3.知识详解 ListView 是一个控件,一个在垂直滚动的列表中显示条目的一个控件,这些条目的内容来自于一个ListAdapter .EditText Button TextView ImageView Checkbox 五大布局. 1.布局添加Listvie

  • Android ProgressDialog的实例详解

    Android ProgressDialog的实例详解 当自己做一些耗时操作时,希望给用户一些提示信息,告诉用户正在进行耗时操作,这时就可以用到ProgressDialog. 1.新建一个全局变量ProgressDialog private ProgressDialog mDialog; 2.设置ProgressDialog的相关参数: progressDialog = new ProgressDialog( ProgressDialogActivity.this); //设置进度条风格,风格为

  • 基于js文件加载优化(详解)

    在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行. 所以,在这里,我们可以对其进行很多优化工作. 放置在BODY底部 为了让渲染引擎能够及早的将DOM树给渲染出来,我们需要将script放在body的底部,让页面尽早脱离白屏的现象,即会提早触发DOMContentLoaded事件. 但是由于在IOS Safari, Android browser以及IOS webview里面即使你把js脚本放到

  • 史上最全Android build.gradle配置详解(小结)

    Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项目时会包含两个Android build.gradle配置详解文件,如下图: 一.Project的build.gradle文件: 对应的build.gradle代码如下: // Top-level build file where you can add configuration options

随机推荐