面试时面试官问到,你做过哪些性能优化?

本文是一位有2-3年开发经验的程序员分享的Android性能优化面试经验,包括APP启动优化、内存优化、稳定性保障、网络优化、存储优化、自定义View优化、耗电量优化、日志优化和APK体积优化等方面。通过实际项目经验,详细阐述了每个环节的优化策略和技术细节,如启动优化中的白屏处理、主线程耗时操作避免、内存泄漏检测等。
摘要由CSDN通过智能技术生成

如果你已经有 2 - 3 年以上开发经验还不懂的怎么去优化自己的项目,那就有点说不过去了,下面是我自己总结的一套通用级别的 Android 性能优化。

1、 你对 APP 的启动有过研究吗? 有做过相关的启动优化吗?

程序员:

之前做热修复的时候研究过 Application 的启动原理。项目中也做过一些启动优化。

面试官:

哦,你之前研究过热修复? (这个时候有可能就会深入的问问热修复的原理,这里咱们就不讨论热修复原理) 那你说说对启动方面都做了哪些优化?

程序员:

1. 我发现程序在冷启动的时候,会有 1s 左右的白屏闪现,低版本是黑屏的现象,在这期间我通过翻阅系统主题源码,发现了系统 AppTheme 设置了一个 windowBackground ,由此推断就是这个属性捣的鬼,开始我是通过设置 windowIsTranslucent 透明属性,发现虽然没有了白屏,但是中间还是有一小段不可见,这个用户体验还是不好的。

最后我观察了市面上大部分的 Android 软件在冷启动的时候都会有一个  Splash 的广告页,同时在增加一个倒数的计时器,最后才进入到登录页面或者主页面。我最后也是这样做的,原因是这样做的好处可以让用户先基于广告对本 APP 有一个基本认识,而且在倒数的时候也预留给咱们一些对插件和一些必须或者耗时的初始化做一些准备。

Ps:这里会让面试官感觉你是一个注重用户体验的

2. 通过翻阅 Application 启动的源码,当我们点击桌面图标进入我们软件应用的时候,会由 AMS 通过 Socket 给 Zygote 发送一个 fork 子进程的消息,当 Zygote fork 子进程完成之后会通过反射启动 ActivityThread##main 函数,最后又由 AMS 通过 aidl 告诉 ActivityThread##H 来反射启动创建Application 实例,并且依次执行 attachBaseContext 、onCreate 生命周期,由此可见我们不能在这 2 个生命周期里做主线程耗时操作。

Ps: 这里会让面试官感觉你对 App 应用的启动流程研究的比较深,有过真实的翻阅底层源码,而并不是背诵答案。

3. 知道了  attachBaseContext 、onCreate  在应用中最先启动,那么我们就可以通过 TreceView 等性能检测工具,来检测具体函数耗时时间,然后来对其做具体的优化。

  1. 项目不及时需要的代码通过异步加载。

  2. 将对一些使用率不高的初始化,做懒加载。

  3. 将对一些耗时任务通过开启一个 IntentService来处理。

  4. 还通过 redex 重排列 class 文件,将启动阶段需要用到的文件在 APK 文件中排布在一起,尽可能的利用 Linux 文件系统的 pagecache 机制,用最少的磁盘 IO 次数,读取尽可能多的启动阶段需要的文件,减少 IO 开销,从而达到提升启动性能的目的。

  5. 通过抖音发布的文章知晓在 5.0 低版本可以做 MultiDex 优化,在第一次启动的时候,直接加载没有经过 OPT 优化的原始 DEX,先使得 APP 能够正常启动。然后在后台启动一个单独进程,慢慢地做完 DEX 的 OPT 工作,尽可能避免影响到前台 APP 的正常使用。

Ps:1. 面试官这里会觉得你对启动优化确实了解的不错,有一定的启动优化经验。

4. Application 启动完之后,AMS 会找出前台栈顶待启动的 Activity , 最后也是通过 AIDL 通知 ActivityThread#H 来进行对 Activity 的实例化并依次执行生命周期 onCreate、onStart、onRemuse  函数,那么这里由于 onCreate 生命周期中如果调用了 setContentView 函数,底层就会通过将 XML2View 那么这个过程肯定是耗时的。

所以要精简 XML 布局代码,尽可能的使用 ViewStub、include 、merge 标签来优化布局。接着在 onResume 声明周期中会请求 JNI 接收 Vsync (垂直同步刷新的信号) 请求,16ms 之后如果接收到了刷新的消息,那么就会对 DecorV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值