2025年,一个11年的Android老古董谈谈现代Android开发和APP开发的未来如何?

3,389 阅读10分钟

前言

一路走来,时至今日,已经陪伴Android开发11个年头了,作为11年的Android老古董,今天笔者就浅谈下我是怎么看现代未来Android开发的。

Android发展

我们知道Android是2008年首次发布的,经过这么多年的不断迭代更新,无论是UI风格,开发方式,架构和开发工具都出现了很大的变化。

早期阶段(2008-2014)XML,Activity时代

那个时候我们写的UI风格大多是九宫格样式,现在看起来显得很old school了。 主要写XML与Activity,我们在XML绘制布局,在Activity里面处理逻辑(现在Android开发也差不多一样哈)。采用的MVC的开发模式,所以随着逻辑代码越写越多,Activity就显得很臃肿,复杂一点的页面,Activity动不动就是上千行代码,而且代码耦合度高,很难复用和生命周期也不好管理。 列表使用ListView和Gridview。编译器呢是用Eclipse来开发,AndroidStudio那时还没出现呢,估计现代很多Android开发者是没经历过这段历史的。

架构革新(2014-2018)Jetpack,AndroidStudio时代

这段时间Material Design与Jetpack诞生了,我们开始逐步接受使用新的开发工具AndroidStudio,早期的AndroidStudio大家用起来又卡又不习惯,当时还是被很多人吐槽。我们越来越多的使用RecycleView来替代ListView,Fragment也常常用来做多页面的切换,开始使用MVVM的开发模式,引入ViewModel来作为连接UI(View层)和业务逻辑(Model层)的桥梁角色,实现UI和业务的解耦、叫做关注点分离,UI只专注于UI上的事,Activity不再那么臃肿,生命周期也更好管理,代码复用性更强。

现代阶段(2019至今) Kotlin,Jetpack Compose时代

随着简洁,现代,安全的Kotlin语言来开发Android被越来越多的人接受,我们不需要再忍受Java那种死板,空指针不安全的编程体验。Jetpack Compose的发布(21年正式发布)标志着Android进入现代声明式UI开发时代,为开发者带来了全新的开发范式。这个阶段的Android手机的使用体验也是大大提升,说Android手机卡慢的人也越来越少了,属于是真正的成熟了。

现代Android开发的四大支柱

1000.png

1.Jetpack组件

Jetpack提供了一系列高质量帮助开发者提高开发效率的库,包括Lifecycle、Navigation、Paging、Room,Hilt等,帮助开发者实现常见功能,简化开发流程。 例如使用ViewModel来做UI的状态管理和数据提供

class MyViewModel : ViewModel() {
    private val _text = MutableLiveData<String>()
    val text: LiveData<String> get() = _text

    fun updateText(newText: String) {
        _text.value = newText
    }
}

@Composable
fun MyScreen(viewModel: MyViewModel) {
    val text by viewModel.text.observeAsState("")
    Text(text = text)
}

2.Kotlin

Kotlin是现代Android开发的默认语言,这个我们都知道。很多时候,协程(Coroutines)、扩展函数(Extension Functions),高阶函数,Flow等,也是极大地提高了我们的开发效率。比如说多个网络请求合并成一个结果,用Flow就很合适,相比之前我们用RxJava写起来方便太多了。说起RxJava,当时各种记操作符,被面试官问到RxJava知多少时的表情,依然难以忘怀。

虽然Kotlin很好,但是很多APP是写于2019年之前的,项目大部分代码依然还是Java,所以时至今日我还看到一些Android开发者是没有使用Kotlin的,问就是,用Java又不是不能实现,对吧?

3.Jetpack Compose

Jetpack Compose的发布,我认为是Android开发十几年来最大的改变,这种现代式的采用声明式的语法,使UI开发更加直观和高效。编写UI和代码逻辑,使用的是同一种语言kotlin,代码写UI也更加灵活多变。

这种现代声明式开发和组件化设计,和目前其他同样是声明式开发的SwiftUI,Flutter,ArkUI,React Native 都很像,我们学好了Compose 再去学这些UI框架也更容易上手。

4.现代高效工具链 Android Studio+Gradle

Android Studio给我们带来了高效的开发体验,无论是编码和调试都很方便,特别加上AI插件智能补全,不要太爽好吧。同时AndroidStudio中编写Compose UI的开发体验越来越强大,预览效果和XML的预览比起来完全是碾压级别。 Gradle 的使用也更方便我们的项目模块化依赖,2014年那会还是用的Maven呢。

最佳实践

项目架构模式

现在的Android APP模块越来越多,我们开发的时候,都选择了模块化开发,更利于维护。关于 模块的分层我们可以参考Android官方的项目NowAndroid 链接:github.com/android/now… 从最外层开始分为app,feature,core三层架构,app层下可以对应不同的app,feature层下放的是各功能模块,core则是核心的通用组件或者网络库,日志库等;如图

dep_graph_app.svg

开发架构模式

开发的架构也是推荐,MVVM + 单向数据流架构, MVVM(Model-View-ViewModel)是现代Android应用的推荐架构,结合单向数据流可以确保数据状态的可预测性。

MVVM+Flow+Jetpack Compose 现在成了UI架构的黄金组合,我们在开发过程中遵循的原则是,数据向下,事件向上。这样数据往下传递,而且不能被改变,只能通过事件向上传递来要求改变传入的数据。这种单向的数据流向更可控和利于维护,这样的Compose组件也能更好的复用。

