Android启动速度优化

本文探讨了影响Android启动速度的因素,包括高耗时任务、复杂的View层级、类的复杂性和主题配置。提出了一些优化方案,如MultiDex优化、Glide使用策略、数据库预加载和主题选择。通过减少布局层级、预加载组件和合理安排任务,可以显著提高APP启动速度,提升用户体验。
摘要由CSDN通过智能技术生成

欢迎访问我的个人网站:https://coderyuan.com

最近做了一些Android App启动速度的优化,有一些心得,整理整理

影响启动速度的原因

高耗时任务

数据库初始化、某些第三方框架初始化、大文件读取、MultiDex加载等,导致CPU阻塞

复杂的View层级

使用的嵌套Layout过多,层级加深,导致View在渲染过程中,递归加深,占用CPU资源,影响Measure、Layout等方法的速度

类过于复杂

Java对象的创建也是需要一定时间的,如果一个类中结构特别复杂,new一个对象将消耗较高的资源,特别是一些单例的初始化,需要特别注意其中的结构

主题及Activity配置

有一些App是带有Splash页的,有的则直接进入主界面,由于主题切换,可能会导致白屏,或者点了Icon,过一会儿才出现主界面

一些典型的例子及优化方案

MultiDex

由于Android 5.0以下使用的Dalvik虚拟机天生对MultiDex支持不好,导致在4.4(及以下)的系统上,如果使用了MultiDex做为分包方案,启动速度可能会慢的多,实际数值跟dex文件的大小、数量有关,估计会慢300~500ms

  • 解决方案:

    限制APP在5.0以上使用:目前大多数用户已经在使用Android 5.0以上的版本了,当然,还有很多4.4用户,很多APP也是只支持4.4以上(比如:百度APP),为了用户体验,可以考虑舍弃一部分用户

    优化方法数:尽量避免方法超过65535个,同时可以开启Release配置的Minify选项,打包时删掉没有用的方法,不过如果框架引用的较多,基本没效果

    少用一些不必要的框架:有些框架功能很强大,但不一定都能用得上,引进来会新增很多的方法,导致必须开启MultiDex,可以自己造轮子,或者找轻量级的框架

    慎用Kotlin:由于Kotlin现在还没有内置在Android系统中,所以APP如果使用了Kotlin,可能会导致引入很多的Kotlin方法,导致必须分割Dex,这个有待Google在Android P中解决

    Dex懒加载:在APP功能日益复杂的今天,MultiDex几乎是已经无法避免了,为了启动速度的优化,可以将启动时必需的方法,放在主Dex中(即classes.dex),方法是在Gradle脚本中配置multiDexKeepFile或者multiDexKeepProguard属性(代码如下),详见:官方文档,待App启动完成后,再使用MultiDex.install来加载其他的Dex文件。这种方法风险比较高,而且实现成本比较大,如果启动依赖的库比较多,还是无法实现

    android {
        buildTypes {
            release {
                multiDexKeepFile file('multidex-config.txt')        // multiDexKeepFile规则 
                multiDexKeepProguard file('multidex-config.pro')    // 类似ProGuard的规则
            }
        }
    }

    配置文件示例:

    
    # 常规的multiDexKeepFile规则
    
    
    com/example/MyClass.class
    com/example/MyOtherClass.class
    
    
    # 类似ProGuard规则
    
    
    -keep class com.example.MyClass
    -keep class com.example.MyClassToo
    
    -keep class com.example.** { *; } // All classes in the com.example package

    插件化或H5/React Native方案:即端只提供Native调用能力和容器,业务由插件来做,本地只需要加载基础的Native能力相关类即可,其他完全下发,或内置成资源文件调用

Glide及其他图片框架

Glide是一个很好用的图片加载框架,除了常用的图片加载、缓存功能以外,Glide支持对网络层进行定制,比如换成OkHttp来支持HTTP 2.0。不过,如果在追求启动速度的情况下,在Splash页或主界面加载某一张图片时,往往是第一次使用Glide,由于Glide没有初始化,会导致这次图片加载的时间比较长(不管本地还是网络),特别是在其他操作也在同时抢占CPU资源的时候,慢的特别明显!而后面再使用Glide加载图片时,还是比较快的

Glide初始化耗时分析:Glide的初始化会加载所有配置的Module,然后初始化RequestManager(包括网络层、工作线程等,比较耗时),最后还要应用一些解码的选项(Options)

解决方案:在Application的onCreate方法中,在工作线程调用一次GlideApp.get(this)

    override fun onCreate() {
        super.onCreate()
        // 使用Anko提供的异步工作协程,或者自行创建一个并发线程池
        doAsync {
            GlideApp.get(this)   // 获取一个Glide对象,Glide内部会进行初始化操作
        }
    }

greenDAO和其他数据库框架

greenDAO实现了一种ORM框架,数据库基于SQLite,使用起来很方便,不需要自己写SQL语句、控制并发和事务等等,其他常见的数据库框架如:

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值