Android App 性能优化实践

车载安卓APP开发工程师职位深度解析与面试指南 摘要:赛科工业科技开发(武汉)有限公司上海分公司招聘车载安卓APP开发工程师(技术驻场岗位),工作地点在南京延锋总部。岗位要求精通Java/Kotlin开发,熟悉Android Automotive OS(AAOS)及车机互联协议(CarPlay/HiCar等),具备车载硬件适配及车规级应用开发经验。主要职责包括需求分析、APP架构设计、核心功能开发(导航/娱乐/车控)、性能优化及多屏联动适配。需掌握车载场景下的交互规范,能进行高低温等极端环境测试。要求3年以上车载安卓开发经验,熟悉MVVM架构及协程编程, 阅读详情

原文链接: http://stackvoid.com/performance-tuning-on-android/

本文记录了Android App优化需要用到的工具和以及在实践中的Tips。也算对我这半年来部分工作的总结。

工具

Hierarchy Viewer 是 Android SDK 自带的 Layout 嵌套检查工具,以可视化的布局角度直观获取 Layout 布局设计和各种属性信息,来帮助我们完成优化布局的设计。需要注意的是,出于安全考虑 Hierarchy Viewer 只能连接Android开发版手机(需要安装ViewServer)或是模拟器。

1

注意上图右半部分显示的时间

  • Measure: 0.977ms
  • Layout: 0.167ms
  • Draw: 2.717ms

我们知道Android View在绘制图形的时候主要耗时的操作就在 Measure、Layout 和 Draw 这三个过程;并且任何一个 View 绘制时间不能超过 16.7ms(每秒60帧才能保证流畅度)。

如果 UI 出现卡顿或掉帧,那么 Hierarchy Viewer 这个工具及其有用,可以分析当前 View 是哪些 View 以及是 View 的哪个过程加载延迟,通过这些信息基本可定位到局部 Code。

如何让QC快速追踪和定位性能问题?

当然使用 Android 开发者工具里的 Profile GPU rendering (GPU呈现模式分析) 工具(Android4.1以上)。它能够从屏幕上活动的所有Android Activity生成性能视图,其中绿线代表 16ms,频繁超过此线的 Activity 就要排查性能问题了。

如何定位到某个方法?

用 Hierarchy Viewer 知道是哪一个子 View 耗时比较多,找到此 View 的Code,那么如何定位到具体某个方法里呢? 当然需要 traceview 工具。traceview 工具十分强大,可以轻松把每个方法占用 CPU 时间计算出来,找到占用时间最长的方法,然后分析此方法即可。

Lint 工具已经集成于 Android Studio,同样是非常强大的工具。它会给出 Layout 优化提示(既包括图片资源、layout文件,也有定义的String常量和Color常量以及Layout写法不规范),告诉你哪些资源没有被引用,Manifest文件的错误等;我主要用 lint 来哪些资源文件没有被引用到(给APK瘦身),以及部分代码不规范的地方。

内存优化工具

Memory Monitor:查看整个app所占用的内存,以及发生GC的时刻,短时间内发生大量的GC操作是一个危险的信号(发生内存抖动)。

Allocation Tracker:追踪内存的分配。

Heap Tool:查看当前内存快照,便于对比分析哪些对象有可能是泄漏了的。

布局优化

布局标签

<include> 标签,将布局中公共部分提取出来共用;例如网易新闻一条新闻的标题栏和评论界面的标题栏。

<viewstub> 标签,同 include,可引入布局,但是默认情况引入的布局不会占用资源,在解析当前 Layout 时节省计算、内存资源。当需要加载此 View 的时候,需要动态 inflate 起来。

Tips:将一个view设置为GONE不会被系统解析,从而提高layout解析速度,而VISIBLE和INVISIBLE这两个可见性属性会被正常解析。

<merge> 标签,解决 Layout 嵌套过多的问题,通过工具通过 hierarchy viewer 可直观的显示出来。

其他

减少 inflate 次数:inflate 是比较耗资源的,当内存够用时,可以将 View 缓存起来,下次直接使用;用空间换时间。

ListView 优化,请见我另外一篇博客。

关于 Layout 优化,推荐一篇博客,给我很大帮助,性能优化系列。

代码Tips

性能优化之Java(Android)代码优化,这篇博客详细介绍了如何进行代码优化,包括缓存、数据存储、异步、数据库和网络等操作的优化。

关于缓存,上文没有提到一个重要的库:DiskLruCache;DiskLruCache 是关于数据硬盘缓存的,Android DiskLruCache完全解析,硬盘缓存的最佳方案 这篇博客详细介绍了 DiskLruCache 使用方法和注意事项。

避免随意使用静态变量,当某个对象被定义为stataic变量所引用,虚拟机通常是不会回收这个对象所占有的内存。

