启动、内存、耗电与卡顿优化
⚡ 移动端性能优化最直接影响用户退款率。利用工具定量定位和判断功效比拍脑猜测更有效。
启动时间优化
冷启动 vs 热启动
| 类型 | 定义 | 目标 |
|---|---|---|
| 冷启动 | 应用完全不在内存中 | < 5 秒 |
| 热启动 | 应用已在内存中 | < 2 秒 |
Android 启动优化
// 延迟初始化非关键路径
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
// 安全检查等屏前必要的操作
initCrashReporter()
// 延迟无关紧要的 SDK
lifecycleScope.launch(Dispatchers.IO) {
initAnalytics()
initPush()
}
}
}
// App Startup 按需延迟
class NonCriticalInitializer : Initializer<Unit> {
override fun create(context: Context) = Unit
override fun dependencies() = emptyList<Class<out Initializer<*>>>()
}
iOS 启动优化
func application(_ application: UIApplication,
didFinishLaunchingWithOptions...) -> Bool {
// 只初始化第一屏需要的配置
setupRootViewController()
// 其他延迟加载
DispatchQueue.global().async {
SDKManager.shared.initialize()
}
return true
}
内存优化
// Android:监听内存压力
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
when (level) {
TRIM_MEMORY_RUNNING_CRITICAL,
TRIM_MEMORY_UI_HIDDEN -> {
imageCache.clear()
}
}
}
// 使用 LeakCanary 检测内存泄漏
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.x'
}
图片内存优化
// Glide 配置内存和磁盘缓存上限
@GlideModule
class AppGlideModule : AppGlideModule() {
override fun applyOptions(context: Context, builder: GlideBuilder) {
builder.setMemoryCache(LruResourceCache(20 * 1024 * 1024)) // 20MB
builder.setDiskCache(
InternalCacheDiskCacheFactory(context, 50 * 1024 * 1024)
)
}
}
耗电优化
// WorkManager 将后台任务集中到充电时执行
val constraints = Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.setRequiresBatteryNotLow(true)
.build()
val syncWork = PeriodicWorkRequestBuilder<SyncWorker>(1, TimeUnit.HOURS)
.setConstraints(constraints)
.build()
WorkManager.getInstance(context)
.enqueueUniquePeriodicWork("sync",
ExistingPeriodicWorkPolicy.KEEP, syncWork)
帧率优化(流畅度)
// Android 正常帧率:60fps = 16.7ms/帧
// 常见卡顿原因:
// 1. RecyclerView onBindViewHolder 里做资源加载
// 2. 主线程有网络/IO 操作
// 3. 过度绘制(视图层加深)
// 使用 Android Studio Profiler → CPU → 录制帧数据
// adb shell dumpsys gfxinfo <包名> 获取帧耗时统计
常见误区
- 应用所有 SDK 在 Application.onCreate 里同步初始化,导致冷启动慢
- 图片没有缩略图展示,3000×4000 图展示在 100dp 的 ImageView 中
- 内存泄漏没有及时发现,导致 OOM