当前位置: 首页 > news >正文

Android App启动优化之启动框架

android启动优化是个比较重要的部分,也是一大难题,一个优秀的app首先给人第一感觉就是启动速度,启动速度非常影响用户的体验,那么我们今天展开说说启动优化相关的问题。

我们先来简单分析一下启动过程、启动优化方向,最后再运用我们的启动框架来优化这个过程。

一、启动流程

Click Event -> IPC -> Process.start -> ActivityThread -> bindApplication -> LifeCycle -> ViewRootImpl

首先,用户会执行点击操作,点击事件会触发一个IPC通信,之后会触发一个Process.start方法,用于进程的创建,接着便会执行ActivityThread的main方法,开启looper并且创建主线程handler,接着会bindApplicaiton,之后会执行activity的生命周期,最后执行ViewRoot的渲染,这时才会显示一个页面。

二、启动分析及优化方向

冷启动之前:

  • 启动app
  • 加载空白window
  • 创建进程

需要注意的是这些都是系统行为,一般我们控制不了。

随后任务:

  • 创建application
  • 启动主进程
  • 创建MainActivity
  • 加载布局
  • 执行onCreate

通常首帧绘制结束,我们就认为是启动已经结束了。

所以我们的优化方向就是applicaiton阶段跟activity生命周期阶段的耗时。

adb查看启动耗时:

adb shell am start -W [packageName]/[AppstartActivity全路径]

执行后会得到三个时间:ThisTime、TotalTime和WaitTime,totalTime包括 创建进程 + Application初始化 + Activity初始化到界面显示 的过程。

三、优化方案
  1. 主题切换,

    使用Activity的windowBackground主题属性预先设置一个启动图片(layer-list实现),在启动后,在Activity的onCreate()方法中的super.onCreate()前再setTheme(R.style.AppTheme)。避免了白屏跟点击图标无响应。

  2. 三方库懒加载,按需加载。

  3. 延时加载,利用子线程来加载任务来减少主线程的耗时。

  4. 使用IdeaHandler

  5. 类加载优化,在application中异步加载耗时长的类加载,替换classloader获取到类加载时间。Class.forName只加载类本身及静态变量引用类,new类会额外加载成员变量的引用类。

  6. webview启动优化,可以预先将其内核初始化,加载到webview缓存池中。

  7. 页面数据预加载。

  8. 页面绘制层级优化。

四、启动框架实现

接下来就是我们的重头戏,实现启动框架了。

启动框架主要要考虑:

  1. 任务的依赖关系处理。比如A依赖B,B依赖C,类似这种情况,我们要如何处理任务执行先后顺序,哪些任务能延时,哪些任务必须等待,我们就需要用有向无环图进行拓扑排序。(这个点大家可以自行了解一下,很重要,一般采用的是广度优先搜索算法)
  2. 线程池,我们必然要统一线程池,我们要判断任务是ios密集型任务还是cpu密集型任务类型。
  3. 任务的优先级,线程的优先级。
  4. 任务等待,CountDownLanuch。

下面的开源地址,下载即用GitHub - liweidong93/anchor: 安卓启动框架(java实现)

相关文章:

Android App启动优化之启动框架

android启动优化是个比较重要的部分,也是一大难题,一个优秀的app首先给人第一感觉就是启动速度,启动速度非常影响用户的体验,那么我们今天展开说说启动优化相关的问题。 我们先来简单分析一下启动过程、启动优化方向,…...

zookeeper入门篇之分布式锁

文章目录 前言非公平锁公平锁 前言 上一篇说过,zookeeper是一个类似文件系统的数据结构,每个节点都可以看做是一个文件目录,也就是说,我们所创建的节点是唯一的,那么分布式锁的原理就是基于这个来的。 代码仓库&…...

leetcode解题思路分析(一百四十九)1297 - 1304 题

子串的最大出现次数 给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数: 子串中不同字母的数目必须小于等于 maxLetters 。 子串的长度必须大于等于 minSize 且小于等于 maxSize 。 首先能想到的是从MinSize开始遍历查找&am…...

你的librosa和scikit-learn打架了吗?

被这个问题困扰好久!!!!!!!!!!!!!! 我的原来版本librosa0.7.1 和 scikit-learn1.3.1 一直拆了按,按…...

理解自动驾驶感知技术