避免过多过常的创建java对象,JVM 创建和回收耗时,频繁使用对象,最好创建缓存;每次回收对象,都是 STW(Stop the World),所以如果对象过多,可能引起卡顿(大于16ms,引起掉帧)。可用 Memory Monitor 或 Allocation Tracker 工具来查看这类问题。

多使用局部变量,函数执行完,就释放内存被虚拟机回收。

使用StringBuilder和StringBuffer进行字符串连接,尤其在做 SQL 拼装的时候。

单线程应尽量使用HashMap, ArrayList,如果不确定是单线程还是多线程,建议还是用 ConcurrentHashMap...

尽量在finally块中释放资源,例如很多 Cursor。

慎用异常,创建一个异常时,需收集一个栈记录(stack track),用于描述异常是在何处创建的。构建这些此栈时需要为运行时栈做一份快照,这一部分开销很大。

View绘制

过度绘制问题

为什么会出现过度绘制:多个 View 重叠,复杂 Layout 叠加;导致 GPU 需要绘制多层,有些时候非常耗时。

Android性能优化之过渡绘制,这篇博客作者用实例来解决过度绘制的问题,解决过度绘制问题时,作者也使用了我们上面介绍的几个工具。

View局部更新

一些复杂的 View,如果每次 View 有局部更新都要重新绘制 View的话,GPU 会显得力不从心。通过canvas.clipRect() 方法来让系统识别可绘制区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。clipRect方法节约了CPU与GPU资源,不会绘制clipRect区域外的地方,仅仅绘制内容在矩形区域内的组件。

电量优化

尽量减少唤醒屏幕的次数与持续的时间(屏幕是用电大户),用WakeLock来处理唤醒的问题,能够正确执行唤醒操作并根据设定及时关闭操作进入睡眠状态,使用 wakelock.acquice() 方法,一定要加上超时处理(例如释放锁)。

等到设备处于充电状态或者电量充足的时候才进行耗时耗电操作(如分享传送数据、图片处理等)

触发网络请求的操作,每次都会保持无线信号持续一段时间,我们可以把零散的网络请求打包进行一次操作,避免过多的无线信号引起的电量消耗(例如APP的数据采集)。

Battery Historian Tool(Android 5.0)这个工具可以详细查看各类应用的用电情况。

APK 瘦身

代码瘦身

库的使用可以极大方便开发者快速开发产品,但也引入了潜在的 bug 以及库过大导致APK过大的问题。移除没有用的 dependency libraries 是一个很好的建议。另外适当的给库瘦身(提取自己想要的功能)也很重要。如果对 APK 代码非常熟悉可以使用 Proguard (会遍历你的所有代码然后找出无用处的代码)优化。

控制资源文件

剔除没有用的资源文件(使用 Lint 可轻松检测到)。

资源里的照片先进行压缩再使用。合适的时候可以用代码控制图片大小作为不同分辨率屏幕的资源。

为应用提供 hdpi, xhdpi 和 xxhdpi 这几个屏幕密度的支持。如果某些设备不是这几个屏幕密度的,不用担心,Android 系统会自动使用存在的资源为设备计算然后提供资源文件。

总结

出现卡顿的根本原因:系统绘制 View 超过 16ms,出现掉帧才导致卡顿或不流畅。解决方法:

  • Hierarchy Viewer,Profile GPU rendering,traceview
  • 抽象布局标签,使用标签 include、viewstub、merge
  • 多使用缓存
  • 尽量避免过度绘制
  • 自定义复杂 View,动态更新 View 内容
  • 正确使用 wakelock,保持 App 用电量

Reference

Android Performance Patterns

Android性能优化之过渡绘制

Android性能优化典范

Performance Tuning On Android

基于MediaStore的安卓相册管理App开发:权限、存储与性能优化实践 在Android应用开发中,访问和管理系统媒体文件是高频需求,其核心机制是MediaStore——一个提供统一媒体数据库访问接口的系统组件。理解不同安卓版本的存储权限模型,尤其是Android 13之后的细粒度媒体权限,是构建合规相册应用的前提。通过ContentResolver查询媒体库,借助缩略图加载降低内存开销,并注册ContentObserver监听媒体库变化实现增量更新,可以高效完成相册扫描、分组展示与文件管理。面对分区存储的限制,正确处理图片路径、删除与重命名操作,同时结合RecyclerVie 阅读详情

相关推荐

rk3326 MIPI休眠唤醒黑屏有背光问题

** 1.问题现象: ** **【开机起来】**开机起来可以正常显示 **【按power按键休眠】**第二次按下Power按键进入休眠,隔10s,再按Power按键唤醒。 **【出现结果】**屏幕黑屏有背光,并提示drm time out错 **【lcd信息】**lcd为480*800 2lane的mipi **【复现概率】**第二次按下休眠唤醒必然复现 【具体错误log如下】 //第一次休眠的log// [ 54.858511] dw-mipi-dsi ff450000.dsi: final DSI-

