Android启动优化-全文详细

news2024/11/26 17:34:44

一个应用App的启动速度能够影响用户的首次体验,通常用户期望app响应和加载速度越快越好。一个启动速度慢的app很可能会给用户留下不好的印象,除了导致用户在应用市场上的打分低之外,很有可能导致致用户直接卸载。这种糟糕的体验可能会导致用户在应用商店针对您的应用给出很低的评分,甚至完全弃用您的应用。

APP启动优化

关于APP启动优化

  • 启动分类
  • 冷启动: 耗时最多,衡量标准 Click Event -> IPC -> Process.start -> ActivityThread -> bindApplication -> LifeCycle -> ViewRootImpl
  • 热启动 最快 后台 -> 前台
  • 温启动 较快 LifeCycle 它只会重走Activity的声明周期,而不会再进行进程的创建、Application的创建等。

冷启动之前

  • 启动APP
  • 加载空白Window
  • 创建进程 冷启动之前的行为时系统的行为,我们是没有办法干预的。

随后任务

  • 创建Application
  • 启动主线程
  • 创建MainActivity
  • 加载布局
  • 布置屏幕
  • 首帧绘制
  • 优化方向
  • Application和Activity生命周期

启动时间测量方式

  • adb命令 adb shell am start -W packagename/(包名)首屏Activity 相关输出:
  • ThisTime:最后一个Activity启动耗时
  • TotalTime:所有Activity启动耗时
  • WaitTime:AMS启动Activity的总耗时

adb命令方式:线下使用方便,但是不能带到线上,而且非严谨精确时间。

  • 手动打点 启动时埋点,启动结束埋点,二者差值。 误区:onWindowFocusChanged只是首帧时间。 正解:真实数据展示。 手动打点方式:精确,可带到线上使用,注意避开误区选择数据真正显示作为测量时间点。addOnDrawListener。

启动优化工具

  • traceview 图形形式展示执行时间、调用栈等等。信息全面,包含所有线程。 Debug.startMethodTracing(“文件名”); Debug.stopMethodTracing(); 生成文件存放在sd卡:Android/data/packagename/files traceview工具运行时开销严重,整体都会变慢。可能会带偏优化方向。
  • systrace 结合Android内核数据,声明html报告,在API18以上使用,推荐向下兼容的TraceCompact。 轻量级,开销小;能直观反映CPU利用率。

获取方法耗时

  • 常规方式:侵入性强,工作量大。
  • AOP方式(Aspect Oriented Programming,面向切面编程):针对同一类问题的统一处理。无侵入添加代码。 AspectJ的使用。

异步优化

  • 优化技巧:Theme切换,感觉上的块。
  • 异步优化思想:子线程分担主线程任务,并行减少时间。
  • 注意事项: 一部分代码不符合异步要求 需要在某阶段完成 区分CPU密集型和IO密集型任务。

异步初始化

  • 常规异步痛点 代码不优雅 场景不好处理(依赖关系) 维护成本高
  • 启动器 核心思想:充分利用CPU多核,自动梳理任务顺序。 启动流程:代码Task话,启动逻辑抽象为Task。根据所有任务的依赖关系,排序生成一个有向无环图。多线程按照排序后的优先级依次执行。

优化实战

1、布局优化

2、逻辑优化

  • 必要且耗时的逻辑,考虑单独开线程执行
  • 必要不耗时,按优先级高低依次执行
  • 非必要的延迟初始化,等用到再初始化

3、针对冷启动的欺骗效果

使用 placeholder UI

Android 最新的 Material Design 建议使用一个 placeholder UI 来展示给用户直至 App 加载完毕,类似 iOS 的做法。

自定义主题,设置 windowBackground 属性,给 Window 加上背景。

<style name="SplashTheme" parent="AppTheme">
 <item name="android:windowBackground">@drawable/logo_splash</item>
</style> 

先加载一个不渲染布局的 Activity 作为启动屏

写一个什么都不做的 LogoSplashActivity

