跳到主要内容

多进程问题排查

场景

App 使用了多进程(WebView 独立进程、推送 Service 独立进程),出现数据不同步、初始化多次等问题。

排查与方案

1. 常见问题

问题原因解决
Application 多次初始化每个进程都会创建 Application判断进程名再初始化
SharedPreferences 不同步SP 各进程独立缓存改用 MMKV(支持跨进程)或 ContentProvider
单例失效静态变量每个进程独立IPC 通信同步状态
内存占用倍增每个进程独立分配内存控制进程数量

2. 只在主进程初始化

class App : Application() {
override fun onCreate() {
super.onCreate()
if (isMainProcess()) {
// 只在主进程初始化 SDK
initSDKs()
}
}

private fun isMainProcess(): Boolean {
val pid = android.os.Process.myPid()
val manager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
return manager.runningAppProcesses?.any {
it.pid == pid && it.processName == packageName
} ?: false
}
}

3. 跨进程通信

方式适用场景特点
AIDL复杂接口,高频调用灵活但开发成本高
Messenger简单消息传递基于 Handler,串行处理
ContentProvider数据共享基于 Binder,适合 CRUD
BroadcastReceiver广播通知简单,但有延迟
MMKVKV 存储共享mmap 实现,高性能

面试答题要点

  1. Application.onCreate 会被每个进程调用,需判断进程名
  2. SharedPreferences 不支持跨进程,用 MMKV 或 ContentProvider 替代
  3. 控制进程数量(通常主进程 + WebView 进程即可)
  4. 各种 IPC 方式的选择依据

相关链接