写点什么

Android 端应用秒开优化体验

用户头像
Android架构
关注
发布于: 17 小时前

究其原因,主要因素是任务在界面绘制前过于集中化。


应用启动过程从用户点击 launcher 图标到看到第一帧这个过程中,主要会经过以下这些过程:


main()->Application:attachBaseContext()->onCreate()->Activity:onCreate()->onStart()->onPostCreate()->onResume()->onPostResume()


而一般我们的初始化任务主要都会集中化在 Application:onCreate()方法中,这就使得初始化任务在第一帧绘制之前得完成,这就造成了卡图标、应用启动慢。那么把任务打散呢?分散在 LaunchActivity 中去分段初始化?还是不行的,因为界面开始绘制是在 onResume()方法开始后才开始绘制,所以,得从 Activity 的创建过程找办法。


main->Activity 创建的这个过程会经过一系列 framework 层的操作,这些操作都是系统自动执行的,不易进行优化,不过可以在 Activity 创建这个过程前后来找一些蛛丝马迹,因为 Activity 的创建都会辗转到 ActivityThread:performLaunchActivity()这个方法中,在这个方法中可以知道这么几件事:


1、先通过 Instrumentation:newActivity()来创建一个 Activity 实例


2、再判断 Application 实例是否已创建,已创建则直接返回,否则调用


Instrumentation:newApplication()来创建 Application 实例,在这个过程中会依次执行 attachBaseContext()和 onCreate()方法


3、之后 Activity:attach()方法会创建一个 PhoneWindow 对象,它就是界面,它有一个 DecorView,调用 setContentView()时会给配置 DecorView,其中就会设置一个背景:



我们的 View 也是 add 进 DecorView 中显示,它作为 RootView 肯定是最先显示,所以可以给它设置个默认背景


4、最后依次调用 Activity 的 onCreate、onStart 等方法

措施

1、任务分级

2、任务并行

3、界面预显示


对于任务集中初始化化、耗时初始化原因导致应用在中低端机启动过慢,而 Activity 界面绘制的时机导致简单的将任务分给 Activity 初始化也不起作用,我们必须找一个切入点


界面的创建和界面的绘制,这


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


两个过程第一个是 Application 的 attachBaseConte 和 onCreate 这两个方法影响的,第二个则是 Application 创建一直到界面绘制


所以,可以对任务进行分级的临界点可以这样分:


1、CoreSDK——Application 的创建

2、HighPrioritySDK——Activity 的创建

3、LowPrioritySDK——Activity 界面完成绘制

4、AsyncSDK——Activity 的创建


如图:



对任务这样分级后,测了一下,应用的启动即使在低端机上,也能秒开:


分级带来的问题

正常启动过程那肯定是没问题的,不过有这么几种场景:


1、App 切回后台,内存不足导致 Application 被回收,从最近任务列表中恢复界面时 Application 需重新创建

2、应用没挂起时,Push 推送需从 Notification 跳入应用内某界面

3、应用没挂起时,浏览器外链需跳入应用内某界面这些 Case 可能导致的问题是被跳入的界面使用到了未初始化的 SDK,可能导致 Crash 或者数据异常,所以目标页面启动前必须确保 SDK 已经初始化,这个过程的原因是没有唤起启动页来初始化 SDK,可以通过 hook newActivity 解决,其中判断 Application 是否初始化和各个 SDK 是否初始化,并且判断该次启动不来自系统的 Launcher。public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException {if (InitializeOptimizer.isApplicationCreated()

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android端应用秒开优化体验