2023年现代Android开发
下面与大家分享如何构建具有2023年最新趋势的Android应用程序。
Android是什么?
Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备,包括智能手机、平板电脑、电视和智能手表。
目前,Android 是世界上移动设备使用最多的操作系统;根据statcounter的一份最近 12 个月的样本报告,Android 的市场份额为71.96%。
接下来,我将提及我认为对于在 Android 上构建现代应用程序很重要的工具、库、体系结构、指南和其他实用程序的列表。
Kotlin
Kotlin 是由JetBrains开发的一种编程语言。由谷歌推荐,谷歌于 2017 年 5 月正式宣布Kotlin作为Android开发语言。它是一种与 Java 兼容并可以运行在 JVM 上的现代编程语言,这使得它在 Android 应用程序开发中的采用速度非常快。
不管你是不是Android新手,你都应该把Kotlin作为你的首选,不要逆水行舟🏊🏻😎,Google在Google I/O 2019上宣布了这种做法。有了Kotlin,你将可以使用所有现代语言的特性,包括协程的强大功能和使用为 Android 生态系统开发的现代库。
Kotlin官网
https://kotlinlang.org/docs/home.html
Jetpack Compose
Jetpack Compose 是 Android 推荐的用于构建原生 UI 的现代工具包。它简化并加速了 Android 上的 UI 开发。
Jetpack Compose 文档
https://developer.android.com/jetpack/compose
Jetpack Compose 是 Android Jetpack 库的一部分,使用 Kotlin 编程语言轻松创建原生用户界面。此外,它还与其他 Android Jetpack 库(例如 LiveData 和 ViewModel)集成,以便更轻松地构建响应式和可维护的 Android 应用程序。
Jetpack Compose 的一些主要功能包括:
- 声明式用户界面。
- 可定制的小部件。
- 易于与现有代码集成。
- 实时预览。
- 改进的性能。
资源
-
官方文档
https://developer.android.com/jetpack/compose -
Jetpack Compose 路线图
https://developer.android.com/jetpack/androidx/compose-roadmap -
课程
https://developer.android.com/courses/jetpack-compose/course -
Compose 到 Kotlin 兼容性映射
https://developer.android.com/jetpack/androidx/releases/compose-kotlin
Android Jetpack
Jetpack 是一套库,可帮助开发人员遵循最佳实践、减少样板代码并编写可跨 Android 版本和设备一致工作的代码,以便开发人员可以专注于他们关心的代码。
Android Jetpack 文档
https://developer.android.com/jetpack
它的一些最常用的工具是:
-
ViewModel
https://developer.android.com/topic/libraries/architecture/viewmodel -
Room
https://developer.android.com/training/data-storage/room -
DataStore
https://developer.android.com/topic/libraries/architecture/datastore -
WorkManager
https://developer.android.com/topic/libraries/architecture/workmanager -
Navigation
https://developer.android.com/guide/navigation -
CameraX
https://developer.android.com/training/camerax -
Compose
https://devjorgecastro.medium.com/modern-android-app-development-in-2023-ff445d3652b4#af4e
Material Design
Material Design 是一个适应性强的指南、组件和工具系统,支持用户界面设计的最佳实践。在开源代码的支持下,Material Design 简化了设计人员和开发人员之间的协作,并帮助团队快速构建精美的产品。
官网
https://m3.material.io/
Material Design 得到了 Google 的设计师和开发人员的支持,这将使我们有一个指南来处理 Android、Flutter 和 Web 的 UI/UX。
目前,Material Design 的最新版本是 3。
Clean Arch
它基于通过将软件划分为层来实现职责分离。
特征
- 独立于框架。
- 可测试。
- 独立于用户界面。
- 独立于数据库。
- 独立于任何外部机构。
- 依赖规则
作者在他的文章
The Clean Code Blog中很好地描述了依赖规则
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
使该体系结构起作用的最重要规则是依赖规则。这条规则说源代码依赖只能指向内部。内圈中的任何人都无法对外圈中的事物一无所知。特别是,在外圈中声明的名称不得在内圈中的代码中提及。这包括函数、类。变量,或任何其他命名的软件实体。
Clean Arch Blog
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Android 中的Clean Arch
- 表示:活动、片段、视图模型、其他视图组件。
- 域:用例、实体、存储库和其他域组件。
- 数据:存储库实现、映射器、DTO 等。
Presentation Layer的架构模式
架构模式是一种更高级别的策略,旨在帮助设计软件架构,其特点是在可重用框架内为常见架构问题提供解决方案。架构模式类似于设计模式,但它们的规模更大,并且解决更多的全局问题,例如系统的整体结构、组件之间的关系以及数据的管理方式。
在表示层中,我们有一些架构模式,其中我想强调以下几点:
- MVVM
- MVI
Android 架构指南
https://developer.android.com/topic/architecture
依赖注入
依赖注入是一种软件设计模式,它允许客户端从外部源获取其依赖项,而不是自己创建它们。它是一种用于在对象及其依赖项之间实现控制反转 (IoC) 的技术。
- Hilt ❤️
https://developer.android.com/training/dependency-injection/hilt-android - Dagger
https://dagger.dev/ - Koin
https://insert-koin.io/
模块化
模块化是一种软件设计技术,它允许您将应用程序划分为独立的模块,每个模块都有自己的功能和责任。
模块化的好处
可重用性:通过拥有独立的模块,它们可以在应用程序的不同部分甚至其他应用程序中重用。
严格的可见性控制:模块使您能够轻松控制向代码库的其他部分公开的内容。
可定制的交付:Play Feature Delivery使用应用程序包的高级功能,允许您有条件地或按需交付应用程序的某些功能。
可扩展性:通过拥有独立的模块,可以在不影响应用程序其他部分的情况下添加或删除功能。
易于维护:通过将应用程序划分为独立的模块,每个模块都有自己的功能和职责,代码更容易理解和维护。
易于测试:通过拥有独立的模块,它们可以被隔离测试,这使得检测和修复错误变得容易。
架构改进:模块化有助于改进应用程序的架构,从而更好地组织和构建代码。
改善协作:通过拥有独立的模块,开发人员可以同时处理应用程序的不同部分,而不会受到干扰。
构建时间:一些 Gradle 功能,例如增量构建、构建缓存或并行构建,可以利用模块化来提高构建性能。
更多信息参考官方文档
https://developer.android.com/topic/modularization
网络
- OkHttp
https://square.github.io/okhttp/ - Retrofit
https://square.github.io/retrofit/
序列化
在本节中,我想提一下我认为的两个重要工具:Moshi与 Retrofit 和Kotlin Serialization一起广泛使用,这是 Jetbrain 的 Kotlin 团队的赌注。
-
Moshi
https://github.com/square/moshi -
Kotlin Serialization
https://github.com/Kotlin/kotlinx.serialization
Moshi和Kotlin Serialization是 Kotlin 和 Java 的两个序列化/反序列化库,允许您将对象转换为 JSON 或其他序列化格式,反之亦然。两者都提供了针对移动和桌面应用程序优化的用户友好界面。Moshi 主要关注 JSON 序列化,而 Kotlin 序列化支持各种序列化格式,包括 JSON。
图片加载
要从 Internet 加载图像,可以使用多个第三方库来帮助您处理该过程。图像加载库为您做了很多繁重的工作;它们处理缓存(因此您不会多次下载图像)和网络逻辑以下载图像并将其显示在屏幕上。
-
Android官方文档
https://developer.android.com/jetpack/compose/graphics/images/loading -
Coil
https://github.com/coil-kt/coil#jetpack-compose -
Glide
https://bumptech.github.io/glide/int/compose.html
react及线程管理
当我们谈论反应式编程和异步过程时,我们的第一个选择是Kotlin Coroutines;多亏了Suspension Functions,Flow我们可以满足所有这些需求。但是,我相信在本节中值得强调RxJava甚至在 Android 应用程序开发中的重要性。对于我们这些已经使用 Android 多年的人来说,我们知道 RxJava 是一个非常强大的工具,具有大量用于处理数据流的功能。我仍然认为 RxJava 是今天值得考虑的一个有趣的替代方案。
- Kotlin Coroutines(suspend 及Flow API)
https://github.com/Kotlin/kotlinx.coroutines/blob/master/README.md#using-in-your-projects - RxJava
https://github.com/ReactiveX/RxJava
本地存储
LocalStore
构建移动应用程序的一个重点是能够在本地持久保存数据,例如一些会话数据或缓存数据等。根据您的应用需求选择正确的存储选项非常重要。我们可以存储键值对等非结构化数据或数据库等结构化数据。请记住,这一点并未提及我们可用的所有类型的本地存储(例如文件存储),仅提及允许我们保存数据的工具。
- DataStore
https://developer.android.com/topic/libraries/architecture/datastore - EncryptedSharedPreferences
https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences
测试
Testing
- JUnit 5
https://junit.org/junit5/ - Mockk
https://mockk.io/ANDROID.html - Espresso
https://developer.android.com/training/testing/espresso - Robolectric
https://robolectric.org/
R8 optimizations
R8 是默认编译器,可将项目的 Java 字节码转换为可在 Android 平台上运行的 DEX 格式。它是一种工具,通过缩短类及其属性的名称,消除项目中未使用的代码和资源,帮助我们混淆和减少应用程序的代码。要了解更多信息,请查看有关收缩、混淆和优化您的应用程序的Android 文档。
https://developer.android.com/studio/build/shrink-code
- Code shrinking
- Resource shrinking
- Obfuscation
- Optimization
Play Feature Delivery
Google Play 的应用服务模型称为 Dynamic Delivery,它使用 Android App Bundle 为每个用户的设备配置生成和提供优化的 APK,因此用户仅下载运行您的应用所需的代码和资源。
Android文档
https://developer.android.com/guide/playcore/feature-delivery
自适应布局
Adaptive layouts
随着具有不同形状因素的移动设备使用的增长,我们需要有工具使我们能够使用适应不同类型屏幕的 Android 应用程序。这就是 Android 为我们提供Window Size Classes的原因,简单来说,它是三大屏幕格式组,它们标记了我们开发设计的关键点。有了这个,我们避免了考虑许多屏幕设计的复杂性,将我们的可能性减少到 3 组,即:Compat、Medium和Expanded 。
Windows 尺寸等级
支持不同的屏幕尺寸
https://developer.android.com/guide/topics/large-screens/support-different-screen-sizes
我们拥有的另一个重要资源是Canonical Layouts,它们是预定义的屏幕设计,可用于我们 Android 应用程序中的大多数场景,并向我们展示了如何使其适应大屏幕的指南。
Canonical Layouts
https://m3.material.io/foundations/adaptive-design/canonical-layouts
其他一些资源
3 things to know about Form Factors at Google I/O 2022
https://android-developers.googleblog.com/2022/05/form-factors-google-io-22.html
Playlist: Form Factors at Google I/O
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc_seN7mrwgU7mDYKA0hq_ib
Form-Factor Training
https://developer.android.com/courses/pathways/jetpack-compose-for-android-developers-5
Form Factors at Google I/O 2022 (2)
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc_seN7mrwgU7mDYKA0hq_ib
性能表现
当我们为 Android 开发应用程序时,我们必须确保更好的用户体验,不仅在应用程序开始时,而且在整个执行过程中。出于这个原因,拥有使我们能够对可能影响应用程序性能的情况进行预防性分析和持续监控的工具非常重要,因此这里列出了可以帮助您实现此目的的工具:
- Benchmark
https://developer.android.com/topic/performance/benchmarking/benchmarking-overview - Baseline Profiles
https://developer.android.com/topic/performance/baselineprofiles/overview - App Startup
https://developer.android.com/topic/libraries/app-startup - Firebase Performance Monitoring
https://firebase.google.com/docs/perf-mon - JankStats library
https://developer.android.com/topic/performance/jankstats
应用内更新
当您的用户让您的应用程序在他们的设备上保持最新时,他们可以尝试新功能,并从性能改进和错误修复中受益。尽管某些用户在其设备连接到不按流量计费的连接时启用后台更新,但可能需要提醒其他用户安装更新。应用内更新是一项 Google Play 核心库功能,可提示活跃用户更新您的应用。
运行 Android 5.0(API 级别 21)或更高版本的设备支持应用内更新功能。此外,仅 Android 移动设备、Android 平板电脑和 Chrome 操作系统设备支持应用内更新。
_应用内更新文档
https://developer.android.com/guide/playcore/in-app-updates
应用内评论
Google Play 应用内评论 API 可让您提示用户提交 Play 商店评分和评论,而无需离开您的应用或游戏。
通常,应用内评论流程可以在应用的整个用户旅程中随时触发。在此流程中,用户可以使用 1 到 5 星系统对您的应用进行评分并添加可选评论。提交后,评论将发送到 Play 商店并最终显示。
为保护用户隐私并避免 API 滥用,您的应用应遵循有关何时请求应用内评论和评论提示设计的严格指南。
应用内评论文档
https://developer.android.com/guide/playcore/in-app-review
辅助功能
辅助功能是软件设计和构造中的一个重要功能,除了改善用户体验外,它还为需要辅助功能的人提供使用应用程序的能力。该概念旨在改善的一些残障人士包括:有视力问题、色盲、听力问题、灵活性问题和认知障碍等的人。
注意事项:
- 增加文本可见性(颜色对比度、可调整大小的文本)
- 使用大而简单的控件
- 描述每个 UI 元素
辅助功能官方文档
https://developer.android.com/guide/topics/ui/accessibility
安全
安全性即使不是最重要的方面,也是我们在开发保护设备完整性、数据安全性和用户信任的应用程序时必须考虑的因素,这就是为什么我在下面列出一系列帮助您实现此目的的提示。
- 加密敏感数据和文件:使用
EncryptedSharedPreferences
和EncryptedFile
。 - 应用基于签名的权限:
- 在您可以控制的应用程序之间共享数据时,使用基于签名的权限。
< manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.myapp" >
< permission android:name = "my_custom_permission_name"
android:protectionLevel = "signature" / >
- 不要将应用程序配置所需的密钥、令牌或敏感数据直接放在项目存储库中的文件或类中。请改用
local.properties
。
Version Catalogs
Gradle 提供了一种集中管理项目依赖项的标准方式,称为版本目录;7.0版本试验引入,7.4版本正式发布。
优势:
- 对于每个目录,Gradle 都会生成类型安全的访问器,以便您可以在 IDE 中轻松添加具有自动完成功能的依赖项。
- 每个目录对构建的所有项目都是可见的。它是声明依赖项版本并确保对该版本的更改适用于每个子项目的中心位置。
- 目录可以声明依赖包,它们是通常一起使用的“依赖组”。
- 目录可以将依赖项的组和名称与其实际版本分开,并使用版本引用代替,从而可以在多个依赖项之间共享版本声明。
Catalogs更多信息
https://docs.gradle.org/current/userguide/platforms.html
Logger
logger是一种软件工具,用于记录有关程序执行的信息;重要事件、错误、调试消息和其他可能有助于诊断问题或了解程序工作方式的信息。记录器可以配置为将消息写入不同的位置,例如日志文件、控制台、数据库,或者通过将消息发送到日志服务器。
Timber
https://github.com/JakeWharton/timber
Linter
Linter 是一种编程工具,用于分析程序源代码以发现代码中潜在的问题或错误。这些问题可能是句法、不合适的代码风格、缺乏文档、安全问题等等,它们会对代码的质量和可维护性产生影响。
- Android Lint
https://medium.com/swlh/what-is-android-lint-17fa0d87abb2 - Detekt
https://detekt.dev/ - Ktlint
https://pinterest.github.io/ktlint/