Ian22l的博客 3944

APP性能优化

APP性能优化分:卡顿处理、耗电处理、安装包瘦身、APP启动四大方面。 文章目录1、卡顿处理1.1、卡顿分析1.2、卡顿优化1、CPU 优化2、GPU 优化离屏渲染1、离屏渲染消耗性能的原因2、哪些操作会触发离屏渲染?1.3、卡顿检测2、耗电处理2.1、好点主要来源2.2、耗电优化3、安装包瘦身4、APP的启动4.1、APP启动分类4.2、APP启动时间分析4.2.1、dyld 阶段4.2.2、runtime 阶段4.2.3、main4.3、APP启动优化5、问答拓展 1、卡顿处理 1.1、卡顿分析 APP

chenzimin_blog 4422

告别DLTS的模糊地带:手把手教你用拉普拉斯深能级瞬态光谱(LDLTS)精准揪出半导体缺陷

本文详细介绍了拉普拉斯深能级瞬态光谱(LDLTS)技术在半导体缺陷检测中的高分辨率解决方案。相比传统DLTS,LDLTS通过拉普拉斯变换和正则化算法,将分辨率提升至1meV,有效解析复杂重叠缺陷谱,适用于硅、GaN等材料的精确缺陷分析。文章涵盖LDLTS原理、系统搭建、测量流程及工业应用案例,为半导体工艺优化提供强大工具。

weixin_29238147的博客 193

APP-细说APP网络深度优化与网络安全

说到APP优化,我们也可以从很多方面进行优化,从包大小、页面流畅度、内存占用、数据缓存、网络数据安全等等来优化加固我们的APP在移动端APP网络优化也是APP性能优化的一个非常重要的一个点,而且99.99%的APP都会伴随着网络交互;

wuli1024的博客 1400

Anti-UAV 反无人机大赛数据集处理脚本(1)标签转换为YOLO格式

【代码】Anti-UAV 反无人机大赛数据集处理脚本(1)标签转换为YOLO格式。

qq_45937329的博客 534

独立站SaaS平台源码搭建全流程指南:从零到部署

一、什么是独立站SaaS?二、搭建前的准备工作技术选型建议模块 推荐方案 备选方案前端框架 React/Vue3 + TypeScript Angular后端框架 Spring Boot (Java)/Django (Python) Node.js (NestJS)数据库 MySQL + Redis PostgreSQL/MongoDB云服务 阿里云/腾讯云/AWS 华为云容器化 Docker + Kubernetes Docker Compose环境要求。

Vx18664956126的博客 1892

安卓进阶(一)App性能优化

include>标签可以实现在一个layout中引用另一个layout的布局,这通常适合于界面布局复杂、不同界面有共用布局的APP中,比如一个APP的顶部布局、侧边栏布局、底部Tab栏布局、ListView和GridView每一项的布局等,将这些同一个APP中有多个界面用到的布局抽取出来再通过。Android系统为每个应用程序分配的内存有限,当应用程序中出现内存泄露较多,不正常使用内存等情况时,容易导致应用程序出现所需的内存超出系统能够为其分配的内存限额(OOM),从而导致程序崩溃。

芸兮的博客 2330

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2701

android——关于app性能优化篇

应用性能优化是指通过各种技术手段和优化策略,提高应用程序的性能,使其能够更高效地运行和响应用户操作。下面介绍一些常见的应用性能优化方法。

wy313622821的博客 1504

CTF---Web---文件包含---01

文章目录前言一、题目描述二、解题步骤1.查看源代码2.文件包含(/etc/passwd)3.解码总结 前言 题目分类: CTF—Web—文件包含 一、题目描述 题目:提示寻找passwd文件 二、解题步骤 1.查看源代码 提示所有图片存储路径是download.php?name=img, 此时name参数的存在就提示此题可能为“文件包含”。 2.文件包含(/etc/passwd) 两种查看方式: 2.1、访问view-source:http://192.168.87.180/download.php

qq_22160557的博客 1391

【数据集】CMIP6气候模式数据下载

简介CMIP6及其气候模式数据下载

WW、forever的博客 9360

某度App启动性能优化实践篇

启动性能是百度App最核心指标之一。用户希望应用能够及时响应并快速加载,启动时间过长的应用不能满足这个期望,并且可能会令用户失望,这种糟糕的体验可能会导致用户在应用商店针对您的应用给出很低的评分,甚至完全抛弃您的应用。启动性能的优化成为了体验优化中最关键的一环,百度App在此方向持续投入,不断优化,提升用户体验。

