一、启动优化
优化目标
减少冷启动时间,提升用户体验。
优化方法
延迟初始化: 将非必要的组件(如第三方库)延迟到首屏加载后初始化。
// 使用 Jetpack 的 App Startup 库集中管理初始化
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
// 主线程不阻塞的延迟初始化
AppInitializer.getInstance(this)
.initializeComponent(MyInitializer::class.java)
}
}
异步加载: 将部分初始化任务移至子线程(如使用协程或线程池)。
启动白屏优化: 设置 windowBackground 主题,避免启动时白屏。
<style name="LaunchTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
工具支持
Android Studio Profiler: 分析启动耗时方法。
adb 命令:
adb shell am start -W <package>/<activity>
二、UI 渲染优化
优化目标
保持 60 FPS 的流畅帧率,避免卡顿。
优化方法
布局扁平化: 减少嵌套层级,优先使用 ConstraintLayout。
<androidx.constraintlayout.widget.ConstraintLayout>
<!-- 扁平化布局 -->
</androidx.constraintlayout.widget.ConstraintLayout>
避免过度绘制:
移除不必要的 background 属性。
使用 canvas.clipRect() 限制绘制区域。
视图复用: 使用 RecyclerView 替代 ListView,优化 ViewHolder。
异步渲染: 复杂 UI 分块加载(如分页加载列表)。
工具支持
Layout Inspector: 查看布局层级。
GPU 渲染模式分析: 开发者选项中启用,检测掉帧情况。
三、内存优化
优化目标
减少内存泄漏和内存抖动,避免 OOM(OutOfMemoryError)。
优化方法
避免内存泄漏:
使用 WeakReference 或 Lifecycle 管理资源。
及时注销监听器和广播(如 EventBus、BroadcastReceiver )。
Bitmap 优化:
// 使用 inSampleSize 压缩图片
val options = BitmapFactory.Options().apply { inSampleSize = 2 }
BitmapFactory.decodeResource(resources, R.drawable.large_image, options)
内存缓存: 使用 LruCache 或 Glide 的自动内存管理。
对象池技术: 复用频繁创建的对象(如 Message.obtain())。
工具支持
LeakCanary: 自动检测内存泄漏。
MAT (Memory Analyzer Tool): 分析堆转储文件。
Android Profiler: 实时监控内存分配。
四、网络优化
优化目标
减少流量消耗,提升请求效率。
优化方法
请求合并: 将多个接口合并为批量请求。
缓存策略:
// OkHttp 缓存配置
val cache = Cache(File(context.cacheDir, "http_cache"), 10 * 1024 * 1024)
val client = OkHttpClient.Builder().cache(cache).build()
数据压缩: 使用 Protocol Buffers 替代 JSON。
连接复用: HTTP/2 多路复用减少握手开销。
工具支持
Charles/Fiddler: 抓包分析网络请求。
Firebase Performance Monitoring: 监控网络性能。
五、电池与功耗优化
优化目标
降低后台耗电,提升续航。
优化方法
减少唤醒锁: 避免 PowerManager.WakeLock 滥用。
JobScheduler: 批量处理后台任务。
val jobScheduler = getSystemService(Context.JOB_SCHEDULER_SERVICE) as JobScheduler
val jobInfo = JobInfo.Builder(jobId, ComponentName(this, MyJobService::class.java))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
.build()
jobScheduler.schedule(jobInfo)
传感器使用优化: 及时注销传感器监听。
AlarmManager 替代方案: 使用 WorkManager 处理定时任务。
工具支持
Battery Historian: 分析电池消耗详情。
六、代码与包体积优化
优化目标
减少 APK 体积,提升安装效率。
优化方法
资源压缩:
使用 WebP 格式替代 PNG/JPG。
启用资源混淆(shrinkResources true)。
代码混淆:启用 R8 或 ProGuard。
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
动态下发: 按需加载模块(如使用 App Bundle)。
工具支持
Android Size Analyzer: 分析 APK 组成。
七、监控与持续优化
线上监控
Firebase Crashlytics: 收集崩溃日志。
Matrix: 腾讯开端的性能监控框架,检测卡顿、内存等问题。
自动化测试
Espresso/UIAutomator: UI 自动化测试确保优化后功能正常。
总结
| 优化方向 | 关键手段 | 工具/技术 |
|---|---|---|
| 启动优化 | 延迟初始化、异步加载、主题优化 | App Startup、Profiler |
| UI 优化 | 布局扁平化、视图复用、避免过度绘制 | ConstraintLayout、Layout Inspector |
| 内存优化 | 弱引用、Bitmap 压缩、LeakCanary | LeakCanary、MAT |
| 网络优化 | 缓存、数据压缩、HTTP/2 | OkHttp、Protocol Buffers |
| 电池优化 | JobScheduler、WorkManager | Battery Historian |
| 包体优化 | 资源压缩、代码混淆、动态下发 | R8、Android Size Analyzer |
核心原则:
数据驱动: 通过工具量化性能指标,避免盲目优化。
平衡取舍: 在性能、代码可维护性、开发效率之间找到平衡。
持续迭代: 性能优化是长期过程,需结合用户反馈和监控数据持续改进。