Android平台开发:可维护 Jetpack 架构落地指南(3000+字实战)
引言:为什么平台开发更需要“可维护架构”
Android 平台开发常见痛点不是“写不出来功能”,而是功能越多越难改、越改越容易崩。平台开发更强调可维护性、扩展性和一致性。本文给出一套工程可落地的 Jetpack 分层架构方案,包含职责划分、数据流、错误处理、测试与性能策略,目标是让你能稳定地做中大型功能迭代。
一、核心目标与边界定义
平台开发的首要目标是:稳定、可扩展、可回归。因此必须明确边界:
- UI 层只负责展示与交互,不写业务逻辑
- Domain 层负责业务规则与状态转换
- Data 层负责数据来源与缓存策略
这三层清晰后,任何新功能只需遵循既定路径即可落地。
二、推荐分层架构(UI + Domain + Data)
1) UI 层(Activity/Fragment/Compose)
UI 层只订阅状态,不直接操作数据源。
class HomeFragment : Fragment() {
private val vm: HomeViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
lifecycleScope.launchWhenStarted {
vm.uiState.collect { render(it) }
}
}
}
2) Domain 层(UseCase/Interactor)
Domain 层封装业务规则,避免 UI 直接调用 Repository。
class LoadFeedUseCase(private val repo: FeedRepository) {
suspend operator fun invoke(): Result<List<FeedItem>> {
return repo.loadFeed()
}
}
3) Data 层(Repository + DataSource)
Repository 决定数据策略:缓存优先、网络优先、兜底数据等。
class FeedRepository(
private val remote: FeedRemoteDataSource,
private val local: FeedLocalDataSource
) {
suspend fun loadFeed(): Result<List<FeedItem>> {
val cached = local.getCached()
if (cached.isNotEmpty()) return Result.success(cached)
val fresh = remote.fetch()
local.save(fresh)
return Result.success(fresh)
}
}
三、数据流与状态管理(StateFlow/UiState)
稳定的 UI 需要稳定的状态流。推荐用 StateFlow + UiState 描述状态。
data class HomeUiState(
val loading: Boolean = false,
val data: List<FeedItem> = emptyList(),
val error: String? = null
)
class HomeViewModel(
private val loadFeed: LoadFeedUseCase
) : ViewModel() {
private val _state = MutableStateFlow(HomeUiState())
val uiState: StateFlow<HomeUiState> = _state
fun refresh() = viewModelScope.launch {
_state.value = _state.value.copy(loading = true)
val result = loadFeed()
_state.value = result.fold(
onSuccess = { HomeUiState(data = it) },
onFailure = { HomeUiState(error = it.message) }
)
}
}
四、错误处理与重试策略
平台开发必须具备统一错误处理方式:
- 统一 Result 封装
- 统一错误码映射
- UI 层只展示可读提示
sealed class AppError(val code: Int, val msg: String) {
object Network : AppError(1001, "网络异常")
object Server : AppError(1002, "服务器异常")
class Unknown(e: Throwable) : AppError(9999, e.message ?: "未知错误")
}
五、缓存策略(性能关键)
平台开发往往要求页面秒开,缓存策略非常关键:
- 列表数据先走本地缓存
- 后台异步刷新
- 缓存失效机制明确
if (cache.isValid()) return cache.data
val fresh = api.fetch()
cache.save(fresh)
return fresh
六、模块化与依赖管理
项目越大,模块化越重要:
- feature 模块解耦
- core 模块提供基础能力
- data 模块统一数据入口
推荐 Gradle 结构:
- :app
- :core
- :data
- :feature:home
- :feature:profile
七、常见坑与排查
- UI 直接调用网络 → 逻辑分散,难维护
- ViewModel 里塞业务 → 后续复用困难
- Repository 没缓存策略 → 体验不稳定
- 错误处理不统一 → UI 提示乱
八、性能与稳定性优化要点
- 主线程只渲染,不做 IO
- 大列表用分页与预加载
- 网络层统一超时与重试
- 全链路加埋点定位性能瓶颈
九、工具与验证方法
- Android Studio Profiler:监控 CPU/内存
- StrictMode:发现主线程 IO
- Traceview:分析关键路径
- LeakCanary:排查内存泄漏
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.build()
)
十、工程师实践建议
- 先搭好架构再写功能,比后期重构省 10 倍成本
- 每个新功能都必须走 UseCase + Repository
- 每个页面都要有统一状态模型
结论
平台开发的本质是“工程可持续性”。只要分层清晰、数据流统一、缓存策略稳定,复杂业务也能保持高迭代效率。下一篇可以继续深入“模块化拆分实战”或“数据层缓存最佳实践”。
