我正在参加「启航计划」
2023年的现代安卓开发
大家好, 我想和大家分享一下怎么用2023年的最新趋势构建Android运用.
免责声明
这是一篇来自我的观念和专业经历的文章, 考虑到了安卓开发者社区的不同意见, 也不断回顾了谷歌为安卓供给的攻略.
我有必要明确指出, 有一些十分风趣的东西, 形式和架构, 我或许没有说到, 但这并不意味着它们不能成为开发Android运用程序的其他风趣的挑选.
什么是Android?
Android是一个根据Linux内核的开源操作体系, 由谷歌开发.它被广泛用于各种设备, 包含智能手机, 平板电脑, 电视和智能手表.
现在, 安卓是世界上移动设备运用最多的操作体系;依据statcounter的报告, 以过去12个月为样本, 安卓的市场份额为71.96%.
接下来, 我将说到一个东西, 库, 架构, 攻略和其他实用东西的清单, 我以为这些东西对在Android上构建现代运用程序十分重要.
Kotlin ❤️
Kotlin是由JetBrains开发的一种编程语言.由谷歌引荐, 谷歌在2017年5月正式宣告了它(见这儿的出版物).它是一种现代编程语言, 具有与Java的兼容性, 能够在JVM上运转, 这使得它在Android运用开发中的选用速度十分快.
不管你是否是安卓新手, 你都应该考虑将Kotlin作为你的首选, 不要逆水行舟 , 谷歌在2019年谷歌I/O大会上宣告了这一做法.运用Kotlin, 你将能够运用现代语言的一切功用, 包含Coroutines的强大实力和运用为Android生态体系开发的现代库.
官方kotlin文档在这儿
Jetpack Compose
Jetpack Compose是Android引荐的用于构建本地UI的现代东西包.它简化并加速了Android上的UI开发.
- Jetpack Compose文档
Jetpack Compose是Android Jetpack库的一部分, 运用Kotlin编程语言来轻松创立本地用户界面.一起, 它还与其他Android Jetpack库(如LiveData和ViewModel)集成, 使其更简单建立反响性和可维护的Android运用程序.
Jetpack Compose的一些首要特色包含:
- 声明式UI.
- 可定制的小东西.
- 易于与现有代码集成.
- 实时预览.
- 改进功用.
资源:
- 官方文档.
- Compose到Kotlin的兼容性图谱
- Jetpack Compose路线图
- 课程.
Jetpack Compose文档
Android Jetpack
Jetpack是一套库, 协助开发人员遵从最佳实践, 削减模板代码, 并编写在不同的Android版别和设备上一致运转的代码, 以便开发人员能够专注于他们关心的代码.
- Android Jetpack文档
它的一些最常用的东西是:
- ViewModel
- Room
- DataStore
- WorkManager
- Navigation
- CameraX
- Compose
Material Design
Material Design是一个由指导方针, 组件和东西组成的习惯性体系, 支撑用户界面规划的最佳实践.在开源代码的支撑下, Material Design简化了规划师和开发人员之间的合作, 并协助团队快速建立漂亮的产品.
-Material Design网站
Material Design得到了来自谷歌的规划师和开发人员的支撑, 它将使咱们有一个攻略来为咱们的Android, Flutter和Web的UI/UX作业.
现在, Material Design的终究一个版别是3, 你能够看到更多这儿.
Clean Architecture
Clean Architecture的概念是由Robert C. Martin提出的.它的根底是经过将软件划分为不同的层来别离职责.
特色:
- 独立于结构.
- 可测验.
- 独立于用户界面.
- 独立于数据库.
- 独立于任何外部代理.
依靠性规矩
博文Clean Architecture对依靠性规矩做了很好的描述.
使得这个架构发挥作用的首要规矩是依靠性规矩.这个规矩说, 源代码的依靠联系只能指向内部.内圈的任何东西都不能知道外圈的任何东西.特别是, 外圈中声明的东西的姓名不能被内圈中的代码所提及.这包含, 函数, 类, 变量或任何其他命名的软件实体.
博文Clean Architecture
安卓体系中的Clean Architecture
- 表示层: Activities, Fragments, ViewModels, 其他视图组件.
- 范畴层: 用例, 实体, 仓库, 其他的域组件.
- 数据层: 存储库的完成, 映射器, DTO等.
Presentation层的架构形式
架构形式是一种更高层次的策略, 旨在协助规划一个软件架构, 其特色是在一个可重复运用的结构内为常见的架构问题供给处理方案.架构形式类似于规划形式, 但它们的规模更大, 处理的是更多的全局性问题, 如体系的全体结构, 组件之间的联系以及数据的办理方法.
在Presentation层中, 咱们有一些架构形式, 其中我想着重以下几点:
- MVVM
- MVI
我不想逐一解说, 由于在互联网上你能够找到太多的相关信息.
此外, 你还能够看看运用架构攻略
依靠注入
依靠注入是一种软件规划形式, 它答应客户端从外部来源获得其依靠, 而不是自己创立.它是一种在目标和其依靠联系之间完成回转控制(IoC)的技术.
- Hilt❤️
- Dagger
- Koin
模块化
模块化是一种软件规划技术, 它答应你将一个运用程序划分为独立的模块, 每个模块都有自己的功用和职责.
模块化的好处
可重复运用: 经过具有独立的模块, 它们能够在运用程序的不同部分甚至在其他运用程序中重复运用.
严厉的可见性控制: 模块使你能够轻松地控制你向你的代码库的其他部分露出的内容.
可定制的交付: Google Play的特性交付运用运用程序捆绑的高档功用, 答应你有条件地或按需交付你的运用程序的某些功用.
可扩展性: 经过独立的模块, 功用能够被添加或删去而不影响运用程序的其他部分.
易于维护: 经过将运用程序分为独立的模块, 每个模块都有自己的功用和职责, 更简单了解和维护代码.
易于测验: 经过具有独立的模块, 它们能够被隔离测验, 这使得检测和修复过错变得简单.
架构的改进: 模块化有助于改进运用程序的架构, 使代码有更好的组织和结构.
改进协作: 经过独立的模块, 开发人员能够一起作业在运用程序的不同部分, 不受搅扰.
构建时间: 一些Gradle功用, 如增量构建, 构建缓存或并行构建, 能够运用模块化来提高构建功用.
更多内容请见官方文档.
网络
- OkHttp
- Retrofit
序列化
在本节中, 我想提及我以为的两个重要东西: Moshi与Retrofit一起广泛运用, 以及Kotlin Serialization, 这是Jetbrain的Kotlin团队的赌注.
- Moshi
- Kotlin Serialization
Moshi和Kotlin Serialization是Kotlin和Java的两个序列化/反序列化库, 答应你将目标转换成JSON或其他序列化格局, 反之亦然.两者都供给了一个用户友爱的界面, 为在移动和桌面运用程序中运用而优化.Moshi首要专注于JSON序列化, 而Kotlin Serialization则支撑各种序列化格局, 包含JSON.
图像加载
要从互联网上加载图片, 有几个第三方库能够协助你处理这个进程.图片加载库为你做了许多深重的作业;它们既能处理缓存(这样你就不会多次下载图片), 也能处理网络逻辑以下载图片并在屏幕上显现.
- Android官方文档
- Coil
- Glide
Reactivity / Thread Management反响性/线程办理
当咱们议论反响式编程和异步进程时, 咱们的榜首挑选是Kotlin Coroutines
;由于suspend函数
和Flow
, 咱们能够满足一切这些需求.然而, 我以为在这一节中值得着重的是RxJava
的重要性, 即便在Android运用程序的开发中.关于咱们这些已经在Android上作业了几年的人来说, 咱们知道RxJava是一个十分强大的东西, 它有十分多的功用来处理数据流.今天我仍然以为RxJava是一个值得考虑的替代方案.
- Kotlin协程: [suspend函数/Flow Api] (很高兴有❤️)
- RxJava
本地存储
在构建移动运用程序时, 很重要的一点是要有在本地耐久化数据的才能, 比方一些会话数据或缓存数据等等.依据你的运用程序的需求, 挑选适宜的存储方法是很重要的.咱们能够存储非结构化的数据, 如键值或结构化的数据, 如数据库.请记住, 这一点并没有说到咱们可用的一切本地存储类型(如文件存储), 仅仅说到了答应咱们保存数据的东西.
主张:
- SharedPreferences
- DataStore
- EncryptedSharedPreferences
测验
- JUnit 5
- Mockk
- Espresso
- Robolectric
R8优化
R8是默许的编译器, 它将你项意图Java字节码转换为在Android平台上运转的DEX格局.它是一个协助咱们混淆和削减运用程序代码的东西, 经过缩短类和其属性的称号, 消除项目内未运用的代码和资源.想了解更多, 请检查Android文档中关于减缩, 混淆和优化你的运用程序.
- 代码减缩
- 资源减缩
- 混淆
- 优化
Play特性交付
Google Play的运用服务形式, 称为动态交付, 运用Android App Bundles为每个用户的设备装备生成和供给优化的APK, 因而用户只下载运转你的运用所需的代码和资源.
Android文档
自习惯布局
随着具有不同外形尺度的移动设备运用的增加, 咱们需求有一些东西, 使咱们的Android运用程序能够习惯不同类型的屏幕.这便是为什么Android为咱们供给了Window Size类, 简单地说, 它是三个大的屏幕格局组, 为咱们开发规划标记了要害点.这样咱们就防止了考虑许多屏幕规划的复杂性, 将咱们的或许性削减到三组, 即: Compat, Medium 和 Expanded..
Windows Size类
支撑不同的屏幕尺度
咱们具有的另一个重要资源是经典布局, 这是预定义的屏幕规划, 能够用于咱们的安卓运用中的大多数场景, 还向咱们展示了怎么将其习惯大屏幕的攻略.
其他相关资源
- 关于2022年Google I/O上的Form Factor的3件事
- 播放列表: Google I/O上的Form Factor
Form-Factor培训
Google I/O 2022上的Form Factors
功用
当咱们为Android开发运用程序时, 咱们有必要确保用户体验更好, 不仅是在运用程序的开始, 并且在整个执行进程中.出于这个原因, 重要的是要有一些东西, 使咱们能够对或许影响运用程序功用的情况进行预防性剖析和继续监测, 因而, 这儿有一个东西清单, 能够协助你达到这个意图:
- 基准
- 基线装备文件
- 运用程序启动
- Firebase功用监控
- JankStats库
运用内更新
当你的用户在他们的设备上坚持你的运用程序的更新时, 他们能够尝试新的功用, 以及从功用改进和过错修复中获益.虽然有些用户在他们的设备连接到无计量的连接时启用后台更新, 但其他用户或许需求被提示安装更新.运用内更新是Google Play核心库的一项功用, 提示活泼用户更新你的运用.
运用内更新功用在运转Android 5.0(API等级21)或更高的设备上得到支撑.此外, 运用内更新仅支撑Android移动设备, Android平板电脑和Chrome OS设备.
- 运用内更新文档
运用内谈论
Google Play运用内谈论API让你能够提示用户提交Play Store的评分和谈论, 而不需求脱离你的运用或游戏, 这很方便.
一般来说, 运用内谈论流程能够在你的运用的整个用户旅程中的任何时候被触发.在流程中, 用户能够运用1至5星体系对你的运用程序进行评分, 并添加一个可选的谈论.一旦提交, 谈论将被发送到Play Store并终究显现出来.
为了维护用户隐私和防止API被滥用, 您的运用程序应遵从关于何时请求运用内谈论和谈论提示的规划的严厉准则.
-运用内谈论文档
辅助功用
辅助功用是软件规划和建造的一个重要特征, 除了改进他们的用户体验外, 还为有可访问性需求的人供给了运用运用程序的才能.这个概念旨在改进的一些残疾是:有视力问题的人, 色盲, 听力问题, 灵巧问题和认知障碍等等.
考虑的要素:
- 增加文本的可见性(色彩对比, 可调整文本).
- 运用大型, 简单的控件
- 描述每个用户界面元素
检查辅助功用–Android文档
安全性
安全性是咱们在开发维护设备的完整性, 数据的安全性和用户的信任的运用程序时有必要考虑的一个方面, 甚至是最重要的方面, 这便是为什么我在下面列出了一系列的提示, 将协助你完成这一意图.
- 加密敏感数据和文件: 运用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替代.
版别目录
Gradle供给了一种会集办理项目依靠联系的标准方法, 称为版别目录;它在7.0版别中试验性地引入, 并在7.4版别中正式发布.
长处是:
- 关于每个目录, Gradle都会生成类型安全的访问器, 这样你就能够在IDE顶用自动完成的方法轻松添加依靠联系.
- 每个目录对一个构建的一切项目都是可见的.它是一个会集的地方, 能够声明一个依靠的版别, 并确保对该版别的改动适用于每个子项目.
- 目录能够声明依靠包, 这是一般一起运用的”依靠包组”.
- 目录能够将依靠的组和称号与它的实际版别分隔, 并运用版别参考来替代, 这样就能够在多个依靠之间同享一个版别声明.
更多请检查
Logger
Logger是一种软件东西, 用于登记有关程序执行的信息;重要事件, 过错调试信息和其他或许对诊断问题或了解程序怎么作业有用的信息.记录器能够被装备为将信息写入不同的方位, 如日志文件, 控制台, 数据库, 或经过将信息发送到日志服务器.
- Timber
Linter
Linter是一种编程东西, 用于剖析程序源代码, 以发现代码中的潜在问题或漏洞.这些问题或许是语法问题, 不恰当的代码风格, 缺乏文档, 安全问题等等, 它们会对代码的质量和可维护性产生影响.
- Android Lint
- Detekt
- Ktlint