理解自动驾驶感知技术 文章目录 什么是自动驾驶感知技术?自动驾驶感知技术的关键组成部分1. 雷达(Radar)2. 摄像头(Camera)3. 激光雷达(Lidar)4. 超声波传感器(Ultrasonic Sensors&a…...

一款简化Python自然语言处理的开源库

迷途小书童 读完需要 3分钟 速读仅需 1 分钟 1 简介 TextBlob 是一个 Python 库,用于处理文本数据的自然语言处理(NLP)任务。它提供了简单且易于使用的 API,使得对文本进行分析、情感分析、词性标注、名词短语提取等任务变得更加简…...

常用Redis界面化软件

对于Redis的操作,前期有过介绍【Centos 下安装 Redis 及命令行操作】。而在Redis的日常开发调试中,可使用可视化软件方便进行操作。 本篇主要介绍Redis可视化的两款工具:Redis Desktop Manager和AnotherRedisDesktopManager。 1、Redis Desk…...

电脑散热——液金散热

目录 1.简介 2.传统硅脂与液金导热区别 3.特点 4.优点 5.为什么液金技术名声不太好 6.使用方法 1.简介 凡是对于电脑基础硬件有所了解的人,都知道硅脂是如今高性能电脑设备中必不可少的东西。芯片表面和散热器接触面,虽然肉眼看上去是非常光滑的金属…...

多线程锁-synchronized字节码分析

从字节码角度分析synchronized实现 javap -c(v附加信息) ***.class 文件反编译 synchronized同步代码块 >>>实现使用的是monitorenter和monitorexit指令 synchronized普通同步方法 >>>调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置&#xf…...

SpringCloud学习笔记-Eureka的服务拉取

假设是OrderService里面拉取Eureka的服务之一User Service 1.依然需要在该服务里面引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependenc…...

COLLABORATIVE DESIGNER FOR SOLIDWORKS® 新功能

共享和标注 优点&#xff1a;收件人在浏览器中访问共享文 件&#xff0c;无需安装3DEXPERIENCE 平台应用程序。 • 与 SOLIDWORKS 中来自您组织内部或外部的任何人无缝 共享您的设计。 • 直接将评论和标注附加到您的设计作品中&#xff0c;便于立即获得 反馈。 支持 SOLIDWO…...

AMD CPU 虚拟机安装 macos 系统的各虚拟机系统对比

软硬件环境&#xff1a; CPU:AMD R7 7735HS 8核16线程 显卡&#xff1a;AMD R680M 集显 内存&#xff1a;32GB DDR5 硬盘&#xff1a;2TB SSD Windows11 1、VMware Workstation 我用的是17 的版本&#xff0c;使用方便&#xff0c;对于macos 12及以下的安装在需要修改vmx 文…...

php实战案例记录(20)时间比较

在PHP中&#xff0c;有几种常见的方法可以进行时间比较。以下是其中的一些方法&#xff1a; 使用比较运算符&#xff1a;可以使用比较运算符&#xff08;如小于"<“、大于”>“、小于等于”<“、大于等于”>“、等于”“、不等于”!"等&#xff09;来比…...

web中缓存的几种方式

看了构建高性能的web站点一书&#xff0c;对其中的集中web缓存进行一个总结 1 应用程序实现的动态页面缓存 应用程序把动态文件生成的html文件缓存到文件服务器&#xff0c;以后用户请求动态文件&#xff0c;直接从文件服务器加载对应的静态缓存的html文件返回给用户&#xff…...

Stable Diffusion生成图片

画质 masterpiece,best quality,illustration,extremely detail CG unity 8k wallpaper,ultra-detailed,depth of field 杰作&#xff0c;最佳质量&#xff0c;插图&#xff0c;极度详细的8K壁纸&#xff0c;超高详细度&#xff0c;景深 画风 Chinese ink painting,water color…...

MySQL增删查改(进阶1)

一、数据库约束 约束&#xff1a;按照一定条件进行规范的做事&#xff1b; 表定义的时候&#xff0c;某些字段保存的数据需要按照一定的约束条件&#xff1b; 1.null约束 字段null&#xff1a;该字段可以为空&#xff1b;not null&#xff1a;该字段不能为空不指定的话就是…...

RabbitMQ-发布订阅模式和路由模式

接上文 RabbitMQ-工作队列 1 发布订阅模式 将之前的配置类内容都替换掉 Bean("fanoutExchange")public Exchange exchange(){//注意这里是fanoutExchangereturn ExchangeBuilder.fanoutExchange("amq.fanout").build();}Bean("yydsQueue1")publ…...

RabbitMQ-主题模式

接上文 RabbitMQ-发布订阅模式和路由模式 1 主题模式 #通配符 代表0个或多个。*通配符 代表 1个或多个 进行测试&#xff0c;修改配置文件 Configuration public class RabbitConfiguration {Bean("topicExchange") //这里使用预置的Topic类型交换机public Exchan…...

阅读文献小技巧

在科研中,文献的阅读是非常重要的一环。对于汇报论文的文献阅读,更是需要有一定的技巧。下面列出一些阅读汇报论文文献的技巧。 1.明确阅读目的和任务。在阅读每篇文献之前,需要明确阅读该文献的目的和任务,例如是否需要了解该领域的最新进展、寻找相关数据或案例等。是为…...

简易的贪吃蛇小游戏(以后或许会更新)C++/C语言

第一版&#xff1a; #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h>#define WIDTH 20 #define HEIGHT 20int gameOver; int score; int x, y; // 蛇头的坐标 int fruitX, fruitY; // 食物的坐标 int tailX[100], t…...

DotNext内存映射文件:高性能IO操作的终极解决方案

DotNext内存映射文件&#xff1a;高性能IO操作的终极解决方案 【免费下载链接】dotNext Next generation API for .NET 项目地址: https://gitcode.com/gh_mirrors/do/dotNext DotNext作为下一代.NET API&#xff0c;提供了强大的内存映射文件功能&#xff0c;为开发者带…...

设计工程化实践:将设计思维转化为开发者技能的工具探索

1. 项目概述&#xff1a;当设计思维遇上代码技能最近在GitHub上看到一个挺有意思的项目&#xff0c;叫Arthurescc/design-fusion.skill。光看这个名字&#xff0c;就让我这个在设计和开发交叉领域摸爬滚打了十来年的老手眼前一亮。“Design Fusion”直译是“设计融合”&#xf…...

Arthas实战:用watch和tt命令‘时光倒流’,精准复现和调试那个偶现的线上Bug

Arthas实战&#xff1a;用watch和tt命令‘时光倒流’&#xff0c;精准复现和调试那个偶现的线上Bug 线上环境偶现的Bug就像幽灵一样难以捉摸——测试环境无法复现&#xff0c;日志信息又残缺不全。作为一名开发者&#xff0c;你是否经历过这样的绝望时刻&#xff1f;当用户反馈…...

AWPLC与AWTK MVVM实战:零代码实现嵌入式走马灯控制与界面开发

1. 项目概述与核心思路作为一名在嵌入式领域摸爬滚打了十多年的老工程师&#xff0c;我见过太多项目因为GUI开发和逻辑控制分离而陷入泥潭。前端UI要调&#xff0c;后端逻辑要改&#xff0c;两边工程师还得不断对齐接口&#xff0c;效率低下不说&#xff0c;出点bug排查起来更是…...

037、LVGL动画类型与参数配置

LVGL动画类型与参数配置 上周帮一个做智能家居面板的客户调试,遇到个挺典型的坑:他用了lv_anim_set_path_cb()自定义了一个缓动曲线,结果动画跑起来像抽风一样忽快忽慢。我让他把回调函数贴出来一看——好家伙,路径函数里直接调了lv_anim_set_time()改时长。这种在动画执行…...

EASY-HWID-SPOOFER内核级硬件信息欺骗技术深度解析

EASY-HWID-SPOOFER内核级硬件信息欺骗技术深度解析 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER EASY-HWID-SPOOFER是一款基于Windows内核模式的硬件信息欺骗工具&#xff0c;通…...

Huxley框架PDF生成利器:基于HTML模板的优雅解决方案

1. 项目概述&#xff1a;一个为Huxley框架量身定制的PDF生成利器如果你正在使用Huxley框架开发应用&#xff0c;并且遇到了需要生成PDF报告、发票、合同或者任何形式文档的需求&#xff0c;那么你很可能已经体会过那种“万事俱备&#xff0c;只欠PDF”的纠结。市面上的PDF生成库…...

STM32 HAL库实战:手把手教你用匿名上位机V7显示自定义波形(附完整驱动代码)

STM32 HAL库与匿名上位机V7深度整合&#xff1a;自定义波形显示实战指南 在嵌入式系统开发中&#xff0c;数据可视化是调试和性能分析的关键环节。匿名上位机V7作为一款功能强大的国产调试工具&#xff0c;以其灵活的协议支持和直观的波形显示功能&#xff0c;成为众多工程师的…...

苹果单图生成3D数字人像技术解析:从神经纹理到可微分渲染

1. 项目概述&#xff1a;从二维到三维的“升维”革命 最近在计算机视觉和生成式AI的圈子里&#xff0c;一个来自苹果的研究成果引起了不小的震动。简单来说&#xff0c;他们搞出了一个模型&#xff0c;只需要你的一张正面照片&#xff0c;就能生成一个可以360度旋转、表情生动的…...

基于本地文档的智能问答系统:从向量检索到私有化部署

1. 项目概述&#xff1a;当本地文档库遇上AI大脑最近在折腾一个挺有意思的东西&#xff0c;一个叫“word-GPT-Plus”的项目。简单来说&#xff0c;它解决了一个我&#xff0c;相信也是很多朋友都有的痛点&#xff1a;我电脑里存了海量的文档——工作周报、技术方案、学习笔记、…...