1 241

Allegro如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层

在Allegro做PCB设计的时候,如果需要复制器件的位号到其它层是无法直接实现的,如果直接拷贝器件的位号的话,效果如下。但是Allegro的Cross Copy命令是支持复制任何属性的图形到其它层的,下面以复制器件位号和丝印外框为例说明。同样如果使用Z-copy命令,也是无法Z-copy text的,Finds下方texts是灰色的。如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层。另外cap处可以选择线段的端点是圆形,八角形,或者方形的铜皮。拷贝C1013,出现的是C*

weixin_54787054的博客 2672

android快速消耗资源,Android App 性能优化实践

Android App 性能优化实践本文记录了Android App优化需要用到的工具和以及在实践中的Tips。也算对我这半年来部分工作的总结。工具Hierarchy Viewer 是 Android SDK 自带的 Layout 嵌套检查工具,以可视化的布局角度直观获取 Layout 布局设计和各种属性信息,来帮助我们完成优化布局的设计。需要注意的是,出于安全考虑 Hierarchy Viewe...

weixin_39837352的博客 197

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安卓插件化开发!美团点评APP在移动网络性能优化的实践,Android篇

写在前面 1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷……尽管很多时候我们自己知道,我不是找不到工作,只是找不到理想中的好工作。但这也不能改变你的空白期正在一天一天变长,不妥协的那份坚定正在一天一天动摇的事实。 朋友推荐给我这份文档,狂刷五遍之后,最近刚刚获得字节跳动等多家公司的offer,今天将这份文档分享给大家,希望正在找工作或准备找工作的朋友都可以获得自己心仪公司的offer。 第一

381

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Yume1.5:基于扩散模型的交互式3D场景生成技术解析

扩散模型作为生成式AI的核心技术,通过逐步去噪过程实现高质量内容生成。其原理是通过训练网络预测并移除数据中的噪声,从而学习数据分布特征。在计算机视觉领域,扩散模型已广泛应用于图像生成、视频合成等任务,展现出强大的创造力和可控性。Yume1.5创新性地将扩散模型应用于3D场景生成,通过TSCM(联合时空通道建模)技术解决长视频生成的显存爆炸问题,并实现文本控制的实时交互。该技术在游戏开发、虚拟现实等领域具有重要应用价值,其开源特性也为AI社区贡献了新的工具资源。

weixin_33698043的博客 431

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android性能优化实践之App端

内存优化在Android开发中,有一些实践可以帮助进行内存优化,以减少应用程序的内存占用和提高性能。以下是一些常见的内存优化实践:使用合适的数据结构和集合:选择合适的数据结构和集合来存储和操作数据,以减少内存占用。例如,使用SparseArray代替HashMap,使用ArrayList代替LinkedList等。及时释放资源:在不再需要的时候,及时释放资源,如关闭数据库连接、释放文件句柄、取消注册广播接收器等。避免内存泄漏:确保在不再需要时及时释放对象的引用,避免造成内存泄漏。

Chen SenQuan的专栏 281

Android App性能优化之内存优化实践

题记:APP性能优化之内存优化三步论:这是为什么呢?怎么干?开始干为什么要进行内存优化1.APP运行内存限制,OOM导致APP崩溃。 2.APP性能:流畅性,响应速度用户体验 学习路线Android的内存管理方式1.Android系统内存分配与回收方式一个APP通常就是一个进程对应一个虚拟机 GC只在heap剩余空间不够时才发出垃圾回收 GC触发时,所有的线程都会被暂停 2.APP内存限制机制每个A

weijiaxing 820

深入浅出:Android屏幕刷新机制,美团点评APP在移动网络性能优化的实践

链接:https://juejin.im/post/6874483682699132935 基础知识 View绘制 这部分在之前的文章有过专门的说明Android的View绘制机制 在我们之前的代码中,对于15-17这部分并没有进行任何的详解,那么底层是如何产生Vsync的信号,然后又是如何通知到我们的应用进行屏幕刷新呢?这不分就是我们这篇文章的关注点。 入口 mChoreographer = Choreographer.getInstance(); //Choreographer.java fra

m0_65321095的博客 1016

android布局优化 工具,Android App 性能优化实践

本文记录了Android App优化需要用到的工具和以及在实践中的Tips。也算对我这半年来部分工作的总结。工具Hierarchy Viewer 是 Android SDK 自带的 Layout 嵌套检查工具,以可视化的布局角度直观获取 Layout 布局设计和各种属性信息,来帮助我们完成优化布局的设计。需要注意的是,出于安全考虑 Hierarchy Viewer 只能连接Android开发版手机...

weixin_35355560的博客 175
上一篇: 开放授权协议OAuth2.0简介
drunkcello
博客等级 码龄14年 12粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值