2023年的现代Android开发
#android #jetpackcompose #androiddev #androiddevelopment

大家好ðð»,我想与您分享如何以2023年的最新趋势构建Android应用程序。

免责声明

这是我的意见和专业经验的一篇文章,考虑到Android开发人员社区中的不同意见,还不断审查Google为Android提供的指南。

我必须清楚地表明,我可能不会提到的一些非常有趣的工具,模式和架构,但这并不意味着它们不能成为开发Android应用程序的其他有趣替代方案。



什么是Android?

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

当前,Android是世界上用于移动设备的操作系统;根据statcounter的一份报告,对过去12个月的样本进行了样本,Android的市场份额为71.96%。

接下来,我将提及我认为对于在Android上构建现代应用程序很重要的工具,图书馆,架构,指南和其他公用事业的列表。


Kotlin -

Image by [https://talently.tech/](https://talently.tech/)

Kotlin是JetBrains开发的一种编程语言。由Google推荐的,他于2017年5月正式宣布它(请参阅出版物here)。这是一种现代的编程语言,与Java具有兼容性,可以在JVM上运行,这使其在开发Android应用程序方面非常快。

无论您是否不熟悉Android,您都应该将Kotlin视为您的首选,请不要在Google I// Google I/ announced上游泳。 o 2019.有了Kotlin,您将能够使用现代语言的所有功能,包括Coroutines的力量和为Android生态系统开发的现代图书馆。

官方Kotlin文档here


JetPack组成ð

Image by [blogger.googleusercontent.com](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv3CjuEunEpPuvrsKEV0f7R_OSPonuZnDUi97Hrz68T9xKpsUHRoFaivipPxNQ6QT3BIHVxtSH85xurEqxSnC1S7rQklKL8vKj40E2xgFWE9ylhjZDHbWoie3Evgl_WjnG2nQ1UxFVs9lg3IAMIv_CHCsuesUuCW_BMddUXU4JErFXLn9Twcy2tKKfHA/s1600/Android-JetpackCompose1.2-Header.png)

JetPack组成是Android推荐的现代工具包用于构建本地UI。它简化并加速了Android上的UI开发。
_ Jetpack Compose documentation

JetPack Compose是Android JetPack库的一部分,并使用Kotlin编程语言轻松创建本机用户界面。此外,它与其他Android JetPack库(例如Livedata和ViewModel)集成在一起,以使构建反应性和可维护的Android应用程序更加容易。

JetPack组成的一些关键功能包括:

  1. 声明UI。

  2. 可自定义的小部件。

  3. 简单与现有代码集成。

  4. 实时预览。

  5. 改善了性能。

资源:

Jetpack Compose documentation


Android JetPack

Image by [Florina Muntenescu](https://medium.com/@florina.muntenescu) on [medium](https://medium.com/androiddevelopers/whats-new-in-jetpack-1891d205e136)

JetPack是一套库套件,可帮助开发人员遵循最佳实践,减少样板代码并编写在Android版本和设备上始终工作的代码,以便开发人员可以专注于他们关心的代码。

_ Android Jetpack documentation

其一些最常见的工具是:

材料设计

Illustration by Reed Hollett

材料设计是一种适应性的指南,组件和工具系统,可支持用户界面设计的最佳实践。在开源代码的支持下,材料设计简化了设计师和开发人员之间的协作,并帮助团队迅速构建美丽的产品。
_ Material Design Site

材料设计得到了Google的设计师和开发人员的支持,并将允许我们为Android,Flutter和Web的UI/UX提供指南。

目前,材料设计的最后一个版本是3,您可以看到更多here


干净的体系结构

Cover image for Clean Architecture

Robert C. Martin引入了“ 清洁体系结构” 的概念。它基于通过将软件分为层的责任分开。

特征

  1. 独立于框架。

  2. 可测试。

  3. 独立于UI。

  4. 独立于数据库。

  5. 独立于任何外部机构。

依赖性规则

作者在他的作品The Clean Code Blog

中很好地描述了依赖性规则

使此体系结构工作的重大规则是依赖性规则。该规则说源代码依赖项只能向内指向。内部圆圈中的任何东西都不了解外圈中的某些东西。特别是,在内圆圈中,代码不得提及外圈中声明的事物的名称。其中包括功能,类。变量或任何其他命名软件实体。

The Clean Code Blog

Android中的清洁体系结构

  • 演示:活动,片段,查看模型,其他查看组件。

  • :用例,实体,存储库,其他域组件。

  • 数据:存储库实现,映射器,DTO等。


演示层的架构模式

Cover image for Architecture Patterns for Presentation Layer

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

在演示层中,我们有一些架构模式,我想强调以下内容:

  • mvvm

  • MVI

我不想去解释每个人,因为在互联网上,您发现了太多有关此的信息。 ð

此外,您还可以看到guide to app architecture

Image by [developer.android.com](https://developer.android.com/static/topic/libraries/architecture/images/mad-arch-overview-ui.png)


依赖注射

Cover image for Dependency Injection

依赖注入是一种软件设计模式,它允许客户从外部来源获得其依赖项,而不是创建它们本身。这是一种实现对象及其依赖关系之间控制控制(IOC)的技术。

模块化

Cover image for Modularization

Modularization是一种软件设计技术,可让您将应用程序分为独立的模块,每个模块具有自己的功能和责任。

Image by [developer.android.com](https://developer.android.com/static/topic/modularization/images/1_sample_dep_graph.png)

模块化的好处

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

严格的可见性控制:模块使您能够轻松地控制对代码库其他部分的暴露。

可自定义的交付Play Feature Delivery使用应用程序包的高级功能,使您可以有条件地或按需提供应用程序的某些功能。

可伸缩性:通过具有独立的模块,可以添加或删除功能而不会影响应用程序的其他部分。

易于维护:通过将应用程序分为独立的模块,每个模块都具有自己的功能和责任,更容易理解和维护代码。

易于测试:通过具有独立的模块,可以隔离测试,从而易于检测和修复错误。

架构改进:模块化有助于改善应用程序的体系结构,允许更好的组织和结构。

改进协作:通过拥有独立的模块,开发人员可以同时处理应用程序的不同部分,而不会干扰。

构建时间:某些Gradle功能,例如增量构建,构建缓存或并行构建,可以利用模块化来提高构建性能。

official documentation中查看更多。


网络

Cover image for Network

序列化

Cover image for Serialization

在本节中,我想提及两个重要工具: moshi 与Raterofit和 kotlin Serialization conjunction广泛使用,这是Kotlin团队的押注喷气桥。

moshi kotlin序列化是Kotlin和Java的两个序列化/避难所库,可让您将对象转换为JSON或其他序列化格式,反之亦然。两者都提供了优化用于移动和桌面应用程序的用户友好界面。 Moshi主要关注JSON序列化,而Kotlin序列化支持包括JSON在内的各种序列化格式。


图像加载

Cover image for Image Loading

要从Internet加载图像,有几个第三方库可帮助您处理该过程。图像加载库为您带来了很多繁重的工作;他们处理两个缓存(因此您不会多次下载图像)和网络逻辑以下载图像并在屏幕上显示。
_ Official Android Documentation

反应性 /线程管理

Cover image for Reactivity / Thread Management

当我们谈论反应性编程和异步过程时,我们的第一个选择是Kotlin Coroutines。由于暂停功能和流动,我们可以满足所有这些需求。但是,我认为在本节中,即使在Android应用程序的开发中,也值得强调RXJAVA的重要性。对于那些已经与Android合作几年的人,我们知道RXJAVA是一种非常强大的工具,具有非常大的功能,用于使用数据流。我仍然认为rxjava是今天考虑的有趣替代方法。

本地商店

构建移动应用程序时的重要一点是能够在本地持续存在数据,例如某些会话数据或缓存数据等。根据应用程序的需求选择正确的存储选项很重要。我们可以存储非结构化数据,例如键值或结构化数据,例如数据库。请记住,这一点并未提及我们拥有的所有本地存储(例如文件存储),只有允许我们保存数据的工具。

Cover image for Local Store

建议

测试

Cover image for Testing

R8优化

r8是将您的项目Java字节码转换为在Android平台上运行的DEX格式的默认编译器。它是一种工具,可以通过缩短类及其属性的名称来帮助我们混淆和减少应用程序的代码,从而消除项目中未使用的代码和资源。要查看更多信息,请检查有关Shrink, obfuscate, and optimize your app的Android文档。

Image cover for R8 optimizations
androidtopics.dipien.com的图像

  • 代码收缩

  • 资源收缩

  • obfuscation

  • 优化


播放功能交付

Cover image for Play Feature Delivery

Google Play的应用服务模型,称为Dynamic Delivery,使用Android App Bundles为每个用户的设备配置生成并为优化的APK提供优化的APK,因此用户仅下载他们运行您的应用所需的代码和资源。
_ Android Documentation

Image by [miro.medium.com](https://miro.medium.com/max/1400/1*rD_O9Ru8WJJMm1TeIy-6lw.png)


自适应布局

Image by [android-developers.googleblog.com](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg5R2hd0VZp__xKUUgs6-tfKHEoabMPqo2aY6uoGvzre-9E4gUlz6RbGsrE-Txszbrc3OaNL9r2TshsZmzGhEiM3M-_eO8M39K6ljm9NrX2BMHRLHM3HeF04YgJf8l4Z1-kNaP9YV8BCRe3n2zTUTSx3FOvA5IRc4PCjVPiJ7CEw7M7Y7uAJLVd7WQ/s1600/Android-GoogleIO3thingstoknowaboutFormFactors_4209x1253.png)

随着使用具有不同形态的移动设备的使用增长,我们需要拥有使我们能够使用适合不同类型屏幕的Android应用程序的工具。这就是为什么Android为我们提供窗口尺寸类的原因,这是一个简单的方式,是三个大型屏幕格式,标志着我们开发设计的关键点。这样,我们避免考虑许多屏幕设计的复杂性,以将我们的可能性减少到3个组: compat 媒体扩展。 < < /p>

窗口尺寸类

Image by [developer.android.com](https://developer.android.com/static/images/guide/topics/large-screens/window_size_classes_width.png)

Image by [developer.android.com](https://developer.android.com/static/images/guide/topics/large-screens/window_size_classes_height.png)

Support different screen sizes

我们拥有的另一个重要资源是Canonical Layouts,它是预定义的屏幕设计,可用于我们的Android应用程序中的大多数方案,还向我们展示了有关如何使其适应大屏幕的指南。

Window Size Classes

其他相关资源

Form-Factor Training

Form Factors at Google I/O 2022(2)


表现

Image by [android-developers.googleblog.com](https://android-developers.googleblog.com/2021/09/app-performance-to-drive-app-excellence.html)

当我们为Android开发应用程序时,我们必须确保用户体验更好,不仅在应用程序的开头,而且在整个执行过程中。因此,重要的是要有允许我们进行预防性分析和对可能影响应用程序性能的案例进行不断监视的工具,因此这里有一系列工具列表,可以帮助您实现此目的:

应用程序内更新

当您的用户在设备上使您的应用程序保持最新时,他们可以尝试新功能,并从性能改进和错误修复中受益。尽管某些用户将其设备连接到无代数连接时启用背景更新,但可能需要提醒其他用户以安装更新。应用程序内更新是Google Play核心库功能,可提示活动用户更新您的应用。
应用程序内更新功能在运行Android 5.0(API级别21)或更高设备上支持。此外,仅支持Android移动设备,Android平板电脑和Chrome OS设备的应用内更新。
_ In-App Updates documentation

Image by [developer.android.com](https://developer.android.com/static/images/app-bundle/flexible_flow.png)


应用内评论

Google Play应用程序内评论API允许您提示用户提交Play商店评级和评论,而不会带来任何离开应用程序或游戏的不便。
通常,在应用程序的整个用户旅程中,可以随时触发应用内审核流程。在流程期间,用户可以使用1到5星系对应用程序进行评分并添加可选评论。提交后,审查将发送到Play商店并最终显示。
为了保护用户隐私并避免API滥用,您的应用程序应遵循when to request in-app reviewsdesign of the review prompt的严格指南。
_ In-App Reviews documentation

Cover image for In-App Review


可访问性

Image by [fscl01.fonpit.de](https://fscl01.fonpit.de/userfiles/7613938/image/AccessibilityAndroid-w1400h788.png)

可访问性是软件设计和构建的重要功能,它为具有可访问性的人提供了使用该应用程序的能力,此外还可以改善其用户体验。这个概念旨在改善的一些残疾是:有视力问题,色盲,听力问题,敏捷性问题和认知障碍等。

注意事项:

  • 增加文本可见性(颜色对比度,可解析的文本)

  • 使用大型,简单的控件

  • 描述每个UI元素

检查Accessibility — Android doc.


安全

Image by [android.com](https://lh3.googleusercontent.com/zSpjW3Lox9DytJ8nrmuWEZgsbmFlkBkemjZc_60vWk3QCN1jTkp5SQk78qfr7TTAM5BsG4HEvmWDnzA6xO6d4srbpTUKCD40eUlO=w1034-rw-e365-v1)

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

  • 加密敏感数据和文件:使用EncryptedSharedPreferencesEncryptedFile

  • 应用基于签名的权限:

  • 使用基于签名的权限当您控制的应用程序之间共享数据时。

    package =“ com.example.myapp”>
    Android:protectionLevel =“签名” /> < /p>

  • 请勿在项目存储库中的文件或类中直接放置应用程序配置所需的键,令牌或敏感数据。使用 local.properties


版本目录

Cover image for Version Catalogs

Gradle提供了一种标准方法,用于管理称为版本目录的项目依赖性;它是在7.0版中实验引入的,并在版本7.4中正式发布。

优势:

  • 对于每个目录,gradle生成 type-safe访问者,因此您可以轻松地在IDE中添加使用自动完成的依赖项。

  • 构建的所有项目都可以看到每个目录。这是声明依赖项版本并确保对该版本的更改适用于每个子项目的中心地点。

  • 目录可以声明dependency bundles,这是通常一起使用的依赖项组。

  • 目录可以将依赖关系的组和名称与其实际版本分开,并使用version references,从而可以在多个依赖关系之间共享版本声明。

see more


记录器

Cover image for Logger

记录器是一种软件工具,用于注册有关程序执行的信息;重要事件,错误消息和其他信息可能在诊断问题或了解程序的工作原理。可以将登录器配置为将消息(例如日志文件,数据库,或通过将消息发送到日志记录服务器发送)为不同的位置(例如日志文件)写入消息。

Cover image for Logger

林特

Image taken from [https://miro.medium.com/](https://miro.medium.com/max/1400/1*gdHPyd_S5UgCiFKnetAHvA.webp)

linter是一种编程工具,用于分析程序源代码以查找代码中的潜在问题或错误。这些问题可能是句法,不适当的代码样式,缺乏文档,安全问题等,它们可能会影响代码的质量和可维护性。

Cover image for Linter

如果您喜欢我的内容并想支持我的工作,可以给我一杯咖啡。


Buy me a coffee

跟我进去