Categories
程式開發

2020年需要关注的5大Android开发技术


虽然编程环境每天都有新变化,但Android无疑是其中更新迭代最频繁的,每年甚至每个月都有新东西。本文介绍了2020年开发者最需要关注的5大Android开发技术。

在众多Android开发团队参加的Droidcon London 2019大会上,一系列新技术令人眼花缭乱。从Joe Birch介绍的无障碍智能吉他到即将到来的Jetpack Compose库,创新内容实在太多了,主流社区需要找到几项核心技术才不至于迷失方向。

2020年需要关注的5大Android开发技术 1

这篇文章就带着大家一起看看需要重点关注的一些核心技术,同时本文会解释为什么应该优先实现这些技术,以及实现的一些初始途径。需要特别强调一下,实现这些技术虽然不会让你的终端用户发出惊叹,但它们能帮助开发者打造震撼人心的特性,并为开发人员带来更赏心悦目的代码库!

1. Kotlin

Kotlin通常被视为下一个Java,它是由谷歌和JetBrains(Android Studio开发者)赞助的。Java从一开始就一直是Android应用的首选开发语言,但近年来Kotlin迅速普及,如今在10,000种Google Play应用中有近60%使用了Kotlin。虽说在少数需要访问底层原生代码的情况下,仍会继续使用C++;但在其他情况下,Kotlin都可以代替Java。

Kotlin的主要优势是与Java的完全互操作性,这意味着开发人员可以尽可能迁移旧代码,而不用完全重写整个应用程序。这两种语言兼容得很好,Android Studio甚至可以自动从Java转换为Kotlin。

这种兼容性,加上更简洁的语法和数百项细小改进,使Kotlin在StackOverflow的2019年开发人员调查中成为第四大“最受欢迎”和第五大“想要”的编程语言,在所有移动编程语言中排名最高。

迁移现有应用有一个好方法,就是在修改现有Java文件时将其转换为Kotlin。虽然这意味着你要把经常编辑的文件转换过去,会增加代码审查的复杂度(比如会面临潜在的冲突),但由于转换后的区域能得到审查,因此可以确保任何问题都能被发现。

目前Candyspace中使用的Kotlin代码占86%(并且一直在增长),其余的14%是实用工具/转换代码,这些代码已经有些年头没改动过了。

2. Jetpack

谷歌的AndroidX/Jetpack库是一组实用工具,旨在简化常见的应用需求。例如用于设备上数据库的Room,或用来在底层数据更改时更新显示内容的LiveData

有了Jetpack库,新项目就省掉了重新发明轮子的麻烦,也不必等待其他开发人员来开源他们的实现方式,现在每位开发者都能获取到那些基础要素了。这些库更新非常频繁,新功能不断推出,错误修复也会及时发布。由于这些库是为了协同工作而构建的,因此多使用AndroidX库有助于最大程度地减少应用中出现意外。

2020年需要关注的5大Android开发技术 2

从开发工作起步开始就使用Jetpack库可以节省数百小时的时间,但我们也可以将已有的应用迁移到Jetpack库上面。虽然看起来很麻烦,但由于这些库非常流行,针对迁移工作的指南也很容易找到。至少,底层Android元素(视图、片段等)可以自动转换

在Candyspace,我们使用了Data Binding和ViewModel,并可能很快加入Room和Navigation。

3. 模块化设计

一直以来,应用都被构建为一个巨大的“应用”模块,其中包含整个应用所需的一切。尽管这样做确实能让资源共享起来更容易,但也意味着这个应用的某些部分无法为其他应用/开源项目所重用;更重要的是,对应用做出更改时必须重新编译整个代码库。

相反,如果应用由许多较小的模块组成,则只需重新编译做出更改的代码即可,从而大大缩短了构建时间。此外,模块化设计还为高级Android特性(例如即时应用——用户无需安装任何内容即可使用你的应用的部分功能,和动态特性——按需安装应用的各个部分)的应用打开了大门。

将一款现有应用拆分为多个模块可能会是一个很复杂的工作,因为会因此而发现之前隐藏的问题(“DateUtility是什么东西?为什么每个类都需要它!?”);但是一旦改造完成,代码库就会进入一种更加健康的状态。另外,如果一款新的应用需要类似的功能,则可以快速重用已有模块,从而大大节省时间!

