App性能优化浅谈,2024年最新秋招面试会问什么问题

这个部分涉及客户端的优化,也涉及服务端的优化,这里只讨论客户端。

HTTP请求方式

我们的app一般离不开网络,请求接口是最平常的操作了,如何请求,请求什么我们在开发初期就要定好,服务端给我的提供的接口,大致可以通过GET、POST、HEAD、PUT、DELETE这几种请求方式,不同的请求方式有不同应用场景,比如GET请求,应当用来请求返回结果,参数是作为url的一部分;POST请求,用于请求会更改服务端数据或状态;HEAD请求跟GET一样,只是服务器不能在响应里返回消息主体;PUT请求,用于将网页放置正确的地方;DELETE请求用于删除服务器指定文档。

使用优秀的开源Http框架是我们比较好的选择,它的优点是经过市场的验证,很多坑都被填过,缺点也是我们需要去深究它才能对其进行扩展,遇到坑也不一定能填。

如果自己造轮子的话,还需要我们花时间去验证去适应我们的业务需求,但好处是我们可以自己去扩展可把控,不过这很考量开发者的素质。

数据解析

实际开发当中服务端的返回数据格式无非就两种:

- JSON

- XML

这两种格式数据格式各有优劣,从可读性来看,xml略微好一点,不过JSON也有规范的标签,从解析难度和速度来看,大家都比较倾向使用JSON,目前JSON也是主流的数据格式。

在Android中均可以使用优秀的解析库来加快我们的解析速度,XML中有dom4j,JSON有Jackson、Gson,我们通过这些库实现我们更快的完成数据解析,提高我们的开发效率。

数据存储

上一节讲的是数据解析,我们解析完后的数据,可能就需要将数据存储在某个地方,Android的五种存储方式:

- Content Provider(主要用来向其他应用程序共享数据)

- SQLite(存储数据到数据库中)

- File(本地文件保存)

- SharedPreference(主要用来保存简单的配置信息)

- 网络存储(WebService返回的数据或是解析HTTP协议实现网络数据交互)

为了提高应用程序的响应时间,数据缓存是一个比较好的方式,我们可以预处理服务器返回的数据,对数据进行缓存刷新。

优化点:

- 异步请求网络数据

- 预处理服务器返回数据

- 异步进行数据存储操作

- 数据缓存刷新

- Timeout超时重试

- 在主线程中操作UI

界面卡顿

====

ANR表示”应用程序无响应”,这个是需要我们避免发生的事情,出现这个异常的原因:

- 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件

- BroadcastReceiver在10秒内没有执行完毕

导致ANR的原因有很多,一般情况就是在UI线程做了耗时的操作,例如”网络请求”、数据库操作。

那么如何避免?

- UI线程只做界面刷新,不做任何耗时操作,耗时操作放在子线程来做

- 可以使用Thread+handle或者AsyncTask来进行逻辑处理

耗内存

===

每部手机的内存有限,我们这里所说的内存指的是手机的RAM,它是Ramdom Access Memory的缩写,我们应用程序的需要随机读写的数据就存在RAM中,Android手机之所以会比较耗内存,这跟Android后台的处理有关,我们知道Android应用是使用Java开发的,运行Java需要有虚拟机,说明每开启一个应用都会创建一个虚拟机,而这是需要内存的,所以我们开的应用越多,后台进程越多,内存都分配出去了,才导致内存消耗的严重。

其实这个问题我们是没得破的,只要内存不够,我们的应用还是会卡。我们开发的应用依赖与系统给我们分配的堆内存,一般上限在16M~48M,但我们可以通过在AndroidManifest设置Application属性largeHeap=“true”来申请更多的堆内存。

通过以下代码获取可用堆内存限制:

mActivityManager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);

mMaxMemory = mActivityManager.getMemoryClass();

内存泄露

====

内存泄露这个问题已经被说烂了,大家都知道有内存泄露这个问题存在,但为什么会发生内存泄露?

这里的内存泄露并不是真正意思上的泄露,而是因为内存不足不能进行GC操作,从而导致占用内存过大,抛出out of memory异常,而被系统Kill掉。

JVM回收机制


是时候讲讲JVM的回收机制了,看下图:

JVM分代

JVM对Java对象分了三个代进行管理,分别为年轻代、年老代、永久代。

年轻代(Young Generation):绝大多数的Java对象会在年轻代被分配,也会在年轻代被回收。

年老代(Old Generation):在年轻代长期存在没有被回收的Java对象会转移到年老代,这个堆空间通常会被比年轻代的堆空间要大。

永久代:存放VM和Java类的元数据,以及interned字符串和类的静态变量。

这里涉及到JVM的相关知识,这里不继续深入探讨。

但我们应该可以知道垃圾回收器的作用:

- 分配内存

- 保证所有正在被引用的对象还存在于内存中

- 回收执行代码已经不再引用的对象所占的内存

对象引用


Java的引用类型可以分为以下几种:

- 强引用(Strong Ref):强可达,去掉强可达,才会被回收。

- 软引用(Soft Ref):内存够用,就保持,内存吃紧,则回收,主要用来做缓存。

- 弱引用(Weak Ref):比Soft Ref弱,即使内存不吃紧也会被回收。

- 虚引用(Phantom Ref):不会在内存保持任何对象。

一图胜千言:

对象引用

利用Strong Ref,存储大量数据,直到heap撑破,利用inter strings(或者class loader加载大量的类)把perm gen撑破,然后就是内存泄露了。

如何优化?

=====

前面讲了一些背景知识,对我们理解内存优化有一定的帮助,下面就简单说一下我们优化的方向:

- 布局优化

- 内存优化

布局优化


大家可以拿出你们的Android机

开发者工具-Profile GPU Rendering-选择在屏幕上显示条形图

-蓝色代表测量绘制Display List的时间

-红色代表OpenGL渲染Display List所需要的时间

-黄色代表CPU等待GPU处理的时间

-中间绿色横线代表VSYNC时间16ms,尽量将所有条形图控制在这条绿线下

为什么是16ms?

Android 通知界面渲染和重绘的时间要在16ms内完成,如果超过16ms,就会导致丢帧,也就是我们常说的卡顿。

优化点:

- 避免OverDraw

- 优化布局层级

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

资料.png
资料图.jpg

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

[外链图片转存中…(img-3FUXIGLI-1712781859438)]
[外链图片转存中…(img-n2itmO38-1712781859438)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-lvorxqnO-1712781859438)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值