Android性能优化
一、性能优化全景图
二、启动优化
1. 启动流程分析
2. 优化策略
冷启动优化
减少
Application.onCreate()
工作量延迟初始化三方库
使用App Startup库管理初始化
视觉优化
使用启动主题避免白屏
添加Splash Screen
异步初始化
使用IntentService或线程池
使用Jetpack Startup库
3. 代码示例
class MyApp : Application() {override fun onCreate() {super.onCreate()// 延迟非关键初始化initDelayedComponents()}private fun initDelayedComponents() {val startupExecutor = Executors.newSingleThreadExecutor()startupExecutor.execute {// 后台初始化非关键组件initThirdPartyLibs()}}
}// 使用Jetpack App Startup
class MyInitializer : Initializer<Unit> {override fun create(context: Context) {// 初始化工作WorkManager.initialize(context, Configuration.Builder().build())}override fun dependencies(): List<Class<out Initializer<*>>> {return listOf(WorkManagerInitializer::class.java)}
}
4. 总结
"启动优化主要从三个方面入手:
Application优化:通过延迟初始化非关键组件,使用Jetpack Startup库管理初始化顺序
视觉优化:配置启动主题避免白屏,添加Splash Screen提升用户体验
异步加载:使用线程池或IntentService在后台初始化非UI相关组件"
三、UI渲染优化
1. 渲染流程
2. 优化策略
布局优化
使用ConstraintLayout减少嵌套
使用Merge标签
使用ViewStub延迟加载
过度绘制优化
移除不必要的背景
使用
canvas.clipRect()
列表优化
使用RecyclerView替代ListView
实现ViewHolder模式
使用DiffUtil更新数据
自定义View优化
避免在onDraw中创建对象
使用硬件加速
3. 核心工具
Layout Inspector:分析布局层次
GPU渲染分析:定位掉帧问题
Choreographer:监控帧率
4. 总结
"UI渲染优化主要解决卡顿和掉帧问题:
布局优化:使用ConstraintLayout减少嵌套层级
列表优化:实现ViewHolder模式并配合DiffUtil,使列表滑动FPS稳定在60帧
过度绘制:移除冗余背景,使用clipRect限制绘制区域
工具使用:通过GPU渲染分析和Choreographer监控帧率,定位性能瓶颈"
四、内存优化
1. 内存管理模型
2. 优化策略
内存泄漏检测
避免Activity泄漏
使用WeakReference
大图优化
使用BitmapRegionDecoder
适当采样率(inSampleSize)
对象复用
对象池模式
复用Bitmap
内存监控
使用Profiler分析内存分配
LeakCanary检测泄漏
3. 代码示例
// 大图加载优化
fun loadLargeImage(context: Context, resId: Int, imageView: ImageView) {val options = BitmapFactory.Options().apply {inJustDecodeBounds = true}BitmapFactory.decodeResource(context.resources, resId, options)// 计算采样率options.inSampleSize = calculateInSampleSize(options, imageView.width, imageView.height)options.inJustDecodeBounds = false// 使用ARGB_8888格式options.inPreferredConfig = Bitmap.Config.ARGB_8888// 加载优化后的Bitmapval bitmap = BitmapFactory.decodeResource(context.resources, resId, options)imageView.setImageBitmap(bitmap)
}private fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {val (height, width) = options.run { outHeight to outWidth }var inSampleSize = 1if (height > reqHeight || width > reqWidth) {val halfHeight = height / 2val halfWidth = width / 2while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {inSampleSize *= 2}}return inSampleSize
}
4. 总结
"内存优化主要解决OOM和泄漏问题:
泄漏检测:使用LeakCanary检测并修复Activity泄漏
大图处理:采用BitmapRegionDecoder和采样加载
对象复用:实现Bitmap池和对象池
监控体系:建立OOM监控和线上内存报警机制,及时发现内存问题"
五、网络优化
1. 优化策略
请求优化
合并请求
使用缓存策略
数据优化
使用Protobuf替代JSON
Gzip压缩
连接优化
HTTP/2
连接复用
监控优化
网络质量监控
失败重试机制
2. 核心工具
Charles/Fiddler:抓包分析
Stetho:网络调试
Network Profiler:性能分析
3. 总结
"网络优化主要提升速度和成功率:
协议优化:使用HTTP/2和连接复用,减少TCP握手时间
数据优化:采用Protobuf替代JSON
缓存策略:实现三级缓存(内存-磁盘-网络),离线可用率100%
监控体系:建立网络质量监控,自动切换备用服务器"
六、存储优化
1. 优化策略
文件操作
避免主线程I/O
使用NIO
数据库优化
索引优化
批量操作
序列化优化
使用Parcelable替代Serializable
使用FlatBuffers
SharedPreferences优化
迁移到MMKV
2. 代码示例
// 数据库批量操作优化
fun batchInsertUsers(users: List<User>) {database.beginTransaction()try {users.forEach { user ->val values = ContentValues().apply {put("name", user.name)put("age", user.age)}database.insert("users", null, values)}database.setTransactionSuccessful()} finally {database.endTransaction()}
}
3. 总结
"存储优化主要解决I/O瓶颈:
数据库优化:通过索引和批量操作
文件操作:使用NIO和异步I/O
序列化:采用Parcelable和FlatBuffers
SharedPreferences优化:迁移到MMKV"
七、电量优化
1. 优化策略
任务调度
使用JobScheduler
批量处理任务
传感器使用
及时注销监听器
降低采样率
后台限制
减少后台服务
使用WorkManager
2. 核心工具
Battery Historian:电量分析
Profiler:耗电监控
3. 总结
"电量优化主要减少后台消耗:
任务调度:使用JobScheduler合并任务
后台限制:移除不必要的后台服务
监控体系:使用Battery Historian分析耗电场景"
八、APK瘦身
1. 优化策略
资源优化
使用WebP替代PNG
移除未使用资源
代码优化
ProGuard/R8混淆
移除未使用代码
动态交付
App Bundle
功能按需加载
2. 面试回答模板
"APK瘦身主要从三个维度进行:
资源优化:使用WebP格式
代码优化:通过R8移除未使用代码
动态交付:采用App Bundle,减少用户下载体积”
九、性能优化流程图
十、性能优化总结
"在性能优化方面,主要从六个维度系统推进:
启动优化:通过懒加载关键组件和启动任务分级
UI渲染优化:采用布局扁平化和异步绘制
内存优化:解决泄漏问题和优化大图加载
网络优化:通过缓存策略和数据压缩
存储优化:使用高效存储方案
APK瘦身:资源压缩和代码混淆"