android 低端机 优化,Android低端机上应用也能秒开?

2023-10-22 07:40

本文主要是介绍android 低端机 优化,Android低端机上应用也能秒开?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原标题:Android低端机上应用也能秒开?

最近部门内抛出了一个问题,很慢、卡图标?主要表现在中低端机型中。究其这个问题,由于对性能优化比较感兴趣,借了个低端机和一个中端机来一看究竟,对同一应用分别测了下它在中低端机的启动时间,下面为启动耗时情况:

600c61997730bc45099c2fb90585bf5f.png

启动了三次,基本都在4s左右。

原因

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

应用启动过程从用户点击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,其中就会设置一个背景:

593b028c34d08085c393c8b5a4dab198.png

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

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

措施

1、任务分级2、任务并行3、界面预显示

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

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

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

1、CoreSDK——Application的创建2、HighPrioritySDK——Activity的创建3、LowPrioritySDK——Activity界面完成绘制4、AsyncSDK——Activity的创建

如图:

dc528947b208d2342dbe18e6450b05b6.png

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

19e63c7dd51106c365cc6ba2fd7a5164.png

分级带来的问题

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

1、App切回后台,内存不足导致Application被回收,从最近任务列表中恢复界面时Application需重新创建2、应用没挂起时,Push推送需从Notification跳入应用内某界面3、应用没挂起时,浏览器外链需跳入应用内某界面

这些Case可能导致的问题是被跳入的界面使用到了未初始化的SDK,可能导致Crash或者数据异常,所以目标页面启动前必须确保SDK已经初始化,这个过程的原因是没有唤起启动页来初始化SDK,可以通过hook newActivity解决。

public Activity newActivity(ClassLoader cl, String className, Intent intent)throws InstantiationException, IllegalAccessException, ClassNotFoundException { if (InitializeOptimizer.isApplicationCreated() && (InitializeUtil.isOuterChainIntent(intent) || InitializeUtil.isNotificationIntent(intent)) && (!InitializeOptimizer.isHighSDKInitialized() || !InitializeOptimizer.isLowSDKInitialized() || !InitializeOptimizer.isAsyncSDKInitialized())) { InitializeOptimizer.setApplicationCreated(false); intent.addCategory(InitializeUtil.INITIALIZE_CATEGORY); return (Activity) cl.loadClass(InitializeOptimizer.getLaunchClassName()).newInstance(); } InitializeOptimizer.setApplicationCreated(false); returnsuper.newActivity(cl, className, intent);}

责任编辑:

这篇关于android 低端机 优化,Android低端机上应用也能秒开?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/260033

相关文章

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

Nginx内置变量应用场景分析

《Nginx内置变量应用场景分析》Nginx内置变量速查表,涵盖请求URI、客户端信息、服务器信息、文件路径、响应与性能等类别,这篇文章给大家介绍Nginx内置变量应用场景分析,感兴趣的朋友跟随小编一... 目录1. Nginx 内置变量速查表2. 核心变量详解与应用场景3. 实际应用举例4. 注意事项Ng

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