data class UiState(val isLoading: Boolean, val data: List<String>?)

class MyViewModel : ViewModel() {
    private val _uiState = MutableStateFlow(UiState(isLoading = true, data = null))
    val uiState: StateFlow<UiState> get() = _uiState

    fun loadData() {
        viewModelScope.launch {
            val data = repository.fetchData()
            _uiState.value = UiState(isLoading = false, data = data)
        }
    }
}

@Composable
fun MyScreen(viewModel: MyViewModel) {
    val uiState by viewModel.uiState.collectAsState()
    if (uiState.isLoading) {
        CircularProgressIndicator()
    } else {
        LazyColumn {
            items(uiState.data ?: emptyList()) { item ->
                Text(text = item)
            }
        }
    }
}

依赖注入

由于现在开发大量使用了MVVM开发模式,每一个UI页面几乎都要搭配了一个或者几个ViewModel,因为专注点要分离,我们也会加上Repository层来管理数据来源,这时候对象的创建和依赖就变得很繁琐,特别是给ViewModel的构造器传入参数的时候很不方便。Koin或Hilt这些依赖注入框架就能很方便的解决这个问题。

@HiltViewModel
class MyViewModel @Inject constructor(private val repository: MyRepository) : ViewModel() {
    // ViewModel逻辑
}

@AndroidEntryPoint
class MyActivity : AppCompatActivity() {
    private val viewModel: MyViewModel by viewModels()
}

相对于Hilt,本人其实是更推荐使用Koin作为依赖注入。虽然Hilt是Android官方的依赖注入框架,但是因为其来自于以前的Dragger框架,是Java写的,没有Koin这个纯kotlin写的框架那样简单易用和跨平台性。而且Koin所维护的公司也是kotlin基金会成员之一,相信长期维护这一块不用担心,Koin的插件也在开发中,可以期待一波。

APP跨平台时代的到来

随着鸿蒙next原生系统的发布,中国的开发者往往需要兼容三个平台,这时候企业要做到降本增效的话,对我们的UI和代码逻辑的复用性提出了要求,跨平台越来越成为了当前APP开发中绕不开的话题了。 Flutter、React Native以及Kotlin Multiplatform(KMP)正逐步成为现代APP开发的重要组成部分。怎么把跨平台技术如何融入现有体系,如何把我们UI和逻辑代码最大程度上三端共享,保证UI和逻辑的统一,现在越发凸显其重要性了。

Flutter

Flutter自不用说,发展到现在也是很成熟了,各大APP也都在使用,比如微信,钉钉,贝壳等。它因为是独立绘制,能在像素级别上保证Android,iOS的UI的一致性,也就少了和测试,UI解释为啥你们两端实现的UI效果咋不一样的困扰,它的目标是多端UI一致,而且性能上也是挺好的,仅次于原生。

React Native

React Native也有大量的APP使用,美团,钉钉,雪球等APP,性能上比Flutter稍弱一点,不过发布0.76版本后(话说什么时候能升级到1.0版本呢,有生之年系列之一吗?),性能提升很大,不过新版本对Android最低兼容到api24 7.0 iOS最低兼容到iOS15.1 ,这最低系统要求Android还好,iOS估计的劝退一拨人吧。我们公司的iOS APP最低兼容iOS12 以至于他们都很难用上他们的现代UI框架SwiftUI。React Native因为调用的是原生控件,能做到APP内UI是统一的,你很难分出哪个控件是React Native做的,哪个是原生的,而且支持动态化也是它的一个优点。

Kotlin Multiplatform

2024年Google I/O大会就明确提出,官方支持。可以在Android和iOS上分享逻辑代码,现有的库,Room,Life,Datastore都已经支持,未来应该会越来越多的库开始支持。KMP技术的优点在于它和原生有一样的性能,不同代码调用也很简单直接,不需要桥接的方式。

图片描述 前阵子看了2024年Kotlin中文开发者大会,主题是随处可见的KMP,来自于腾讯视频,B站,快手,QQ团队都分享了他们使用KMP技术适配鸿蒙,使用kotlin/native方案,实现三端代码逻辑共享的经验和总结,所以KMP的技术未来很是值得期待。

Compose Multiplatform

这个Compose的开源库是由JetBrains公司维护的,能让Compose UI在多个平台上的共享,目前桌面和Android端已经稳定,iOS还处于Beta阶段,在Android APP上的写的ComposeUI页面能够迁移到iOS,也是非常不错的尝试。

总结,跨平台技术我认为目前最成熟落地的是Flutter和React Native ,KMP的跨鸿蒙能力很让人期待,不过存在一定的技术门槛,KMP的落地我们可以先从业务逻辑跨Android和iOS两端开始做起。

未来展望

现在的APP开发,大部分情况是进行老APP的维护和迭代升级,很难有新的需求说要从零开始开发一个新的APP了,需求在减少,企业也在降本增效,对APP的开发效率,缩短迭代周期上也提出了要求。

跨平台技术可以说是每个APP开发者不得不去学习的事情,是深耕原生系统开发,进到系统的底层,还是多多学习其他跨平台知识,我相信每个人都有自己的考量。

目前的大环境是怎样,也不用我多说。iOS和Android的需求也已经饱和,H5,跨平台技术都在占领原生开发的领地。所以作为一个程序员,我想,始终保持对技术的热忱,能够快速的适应当前市场的技能要求,才能活下去,这回真的是活下去了。

最后祝福国运昌隆,祝大家都有好前程!