1.高耗时任务:

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

2.复杂的View层级:

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

3.类过于复杂:

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

4.主题及Activity配置:

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

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

1.MultiDex

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

  • 解决方案:

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

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

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

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

5.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

5.插件化或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语句、控制并发和事务等等,其他常见的数据库框架如:Realm、DBFlow等等,使用起来也很方便,但他们的初始化,尤其是需要升级、迁移数据时,往往会带来不小的CPU和I/O开销,一旦数据量比较多(比如:很长时间的聊天记录、浏览器浏览历史记录等),往往都需要专门一个界面来告知用户:APP正在做数据处理工作。所以,如果为了提高APP启动速度,避免在APP启动时做数据库的耗时任务,很有必要!

  • 解决方案:

1.必要数据避免使用数据库:如果首屏的展示内容需要根据配置来决定,那么干脆放弃数据库存储和读取,直接放在文件、SharedPreference里面,特别是多组键值对的读取,如果使用数据库,在除过初始化占用的时间以后,可能还需要30~50ms来完成(因为需要多次读取),而如果存在SharedPreference中,即使是转换成JSON并解析,可能也就在10ms之内

2.数据库预先异步初始化:使用greenDAO时,预先初始化很有必要,可以保证在第一次读取数据库时,不占用主线程资源,防止拖慢启动速度,具体做法如下:

// Application
override fun onCreate() {
super.onCreate()
// 使用Anko提供的异步工作协程,或者自行创建一个并发线程池
doAsync {
DbManager.daoSession // 获取一次greenDao的DaoSession实例化对象即可

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!

由于文章篇幅问题 查看详细文章以及获取学习笔记链接:GitHub

  • Android进阶学习全套手册
    关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。

  • Android高级架构师进阶知识体系图
    关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!

  • Android对标阿里P7学习视频

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
    外链图片转存中…(img-zeEsDUzB-1711040167051)]

  • BATJ大厂Android高频面试题
    这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