Android 性能优化 (十) 启动优化 秒变大神 启动优化提升60%

 

  Android 性能优化 (一)APK高效瘦身 
http://blog.csdn.net/whb20081815/article/details/70140063
Android 性能优化 (二)数据库优化 秒变大神
http://blog.csdn.net/whb20081815/article/details/70142033
  Android 性能优化(三)布局优化 秒变大神 
http://blog.csdn.net/whb20081815/article/details/70147958
 Android 性能优化(四)内存优化OOM 秒变大神
 http://blog.csdn.net/whb20081815/article/details/70243105
Android 性能优化(五)ANR 秒变大神
http://blog.csdn.net/whb20081815/article/details/70245594
Android 性能优化(六) RelativeLayout和LinearLayout性能比较
http://blog.csdn.net/whb20081815/article/details/74465870
  Android 性能优化<七>自定义view绘制优化 
http://blog.csdn.net/whb20081815/article/details/74474736

Android 性能优化<八> 多线程优化和线程管理
https://blog.csdn.net/WHB20081815/article/details/77775444

Android 性能优化 <九>RecyclerView替代Listview用法
https://blog.csdn.net/WHB20081815/article/details/76221998

 

1.计算启动的时间

2.冷启动和热启动原理

3.actiivity的启动流程和界面绘制

4.解决冷启动慢的方法(懒加载和背景替换)

 

 

冷启动耗时统计

 

adb 命令统计

 

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

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

更多adb命令

 

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

 

 

ThisTime : 最后一个 Activity 的启动耗时(例如从 LaunchActivity - >MainActivity「adb命令输入的Activity」 , 只统计 MainActivity 的启动耗时)

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

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

 

 

在第①个时间段内,AMS 创建 ActivityRecord 记录块和选择合理的 Task、将当前Resume 的 Activity 进行 pause.

在第②个时间段内,启动进程、调用无界面 Activity 的 onCreate() 等、 pause/finish 无界面的 Activity.

在第③个时间段内,调用有界面 Activity 的 onCreate、onResume.

//ActivityRecord

 

    private void reportLaunchTimeLocked(final long curTime) {

  ``````

        final long thisTime = curTime - displayStartTime;

        final long totalTime = stack.mLaunchStartTime != 0 ? (curTime - stack.mLaunchStartTime) : thisTime;

    }

 

最后总结一下 : 如果需要统计从点击桌面图标到 Activity 启动完毕,可以用WaitTime作为标准,但是系统的启动时间优化不了,所以优化冷启动我们只要在意 ThisTime 即可。

 

 

系统日志统计

 

另外也可以根据系统日志来统计启动耗时,在Android Studio中查找已用时间,必须在logcat视图中禁用过滤器(No Filters)。因为这个是系统的日志输出,而不是应用程序的。你也可以查看其它应用程序的启动耗时。

 

过滤displayed输出的启动日志.

 

 

 

Application 优化(懒加载)

 

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

 

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

 

但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能

 

通常,有机会优化这些工作以实现性能改进,这些常见问题包括:

 

复杂繁琐的布局初始化

阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.

Bitmap 大图片或者 VectorDrawable加载

其它占用主线程的操作

我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :

 

必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)

组件一定要在主线程中初始化,但是可以延迟初始化。

组件可以在子线程中初始化。

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

 

所以对于上面的分析,我们可以在项目中 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);

 

 

一、应用的启动方式

  通常来说,启动方式分为两种:冷启动和热启动。

  1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。

  2、热启动:当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。

  特点

  1、冷启动:冷启动因为系统会重新创建一个新的进程分配给它,所以会先创建和初始化Application类,再创建和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。

  2、热启动:热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,

  因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

二、应用的启动过程

  冷启动启动流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的               

  windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,

  应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。所以,总结一下,应用的启动流程如下:

  Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。

来源: https://www.cnblogs.com/xunzhi/p/5794793.html

 

 

Android冷启动时间优化

 

     冷启动时间是指当用户点击你的app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局

冷启动时间优化

  知道了Android冷启动时间的原理之后,就可以通过一些小技巧来对冷启动时间进行优化,从而让你app加载变得”快“一些(视觉体验上的快)。我们可制作一个启动Activity的背景样式的.9图片,然后把这个.9图片做为windowBackground。

  

  图片制作好之后,我们就可以用它做为app冷启动阶段的预览元素,如下设置:

  • 为启动的Activity自定义一个Theme

    1

    2

    3

    <style name="AppTheme.Launcher">

        <item name="android:windowBackground">@drawable/window_background_statusbar_toolbar_tab</item>

    </style>

      

  • 将新的Theme应用到设置到AndroidManifest.xml

    1

    2

    3

    4

    5

    6

    7

    8

    9

    <activity

        android:name=".MainActivity"

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

      

        <intent-filter>

            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>

    </activity>

      

  • 由于给MainActivity设置了一个新的Theme,这样做会覆盖原来的Theme,所以在MainActivity中需要设置回原来的Theme

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值