Android 面试题 优化 (一)

news2024/12/25 1:13:17

🔥 Android性能优化指标 🔥

🔥 包体积优化 🔥 

安装包的大小会影响用户的安装率,如果一个包的太大,用户安装的意愿会大大降低。

经过包分析可以看到,安装包最大的部分是资源和第三方库,而减少apk包体积大小,主要处理的就是res下的资源文

件、.class文件。优化的思路如下:

1、压缩图片大小,统一使用webp格式

2、尽可能地减少本地资源,考虑从服务端拉取图片、Lottie动画、so库等资源

3、利用Lottie替换帧动画

4、开启混淆删除无用代码

🔥 启动优化 🔥 

启动优化一般分为三种情况:冷启动、热启动和页面跳转。

1、冷启动:应用首次启动所花费的时间

2、热启动:应用非首次启动所花费的时间

3、页面跳转:应用界面切换所花费的时间

 我们可以使用如下的命令来查看冷启动所耗费的时间。

//启动应用时间
adb shell am start -W -n package/activity

//关闭应用
adb shell am force-stop package

可以使用埋点和友盟U-APM来获取启动数据。

这里有三个指标:ThisTime、TotalTime和WaitTime,含义如下:

1、ThisTime:最后一个Activity启动耗时

2、TotalTime:所有Activity启动耗时

3、WaitTime:AMS启动Activity的总耗时

目标:

一般来说,一个体验良好的APP,冷启动应该控制在2s/3s以内,热启动控制在1s以内。对比了一些蔚来和小鹏,平均的启动时间在 2s 左右,因此,在启动优化方面,我们也需要向 2s 看齐。

🔥 渲染优化 🔥 

Android 应用体验是否良好的一个重要标准就是,应用是否流畅、是否存在卡顿、丢帧现象,而这些都可以通过 60fps 有关。如果页面的一帧没法在16ms完成渲染,就可能导致丢帧或者卡顿的现象。

通常,我们可以使用下面的命令来查看某个页面的FPS 数据。

adb shell dumpsys SurfaceFlinger --latency activity

还可以使用下面的命令来获取FPS和GPU相关的数据。

adb shell dumpsys gfxinfo 包名

出现丢帧和卡顿的原因 :  

往往是 layout 布局太过复杂,或 UI上有层叠太多的绘制单元。我们可以通过手机设置里面的【开发者选项】->【显示过渡绘制区域】来观察 UI 上的 Overdraw 情况。

为了实现60fps的渲染目标,应该遵循如下优化措施:

1、耗时操作放到子线程进行处理,主线程只负责渲染

2、SDK采用懒加载方式,需要时或者空闲时加载,不需要时可不必加载

3、线上环境避免打印日志

4、优化view视图渲染时间

优化复杂布局 :

考虑使用ConstraintLayout约束布局,减少视图渲染的层级。如果不是很复杂,则使用LinearLayout。其他措施,如巧用ViewStub、merge标签。以及使用Android Studio自带的Android Device Monitor工具查看布局情况。

优化布局,特别是处理红色部分的过渡渲染问题。

🔥 内存优化 🔥

 Android分配个应用的大小是有限制,且在设备出厂时就已经确定,单个应用可用的最大内存的配置位于/system/build.prop文件中的dalvik.vm.heapgrowthlimit配置项。

在Android系统中,每个APP内存包括两部分共享内存和私有内存。在行业内,我们通常会使用PSS(USS+共享的内存)来判断APP的内存开销,查看的命令如下。

adb shell dumpsys meminfo 应用包名

虽然Android使用的JVM具有内存管理(自动回收)的能力,但是不合理的使用内存也可能导致导致应用出现异常,如常见的OOM、内存泄漏、内存抖动等引发的崩溃、卡顿等现象。 针对内存优化,主要有以下几点: 