2020年需要关注的5大Android开发技术 3

模块化应用架构的一个示例(来源:本文作者创建!)

虽然设计一个模块化架构可能是很复杂的任务,但我之前已经写过一些指导性原则,这些原则受到了Nikits Kozlov关于模块化和构建时间的文章的启发。Plaid也写了一篇介绍他们向模块化设计迁移经验的文章

在Candyspace,我们的应用设计都是完全模块化的,以尽量减少构建时间对开发工作的中断影响。

4. App Bundle

使用传统的APK将应用分发到用户的设备时,必须安装针对所有设备准备的所有资源。这意味着每张位图图像可能会有5个副本(用于不同的屏幕精度),还要安装针对不同设备架构的多个库版本,甚至还得安装多组边距和填充值。

使用App Bundle分发一款应用时,用户下载的APK只包含他们实际所需要的资源。这样一来,平均的应用大小就会减少20%,而未经优化的应用改换格式后应用大小将会得到更显著的缩减。

2020年需要关注的5大Android开发技术 4

缩减应用大小的示例(资料来源:https://events.google.com/io2018/)

App Bundles是18个月前刚刚诞生的,但已经有超过25%的应用安装时使用了这种格式!这是谷歌推荐使用的格式,并且大多数应用几乎无需改动就能使用这种格式,只需在Play商店上处理一下App Bundle的签名即可。

在Candyspace,我们正在迁移到App Bundles上,同时尽量避免破坏我们现有的工作流程(Slack、QAing构建、非Google Play安装)。Alistair Sykes的文章是一份很棒的迁移参考资料,文章考虑到了CI服务器、Slack和Google Play内部应用共享等事项。

5. 测试

是的,测试。当然,测试并不是什么闪亮的新特性,也不是用户能看到的内容,但想要确保一款已有一定用户基础的应用的可靠性,就必须要彻底测试你的应用程序才行。由于崩溃率会直接影响你的Play商店评分(并且肯定会拖累评分!),因此应该设法将其保持在较低水平上。

2020年需要关注的5大Android开发技术 5

测试金字塔(来源:developer.android.com)

Android的三种最常见的测试类型分别是(降序排列):

  • 单元测试,例如:我的平方根函数会返回平方根吗?

这些测试将构成你测试流程的大部分内容,它们用来确保特定的代码段(例如一个函数)能按预期正常运行。当你对一个部件建立起信心后,就可以将其用于…

  • 集成测试。例如:我的数学模块可以与位置模块协同工作吗?

这些测试可确保你的各个代码区域(模块或层)可以正常协同工作。知道应用的组件可以正确相互通信后,你就可以添加…

  • 自动化的UI测试,例如:用户可以在应用上标记一个位置吗?

在设备或仿真器上只会运行这些测试,它们能确保应用按预期提供完整的用户体验。这些测试通常比其他类型的测试要慢得多(并且运行起来更加不便)。

谷歌建议将测试的分布定为70%的单元测试、20%的集成测试和10%的大型测试,占比较小的部分需要更长的执行时间、维护时间和实施时间。

最好的测试资源是官方文档,因为它提供了所有测试类型的介绍,以及如何将其实现到项目中的教程。

在Candyspace,我们将重点放在单元测试上,其占比要比谷歌建议的比例更大,以确保所有新类的行为都是可预测的。我们目前还在改进自动UI测试,以减少对手动测试的依赖。

在编程的任何领域,关于解决问题的最佳方法都会有一百种不同的意见;但Android有绝对优势:Android拥有一个庞大的开发者社区,这意味着一个十分优秀的新技术会迅速在开发者中普及。当你在互联网上向陌生人寻求帮助时,如果你找的是“Jetpack LiveData”而不是“之前的开发人员从Web开发者朋友那里复制并转换的库”,成功获得答案的可能性就会大得多!

维持一个健康的代码库的关键,就是能够适应这些不断变化的标准并重构现有项目。为了了解最新的Android开发实践和最佳做法,我推荐大家关注Android开发者博客/r/AndroidDev subredditFragmented播客

原文链接:

https://blog.candyspace.com/5-essential-android-techniques-for-2020