这篇文章主要介绍“启动优化的方法有哪些”,在日常操作中,相信很多人在启动优化的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”启动优化的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
首先了解下启动的这三个概念,也是面试常被问到的:
冷启动
。冷启动指的是该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程并启动app。比如开机后,点击屏幕的app图标启动应用。
冷启动的过程主要分为两步:
1)系统任务
。加载并启动应用程序;显示应用程序的空白启动窗口;创建APP进程
2)APP进程任务
。启动主线程;创建Activity;加载布局;屏幕布局;绘制屏幕
其实这不就是APP的启动流程嘛?所以冷启动是会完整走完一个启动流程的,从系统到进程。
温启动
。温启动指的是App进程存在,但Activity可能因为内存不足被回收,这时候启动App不需要重新创建进程,只需要执行APP进程中的一些任务,比如创建Activity。比如返回Home后,又继续使用其他的APP,时间久了或者打开的应用多了,之前应用的Activity有可能被回收了,但是进程还在。
所以温启动过程相当于执行了冷启动的第二过程,也就是APP进程任务,需要重新启动线程,Activity等。
热启动
。热启动就是指App进程存在,并且Activity对象仍然存在内存中没有被回收。比如app被切到后台,再次启动app的过程。
所以热启动的开销最少,这个过程只会把Activity从后台展示到前台,无需初始化,布局绘制等工作。
三种启动方式中,冷启动经历的时间最长,也是走完了最完整的启动流程,所以我们再次分析下冷启动的启动流程,看看有哪些可以优化的点:
纵观整个流程,其实我们能动的地方不多,无非就是Application
的attach,onCreate方法,Activity
的onCreate,onResume方法,这些方法也就是我们的优化点。
App启动的时候会有一个白屏/黑屏时间,我们可以通过设置windowBackground
属性来给启动的Activity
提供一个drawable,这样就给用户一个快递启动的假象了。
<activity ...
android:theme="@style/MyAppTheme" />
<style name="MyAppTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/logo</item>
</style>
Application
的onCreate
方法中,总会有很多初始化操作,比如友盟,数据库,网络请求库,广告SDK等等。
对此,我们能做的有哪些呢?
异步加载
。有些库不需要在主线程进行初始化,那么我们就可以在子线程中进行初始化,进行异步加载。延迟加载
。有些库不必要一开始就初始化,我们可以按需初始化,将一些库放到用它的时候再初始化,或者放到启动页去进行初始化。所以需要我们对这些初始化操作进行分析,哪些需要在主线程进行,哪些可以延迟加载,哪些初始化任务有先后关系等等。这里涉及到一个启动器
的概念,启动器的用处就是可以充分利用CPU多核,自动梳理任务顺序。有空的朋友可以去了解下。
这里还需要注意一点就是线程的使用:
线程池
去执行异步任务。 Java
中的对象第一次创建的时候,java虚拟机首先检查类对应的Class
对象是否已经加载。如果没有加载,jvm会根据类名查找.class
文件,将其Class
对象载入。同一个类第二次new的时候就不需要加载类对象,而是直接实例化,创建时间就缩短了。
今日头条中就有这种做法,先创建一个Activity
的实例。
在我们的启动页或者主页可以将一些要用到的数据保存到内存或者数据库,那么其他页面要用到这些数据的时候就可以直接使用并显示了。
由于65536
方法限制,所以一般class文件要生成多个dex文件,Android5.0以下,ClassLoader加载类的时候只会从class.dex(主dex)
里加载,所以要执行MultiDex.install(context)
方法才能正常读取所有的dex类。
而这个install
方法就是耗时大户,会解压apk,遍历dex文件,压缩dex、将dex文件通过反射转换成DexFile对象、反射替换数组。
这里需要的方案就是今日头条方案:
在Application的attachBaseContext
方法里,启动另一个进程的LoadDexActivity去异步执行MultiDex逻辑,显示Loading。
然后主进程Application
进入while循环,不断检测MultiDex操作是否完成 ,MultiDex执行完之后主进程Application继续执行ContentProvider初始化和Application onCreate方法,也就是主进程正常的逻辑。
所以重点就是单开进程去执行MultiDex
逻辑,这样就不影响APP的启动了。
当然,这仅仅针对5.0以下加载Multidex情况,5.0以上默认使用ART加载类,安装时候就已经转换dex文件为oat文件了,所以无需优化Multidex
情况了。
如果我们的主页涉及到Webview
,那我们还要处理WebView的优化。因为Webview的创建很耗时,所以我们采取以下方案进行Webview的优化:
如果启动页和主页的布局比较复杂,也会影响我们的启动时间,所以注意我们的布局,多用merge,include,constraintlayout
等,特别是多层嵌套问题。
到此,关于“启动优化的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。