OOM(内存溢出

        当应用申请内存发现超出了JVM的最大限制时候,就会抛出内存溢出异常,引发程序崩溃。引发OOM常见原因有:内存泄漏的累积导致无法申请更多内存、创建大内存对象(如大容量数组、载入大的文件、载入大的图片等)。

内存泄露

        一个对象的超出了其生命周期,导致JVM无法回收。常见的内存泄露场景有:

        1、单例持有引起的内存泄漏,如单例持有activity、context、view、drawabl等

        2、静态变量引起的内存泄漏,如静态变量持有activity、context、view、drawabl等

        3、非静态内部类引起的内存泄漏,非静态内部类会隐式持有外部类实例

        4、匿名内部类引起的内存泄漏,如handler、线程匿名内部类runnable、callback等

        5、资源未释放引起的内存泄漏,如读写文件没有关闭、网络流操作没有关闭、Bitmap没有释放等

        6、广播没有及时取消注册

内存抖动

内存抖动是因为在频繁的创建、回收对象,引发的频繁GC,进而影响主线程,最终导致卡顿现象。

目标

在开发环境,我们可以打开Android Studio自带的Memory Profiler内存分析器来进行内存分析。 

选择内存分析器中的Capture heap dump,点击下方的Record按钮,就开始捕获堆转储了,而此步可以检测出内存泄漏问题。

🔥 CPU优化 🔥

CPU优化,大多数开发者都不会太关注,但是优化应用的 CPU 使用率能带来诸多好处,如更顺畅的用户体验,以及延长设备电池续航时间。在正式介绍之前,我们先来看两条命令。第一条是用来查看各线程cpu占用情况。

adb shell top

 使用下面的命令打印进程下线程信息 : 


adb shell ps -t -p -c | findstr u0_a60

CPU相关的内容,同样可以使用CPU Profiler 进行分析。 

🔥 网络优化 🔥 

Android 网络优化方法主要涉及网络测试工具、线上网络监控方案、流量优化方案和质量优化方案等几个方面。

其中,常见的网络测试工具有 Network Profiler、Charles和Stetho,线上网络监控方案有OkHttp 的 EventListener、NetworkStatsManager 和 TrafficStats,流量优化方案有数据缓存、数据压缩和图片压缩,质量优化方案有HttpDns 优化、协议版本优化(如Protocol Buffer)。

 

开启Gzip压缩,减少流量传递消耗

IP直连与HttpDns,减少DNS解析

根据网络使用不同分辨率的图片,不行的话,可以统一使用WebP格式

升级网络协议,开启Http2的多路复用策略
网络优化要做线下测试和线上监控,在做线下测试时,要测试不同的网络类型下客户端的使用体验,比如切换 Wifi 和流量,还要测试不同的网络状态,比如弱网测试和无网测试。并且,在做线下测试时,要把测试周期拉长一些,因为客户端中有的网络请求不是实时上报的,测试网络的时候测久一点才能测出问题。

Network Profiler 是 Android Studio 提供的一个网络分析工具,在 Network Profiler 中包含了连接视图、线程视图、请求概览、响应信息、请求信息以及调用栈等数据,在连接视图中可以看到请求的内容类型、请求状态和请求耗时等信息,我们可以使用它来分析一些耗时的问题。

使用Charles模拟弱网环境,针对3G等弱网环节进行相应的适配(服务器接口)。

检查Android的网络配置,开启多路复用逻辑

排查耗时长的接口,针对性的进行优化

图片等资源,使用Webp(链路支持)

开启OkHttp的缓存,优化无网的体验

🔥 电量优化 🔥  

可以借助Android Studio自带的能耗性能剖析器进行分析,能耗性能剖析器会监控 CPU、网络无线装置和 GPS 传感器的使用情况,并直观地显示其中每个组件消耗的电量。

点击 Energy 时间轴中的任意位置以打开能耗性能剖析器。检查后台任务和定时任务 .

避免频繁进行网络请求,和组件的生命周期进行绑定

避免任务被频繁执行,可以等任务形成一定数量时再一起执行

避免应用频繁唤醒屏幕

避免后台长时间获取 WakeLock、WIFI 和蓝牙的扫描

避免轮询请求,需要轮询的使用AlarmManager

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

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

相关文章

奥迪A3:最新款奥迪A3内饰设计及智能科技应用

奥迪A3一直以来都是奥迪的入门级车型,但这并不意味着它在科技和内饰方面会有所退步。最新款奥迪A3的内饰设计和智能科技应用让人们再次惊叹奥迪的创新能力。 内饰设计 奥迪A3最新款的内饰设计引入了奥迪最新的设计元素,比如8.8英寸的中控显示屏&#xf…

山西电力市场日前价格预测【2023-07-30】

日前价格预测 预测明日(2023-07-30)山西电力市场全天平均日前电价为287.10元/MWh。其中,最高日前电价为309.20元/MWh,预计出现在09: 15。最低日前电价为252.82元/MWh,预计出现在24: 00。 价差方向预测 1:实…

Dendrogram | 今天是人见人爱、花见花开的环形Dendrogram!~(附完整代码)

1写在前面 好长时间没更新了,这周真的是天天都在手术室度过,常讲到的一句话就是苦的一比啊。🫠 很久没有见过外面的世界了,世界那么大,我也想去看看!~😂 废话太多了,今天的教程是环形…

网络安全/信息安全(黑客技术)自学笔记

一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…

从分片传输到并行传输之大文件传输加速技术

随着大文件的传输需求越来越多,传输过程中也会遇到很多困难,比如传输速度慢、文件安全性低等。为了克服这些困难,探讨各种大文件传输加速技术。其中,分片传输和并行传输是两种比较常见的技术,下面将对它们进行详细说明…

WEB:Web_python_template_injection

背景知识 python模板注入 ssit 题目 打开题目,发现页面提示,翻译为python模板注入 先测试是否存在注入 可以发现被执行了 先查看所有的子类 payload {{[].__class__.__base__.__subclasses__()}} 利用site.Printer的os模块执行命令 payload {{.__…

CAN转EtherNet/IP网关can协议破解服务

JM-EIP-CAN 是自主研发的一款 ETHERNET/IP 从站功能的通讯网关。该产品主要功能是将各种 CAN 总线和 ETHERNET/IP 网络连接起来。 本网关连接到 ETHERNET/IP 总线中做为从站使用,连接到 CAN 总线中根据节点号进行读写。 技术参数 ETHERNET/IP 技术参数 网关做为 …

C# Socket实际应用案例与属性详解

引言 Socket是一个在网络编程中非常常见和重要的概念,它提供了一种通信机制,使不同的计算机之间可以进行数据传输。本文将介绍C#中Socket的实际应用案例,并对Socket的常用属性进行详细解析。 文章目录 1. Socket的实际应用案例2. Socket的属…

CAS比较并交换具体实现细节

线程2读取内存值到工作内存中,设置一个预估值与读入的值相等,线程1也同样读入。 线程2进行操作,之后在写入内存前,将预估值与内存值作比较,看内存值是否修改过。 如果线程2比较完相同,则修改内存值为1&am…

开源了!最强原创图解八股文面试网来袭

强烈推荐 Github上业内新晋的一匹黑马—Java图解八股文面试网—Java2Top.cn,图解 Java 大厂面试题,深入全面,真的强烈推荐~ 这是一个二本逆袭阿里的大佬根据自己秋招上岸所看过的相关专栏,面经,课程,结合自…

211. 添加与搜索单词 - 数据结构设计---------------字典树

211. 添加与搜索单词 - 数据结构设计 原题链接:完成情况:解题思路:参考代码: 原题链接: 211. 添加与搜索单词 - 数据结构设计 https://leetcode.cn/problems/design-add-and-search-words-data-structure/descriptio…

tinkerCAD案例:19. Move Circuit Assembly 移动电路组件

tinkerCAD案例:19. Move Circuit Assembly 移动电路组件 In this tutorial, you’ll learn how to add the Move circuit assembly to a design. 在本教程中,您将学习如何将移动电路装配体添加到设计中。 When you assemble the Move circuit assembly…

【Docker】Docker应用部署之Docker容器安装Tomcat

目录 一、搜索镜像 二、拉取镜像 三、创建容器 四、测试使用 一、搜索镜像 docker search tomcat 二、拉取镜像 docker pull tomcat:版本 三、创建容器 首先在宿主机创建数据卷的目录 mkdir /root/tomcat # 创建目录 cd /root/tomcat # 进入目录 docker run -id -…

解决mysqld服务启动失败

1、进程 首先查看下mysql进程: ps -aux | grep mysql有进程号 2、所有者和所属组为mysql 查看/usr/local/MySQL/data/mysqld.pid所有者和所属组是否为mysql 原来是权限有问题,那么更改权限(还需要加权限)3、 重新启动服务

2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意: 给定长度为n的数列,要求每个数都在的范围,且任意长度大于等于2的区间和都大于等于0,问方案数。。 思路: 首先要看出是dp题,用来表示遍历到第i位且后缀和最小为x的可行方案数(此时的后缀可以只有最…

LeetCode[面试题04.08]首个共同祖先

难度:Medium 题目: 设计并实现一个算法,找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意:这不一定是二叉搜索树。 例如,给定如下二叉树: root [3,5,1,6,2,0,8,null,null,7,…

软考高级架构师笔记-10数学计算题

目录 1. 前文回顾 & 考情分析2. 最小生成树3. 最短路径4. 网络与最大流量5. 线性规划6. 动态规划/决策表7. 博弈论8. 状态转移矩阵9. 决策论10. 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)软考…

Spring AOP 的概念及其作用

一、什么是 Spring AOP? 在介绍 Spring AOP 之前,首先要了解一下什么是 AOP ? AOP ( Aspect Oriented Programming ):面向切面编程,它是一种思想, 它是对某一类事情的集中处 理 。…

vue强制刷新的方法

前言 在开发过程中,有时候会遇到这么一种情况: 1.切换页面页面没有更新 2.通过动态的赋值,但是dom没有及时更新,能够获取到动态赋的值,但是无法获取到双向绑定的dom节点, 这就需要我们手动进行强制刷新组件,下面这篇文章主要给大家介绍了关于vue组件强制刷新的方案…

搭建自己的Git服务器

环境 服务端:Ubuntu 22.04 客户端:Win11_x64 前提条件:需要确保在Windows机器上能够ping通Ubuntu服务器, 并且服务端与客户端均已安装了Git软件 服务端上的配置操作 以Ubuntu服务器作为Git服务端的运行环境,并方便后期免密推…