public class LogoSplashActivity extends BaseActivity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 
 // 这里并没有 setContentView,单纯只是用来跳转到相应的 Activity
 // 目的是减少首屏渲染
 if (AppPref.isFirstRunning(this)) {
 IntroduceActivity.launch(this);
 } else {
 MainActivity.launch(this);
 }
 finish();
 }
} 

在 AndroidManifest.xml 中设置其为启动屏,并加上主题

<activity
 android:name=".ui.module.main.LogoSplashActivity"
 android:screenOrientation="portrait"
 android:theme="@style/SplashTheme">
 <intent-filter>
 <action android:name="android.intent.action.MAIN"/>
 <category android:name="android.intent.category.LAUNCHER"/>
 </intent-filter>
</activity> 

这样启动屏显示 LogoSplashActivity,本身不渲染布局,显示主题设置的 placehold UI 背景。

文本是对Android开发工作中的APP启动优化的简单解析,APP启动优化的方案有很多,更多进阶性能优化的技术笔记可参考《Android性能优化笔记》点击可以查看详细性能优化类目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[译]CSS Animations 与 CSS Transitions

本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;CSS Animations Versus CSS Transitions原文作者&#xff1a;Kirupa Chinnathambi原文出处&#xff1a;《Creating Web Animations: Bringing Your UIs to Life》 在 CSS 中有两种设置动画的方式即 CSS animations 和 …

Modelsim 使用教程(3)——Projects

目录 一、概述 二、设计文件及tb 2.1 设计文件 counter.v 2.2 仿真文件 tcounter.v 三、操作流程 3.1 Create a New Project&#xff08;创建一个新的工程&#xff09; 3.2 Add Objects to the Project&#xff08;把代码加入项目&#xff09; 3.3 Compile the …

vue+vant图片压缩后上传

vuevant图片压缩后上传 vue文件写入 <template><div class"home"><van-field input-align"left"><template #input><van-uploaderv-model"fileList.file":after-read"afterRead":max-count"5":…

电子沙盘数字沙盘地理信息开发教程第17课

M3DGIS电子沙盘数字沙盘地理信息开发教程第17课新增加属性在MTGIS3d控件 public bool ShowFLGrid;//是否显 示方里网格。 public bool Atmosphere;//是否显示大气圈。&#xff08;因为WPF不支持shader功能&#xff0c;所以效果嘛。。。&#xff09; 在SDK中提供底层的模型访问接…

美观且可以很方便自定义的MATLAB绘图颜色

函数介绍 主函数是draw_test&#xff0c;用于测试函数。 draw_h是函数&#xff0c;用于给Matlab提供美观且可以很方便自定义的绘图颜色。 draw_h函数介绍 这是一个带输入输出的函数&#xff0c;输入1/2/3&#xff0c;输出下面三种颜色库的配色&#xff0c;每种库均有五种颜色…

开发板挂载 Ubuntu 的 NFS 目录

前言 使用的开发板为韦东山老师的 IMX6ULL 目录 什么是 NFS 协议&#xff1f; 为什么要挂载 Ubuntu 的 nfs 目录&#xff1f; 开发板挂载 Ubuntu 的 NFS 目录 步骤 1. 确定 ubuntu 的桥接网卡 IP 2. 判断是否开权限了 3. 判断是否安装并启动 NFS 服务 4. 在开发板上执…

C语言从入门到精通之【第一个程序hello world】

编程步骤 通常&#xff0c;我们按照以下步骤进行 确立目标设计程序编写代码编译程序运行程序测试&调试修改维护 输出hello world 每个学编程的人都会从最经典的【输出hello world】开始。 https://lightly.teamcode.com/ 我们可以使用这个在线IDE学习C语言。 代码很简…

1. PPT高效初始化设置

1. PPT高效初始化设置 软件安装&#xff1a;Office 2019 主题和颜色 颜色可以在白天与黑夜切换&#xff0c;护眼 切换成了黑色 撤回次数 撤回次数太少&#xff0c;只有20次怎么办 自动保存 有时忘记保存就突然关闭&#xff0c;很需要一个自动保存功能 图片压缩 图…

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同&#xff0c;gradle的版本和gradle plugins的版本都会影响使用方式。 基于此&#xff0c;本文只能作为参考&#xff0c;而不能作为唯一答案&#xff0c;如果要完全依赖本文&#xff0c;则…

