当前位置: 首页 > news >正文

2023年Android现代开发

2023年现代Android开发

下面与大家分享如何构建具有2023年最新趋势的Android应用程序。
Android modern dev

Android是什么?

Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备,包括智能手机、平板电脑、电视和智能手表。

目前,Android 是世界上移动设备使用最多的操作系统;根据statcounter的一份最近 12 个月的样本报告,Android 的市场份额为71.96%。

接下来,我将提及我认为对于在 Android 上构建现代应用程序很重要的工具、库、体系结构、指南和其他实用程序的列表。

Kotlin

Kotlin 是由JetBrains开发的一种编程语言。由谷歌推荐,谷歌于 2017 年 5 月正式宣布Kotlin作为Android开发语言。它是一种与 Java 兼容并可以运行在 JVM 上的现代编程语言,这使得它在 Android 应用程序开发中的采用速度非常快。
kotlin

不管你是不是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

Jetpack Compose 文档
https://developer.android.com/jetpack/compose

Jetpack Compose 是 Android Jetpack 库的一部分,使用 Kotlin 编程语言轻松创建原生用户界面。此外,它还与其他 Android Jetpack 库(例如 LiveData 和 ViewModel)集成,以便更轻松地构建响应式和可维护的 Android 应用程序。

Jetpack Compose 的一些主要功能包括:

  1. 声明式用户界面。
  2. 可定制的小部件。
  3. 易于与现有代码集成。
  4. 实时预览。
  5. 改进的性能。

资源

  • 官方文档
    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 版本和设备一致工作的代码,以便开发人员可以专注于他们关心的代码。
Jetpack

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

MD
Material Design 是一个适应性强的指南、组件和工具系统,支持用户界面设计的最佳实践。在开源代码的支持下,Material Design 简化了设计人员和开发人员之间的协作,并帮助团队快速构建精美的产品。

官网
https://m3.material.io/

Material Design 得到了 Google 的设计师和开发人员的支持,这将使我们有一个指南来处理 Android、Flutter 和 Web 的 UI/UX。

目前,Material Design 的最新版本是 3。

Clean Arch

Clean arch

它基于通过将软件划分为层来实现职责分离。

特征

  1. 独立于框架。
  2. 可测试。
  3. 独立于用户界面。
  4. 独立于数据库。
  5. 独立于任何外部机构。
  6. 依赖规则

作者在他的文章

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 等。

Android Clean Arch

Presentation Layer的架构模式

架构模式是一种更高级别的策略,旨在帮助设计软件架构,其特点是在可重用框架内为常见架构问题提供解决方案。架构模式类似于设计模式,但它们的规模更大,并且解决更多的全局问题,例如系统的整体结构、组件之间的关系以及数据的管理方式。

在表示层中,我们有一些架构模式,其中我想强调以下几点:

  • MVVM
  • MVI

Android 架构指南
https://developer.android.com/topic/architecture
MVI arch

依赖注入

依赖注入是一种软件设计模式,它允许客户端从外部源获取其依赖项,而不是自己创建它们。它是一种用于在对象及其依赖项之间实现控制反转 (IoC) 的技术。

  • Hilt ❤️
    https://developer.android.com/training/dependency-injection/hilt-android
  • Dagger
    https://dagger.dev/
  • Koin
    https://insert-koin.io/

模块化

模块化是一种软件设计技术,它允许您将应用程序划分为独立的模块,每个模块都有自己的功能和责任。
Modularization

模块化的好处

可重用性:通过拥有独立的模块,它们可以在应用程序的不同部分甚至其他应用程序中重用。

严格的可见性控制:模块使您能够轻松控制向代码库的其他部分公开的内容。

可定制的交付: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及线程管理

Flow
当我们谈论反应式编程和异步过程时,我们的第一个选择是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
构建移动应用程序的一个重点是能够在本地持久保存数据,例如一些会话数据或缓存数据等。根据您的应用需求选择正确的存储选项非常重要。我们可以存储键值对等非结构化数据或数据库等结构化数据。请记住,这一点并未提及我们可用的所有类型的本地存储(例如文件存储),仅提及允许我们保存数据的工具。
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

R8

  • 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

Play Feature Delivery

自适应布局

