Android面试题:App性能优化之电量优化和网络优化

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析DNS,个人版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

电量优化

Doze模式

  • 系统的行为
  • 进入Doze后看看App有没有奔溃就可以

Standby待机模式

  • 针对某个应用

处于上述模式,App会无法访问网络

解决方案

  • 可以手动申请权限让用户把App加入白名单

  • 或者注册电池电量变化广播,当处于充电状态时才做一些上报日志等操作(8.0以后广播要动态注册,manifest文件注册失效)

  • WorkManager,不过部分国内的手机可能会不支持

电量工具

Battery Historian
AS 的 Energy Profile
  • 支持8.0以上

电量优化

  • 减少操作:比如网络请求,可以考虑缓存数据
  • 推迟操作:比如等连接WiFi再上传日志
  • 合并操作:比如服务器接口合并

网络优化

网络请求流程:

DNS -> IP -> Socket(Tcp/IP) -> IO发送Http报文

DNS优化: HTTPDNS

  • 传统DNS解析是UDP协议

  • HTTPDNS是Http协议,阿里云的HTTPDNS就是先用固定IP解析DNS,不行就再用域名解析

  • 由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问domain 解析过程,所以从根本上避免了劫持问题

  • DNS 解析由自己控制,可以确保根据用户所在地返回就近的 IP 地址,或根据客户端测速结果使用速度最快的IP

  • 一次请求解析多个域名

Keep alive

Okhttp请求头里默认就设置为true,需要服务同意,服务端也可能会关掉

  • socket可以重复使用
  • Http1.1一次只处理一个请求,虽然可以复用,但如果同时请求多个连接,就需要再创建新的socket
  • http2提出了多路复用,也同样是复用一个连接,不过这条连接支持同时处理多条请求,所有请求都可以在这条连接上进行。
  • 多路复用把在连接里传输的数据都封装成一个个stream,每个stream都有标识,stream的发送和接收可以是乱序的,不依赖顺序,也就不会有阻塞的问题,接收端可以根据stream的标识去区分属于哪个请求,再进行数据拼接,得到最终数据。
  • OKhttp3以上版本支持了http2

数据压缩

protobuf

目前最流行的两种数据格式是 json 和 protobuf,json 是字符串,protobuf 是二进制,即使用各种压缩算法压缩后,protobuf 仍会比 json 小,数据量上 protobuf 有优势,序列化速度 protobuf 也有一些优势。

  • 需要服务端也支持
  • AS上面可以安装一个插件:Protocol Buffer Editor
  • 然后需要依赖Google官方的 javalite依赖
  • 如果要编译时自动将proto文件转成Java,需要安装Google的gradle插件protobuf-gradle-plugin
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.13'
apply plugin: 'com.google.protobuf'
implementation 'com.google.protobuf:protobuf-javalite:3.11.0'
gzip

http可以对内容body部分编码,OKhttp中已经加了请求头("Accept-Encoding", "gzip"),如果服务器支持,并且返回内容响应头里有Content-Encodin:gzip,OKhttp就会帮我们解压

  • 需要服务器支持

其他优化

1、使用webp代替png/jpg

2、不同网络的不同图片下发,如(对于原图是300x300的图片):

  • 2/3G使用低清晰度图片:使用100X100的图片;
  • 4G再判断信号强度为强则使用使用300X300的图片,为中等则使用200x200,信号弱则使用100x100图片;
  • 这个需要和服务端合作,客户端可以在请求头里面加入当前用户的手机网络状态

WiFi网络:直接下发300X300的图片

3、http开启缓存 / 首页数据加入缓存


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
6天前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
19 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
3天前
|
SQL 安全 Java
Android经典面试题之Kotlin中object关键字实现的是什么类型的单例模式?原理是什么?怎么实现双重检验锁单例模式?
Kotlin 单例模式概览 在 Kotlin 中,`object` 关键字轻松实现单例,提供线程安全的“饿汉式”单例。例如: 要延迟初始化,可使用 `companion object` 和 `lazy` 委托: 对于参数化的线程安全单例,结合 `@Volatile` 和 `synchronized`
14 6
|
5天前
|
XML Android开发 数据格式
Android面试题之DialogFragment中隐藏导航栏
在Android中展示全屏`DialogFragment`并隐藏状态栏和导航栏,可通过设置系统UI标志实现。 记得在布局文件中添加内容,并使用`show()`方法显示`DialogFragment`。
17 2
|
9天前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
22 6
|
9天前
|
Android开发
Android面试题之自定义View注意事项
在Android开发中,自定义View主要分为四类:直接继承View重写onDraw,继承ViewGroup创建布局,扩展特定View如TextView,以及继承特定ViewGroup。实现时需注意:支持wrap_content通过onMeasure处理,支持padding需在onDraw或onMeasure/onLayout中处理。避免在View中使用Handler,使用post系列方法代替。记得在onDetachedFromWindow时停止线程和动画以防止内存泄漏。处理滑动嵌套时解决滑动冲突,并避免在onDraw中大量创建临时对象。
15 4
|
7天前
|
Android开发
Android面试题之View的invalidate方法和postInvalidate方法有什么区别
本文探讨了Android自定义View中`invalidate()`和`postInvalidate()`的区别。`invalidate()`在UI线程中刷新View,而`postInvalidate()`用于非UI线程,通过消息机制切换到UI线程执行`invalidate()`。源码分析显示,`postInvalidate()`最终调用`ViewRootImpl`的`dispatchInvalidateDelayed`,通过Handler发送消息到UI线程执行刷新。
15 1
|
10天前
|
Android开发 Kotlin
Android面试题之 Kotlin中退出迭代器的方式有哪些
在Android和Kotlin中,遍历集合时可使用迭代器结合`break`提前终止循环。例如,使用`while`和迭代器,或用`forEach`配合`return@forEach`来中断遍历。若需退出外层函数,可定义自定义标签。在遍历并删除元素时,这些技巧尤其有用。
15 3
|
10天前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
30 3
|
4天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式有哪些用法
Kotlin的Lambda表达式是匿名函数的简洁形式,常用于集合操作和高阶函数。基本语法是`{参数 -> 表达式}`。例如,`{a, b -> a + b}`是一个加法lambda。它们可在`map`、`filter`等函数中使用,也可作为参数传递。单参数时可使用`it`关键字,如`list.map { it * 2 }`。类型推断简化了类型声明。
7 0
|
4天前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
7 0