Python接口自动化测试 —— Requests库学习

安装&#xff1a; pip install requests 例子&#xff1a; import requests r requests.get(http://www.baidu.com) print r.status_code print type(r) print r.cookies运行程序&#xff0c;得到结果&#xff1a; 运行程序&#xff0c;得到结果&#xff1a; 200 <cla…

sort的第三个参数与priority_queue的第三个模板参数

sort 在C的标准库中&#xff0c;std::sort是一个用于对容器的元素进行排序的算法。它接受三个参数&#xff1a; 1、需要排序的容器的起始迭代器&#xff08;包含&#xff09;。 2、需要排序的容器的结束迭代器&#xff08;不包含&#xff09;。 3、可选参数&#xff0c;用于指…

webgl入门-基础三角形绘制

背景 最近工作上频繁接触webgl&#xff0c;因为不熟悉每每看到shader中的语法总感觉脑袋大&#xff0c;所以打算开始从零学习一下webgl&#xff0c;文章只做记录学习历程&#xff0c;那就直接开始吧&#xff01; 开始 可以配合着这个文章食用。 我还是对webgl有一些概念的&…

【云备份|| 日志 day2】FileUtil JsonUtil

这几天感冒了&#xff0c;稍微落下了进度 util工具 fileUtil&#xff08;文件操作类&#xff09; 在客户端&#xff0c;又或者是在服务端&#xff0c;本质是都是对文件的读写和管理&#xff0c;所以有必要封装一个文件操作类。 class FileUtil{ private:std::string _name; …

Unity Editor工具,导出unitypackage可选择是否包含脚本

概述 Unity自带的Export Package...功能&#xff0c;如果选中资源中包含脚本&#xff0c;或者Prefab挂载了自定义的脚本。在之后弹出的选择框内&#xff0c;如果勾选了Include dependencies会将整个项目所有的脚本全部都包含在内。等于导入了很多不相关的代码。如果取消勾选In…

Express框架开发接口之req.params、req.query与req.body的区别

1.req.query 用于get请求 http://localhost:3000/user?usernameljz&age1 获取 URL 中携带的查询参数 通过req.query对象&#xff0c;可以访问到客户端通过查询字符串的形式&#xff0c;发送到服务器的参数&#xff1a; 2.req.params 用于get请求 url路径为&#xff…

Ubuntu MySQL客户端功能介绍(mysql-client)mysql命令(mysql客户端命令)数据库导出、数据库导入

文章目录 Ubuntu MySQL客户端(mysql-client)功能介绍MySQL客户端与服务端服务器端&#xff08;MySQL Server&#xff09;客户端&#xff08;MySQL Client&#xff09; 安装MySQL客户端连接到MySQL服务器&#xff08;mysql -h host -u user -p&#xff09;执行SQL查询批处理模式…

SpringCloud-Alibaba-Seata

SpringCloud-Alibaba-Seata 注意&#xff1a;最好使用JDK1.8&#xff0c;使用JDK17整合seata会出现一些问题&#xff01;&#xff01;&#xff01; Docker部署Seata1.5.2 1&#xff1a;拉取Seata1.5.2镜像&#xff1a; docker pull seataio/seata-server:1.5.22&#xff1a;在…

C/C++奇数求和 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C奇数求和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C奇数求和 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 计算非负整数 m 到 n&#xff08;包括m 和 n &#xff…

驱动开发11-2 编写SPI驱动程序-点亮数码管

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …

HNU-数据库系统-讨论课1

第一次小班讨论课安排如下: 主题: 大数据管理及前沿技术讨论 目的&#xff1a;让学生了解大数据管理的相关理论、技术和系统。 内容: &#xff08;1&#xff09;大数据概念、应用、技术的相关知识。 &#xff08;2&#xff09;AI4DB &#xff08;3&#xff09;DB4AI &…