Adaptive layouts
Adaptive layouts
随着具有不同形状因素的移动设备使用的增长,我们需要有工具使我们能够使用适应不同类型屏幕的 Android 应用程序。这就是 Android 为我们提供Window Size Classes的原因,简单来说,它是三大屏幕格式组,它们标记了我们开发设计的关键点。有了这个,我们避免了考虑许多屏幕设计的复杂性,将我们的可能性减少到 3 组,即:Compat、Medium和Expanded 。
Windows 尺寸等级
Window witdh
Window height
支持不同的屏幕尺寸
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

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

性能表现

Performance
当我们为 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
app update

应用内评论

Google Play 应用内评论 API 可让您提示用户提交 Play 商店评分和评论,而无需离开您的应用或游戏。

通常,应用内评论流程可以在应用的整个用户旅程中随时触发。在此流程中,用户可以使用 1 到 5 星系统对您的应用进行评分并添加可选评论。提交后,评论将发送到 Play 商店并最终显示。

为保护用户隐私并避免 API 滥用,您的应用应遵循有关何时请求应用内评论和评论提示设计的严格指南。

应用内评论文档

https://developer.android.com/guide/playcore/in-app-review

In-App Reviews

辅助功能

Accessibility
辅助功能是软件设计和构造中的一个重要功能,除了改善用户体验外,它还为需要辅助功能的人提供使用应用程序的能力。该概念旨在改善的一些残障人士包括:有视力问题、色盲、听力问题、灵活性问题和认知障碍等的人。

注意事项:

  • 增加文本可见性(颜色对比度、可调整大小的文本)
  • 使用大而简单的控件
  • 描述每个 UI 元素

辅助功能官方文档
https://developer.android.com/guide/topics/ui/accessibility

安全

Security
安全性即使不是最重要的方面,也是我们在开发保护设备完整性、数据安全性和用户信任的应用程序时必须考虑的因素,这就是为什么我在下面列出一系列帮助您实现此目的的提示。

  • 加密敏感数据和文件:使用EncryptedSharedPreferencesEncryptedFile
  • 应用基于签名的权限:
  • 在您可以控制的应用程序之间共享数据时,使用基于签名的权限。
< 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
Linter 是一种编程工具,用于分析程序源代码以发现代码中潜在的问题或错误。这些问题可能是句法、不合适的代码风格、缺乏文档、安全问题等等,它们会对代码的质量和可维护性产生影响。

  • Android Lint
    https://medium.com/swlh/what-is-android-lint-17fa0d87abb2
  • Detekt
    https://detekt.dev/
  • Ktlint
    https://pinterest.github.io/ktlint/

相关文章:

  • 人工智能大模型之ChatGPT原理解析
  • ChatGPT-4.0 : 未来已来,你来不来
  • EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)
  • 智能生活垃圾检测与分类系统(UI界面+YOLOv5+训练数据集)
  • 字节跳动软件测试岗,前两面过了,第三面HR天坑!竟然跟我说……
  • Jetson Nano驱动机器人的左右两路电机
  • 西瓜视频登录页面
  • 【文心一言】什么是文心一言,如何获得内测和使用方法。
  • 详解分库分表设计
  • 微信小程序项目实例——扫雷
  • 一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?
  • 云上办公系统项目
  • Python自动化抖音自动刷视频
  • 基于Vue+Vue-cli+webpack搭建渐进式高可维护性前端实战项目
  • C#等高级语言运行过程
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES2017异步函数现已正式可用
  • Gradle 5.0 正式版发布
  • HashMap ConcurrentHashMap
  • java小心机(3)| 浅析finalize()
  • Laravel 菜鸟晋级之路
  • Node项目之评分系统(二)- 数据库设计
  • Twitter赢在开放,三年创造奇迹
  • unity如何实现一个固定宽度的orthagraphic相机
  • windows下mongoDB的环境配置
  • 从tcpdump抓包看TCP/IP协议
  • 大主子表关联的性能优化方法
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 排序算法学习笔记
  • 如何用vue打造一个移动端音乐播放器
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 智能网联汽车信息安全
  • Java总结 - String - 这篇请使劲喷我
  • mysql面试题分组并合并列
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (20050108)又读《平凡的世界》
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (floyd+补集) poj 3275
  • (三)Honghu Cloud云架构一定时调度平台
  • (五)IO流之ByteArrayInput/OutputStream
  • (循环依赖问题)学习spring的第九天
  • (转)大型网站的系统架构
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • **CI中自动类加载的用法总结
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .netcore如何运行环境安装到Linux服务器
  • .Net的C#语言取月份数值对应的MonthName值
  • ??myeclipse+tomcat
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