写点什么

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

  • 2020-01-07
  • 本文字数:3129 字

    阅读完需:约 10 分钟

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

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


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



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

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 库有助于最大程度地减少应用中出现意外。



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


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

3. 模块化设计

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


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


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



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


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


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

4. App Bundle

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


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



缩减应用大小的示例(资料来源: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 商店评分(并且肯定会拖累评分!),因此应该设法将其保持在较低水平上。



测试金字塔(来源: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


2020-01-07 09:005448

评论

发布
暂无评论
发现更多内容

第十届能源系统、电气与电力国际学术会议 (ESEP 2025)

搞科研的小刘

能源

20年装备制造业MES实施经验分享

万界星空科技

制造业 mes 万界星空科技mes 软件实施 MES实施

音乐 NFT 系统开发流程

北京木奇移动技术有限公司

区块链开发 软件外包公司 音乐NFT

漏洞赏金实战:我是如何轻松获得2500美元奖金的

qife122

漏洞挖掘 逻辑漏洞

在AI技术快速实现创意的时代,挖掘数学学习新需求成为关键挑战

qife122

需求分析 数学资源

三小时会议,五分钟纪要:一个技术Leader的会议记录救赎之路

HuiZhuDev

效率工具 团队协作 技术管理 会议管理 AI指令

软件未来预测的准确性与代码简洁之道

qife122

软件设计 未来预测

大数据-149 Apache Druid 实时 OLAP 架构与选型要点

武子康

Java 大数据 分布式 Druid Apache Druid

音乐 NFT 平台的运营

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

LED广告牌安装服务,让生意“亮”起来!

Dylan

广告 LED LED display LED显示屏 LED屏幕

使用 Java、Spring Boot 和 Spring AI 开发符合 A2A 标准的 AI 智能体

码界行者

AI Agent Spring AI

「腾讯云NoSQL」技术之Redis篇:精准围剿rehash时延毛刺实践方案揭秘

腾讯云数据库

数据库 nosql redis 腾讯云数据库 腾讯云NoSQL

全球化部署的几种架构设计方案【原创】

车江毅

技术架构 运维架构 全球化部署 出海技术战略规划

下一代金融安全关键技术:融合开源数据与网络数据的智能处理能力

IAN李车

金融科技 信息安全 数据合规 金融安全 金融合规

微服务已死?别再盲目跟风微服务!这3种情况下单体架构更适合你。

六边形架构

微服务 系统架构 架构设计 架构师 单体架构

久其接口新特性——解决报表连续性、数据项连续性

inBuilder低代码平台

GS Cloud 久其接口 结构化匹配 多版本报表 参数迁移

工业管理 项目管理经验总结(29)

万里无云万里天

项目管理 工业 工厂运维

日志易产品VP饶琛琳:日志不会说谎,但Trace可能会

日志易

日志分析 日志易 trace断链

如何用复用省下数十亿研发成本?IPD的CBB重用开发策略

IPD产品研发管理

产品 管理 IPD 研发团队

进入职场第三课——立足

老李说技术

职场 职场发展 职场妙招

第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025)

搞科研的小刘

智能控制

2025年医学图像处理与识别国际会议(IPOR 2025)

搞科研的小刘

图像处理

Agentic AI基础设施实践经验系列(六):Agent质量评估

亚马逊云科技 (Amazon Web Services)

人工智能

阿里巴巴 AI Coding 分享会 —— Qoder Together 广州站来啦!

阿里巴巴云原生

阿里云 AI 云原生 Qoder

不止是监控:5个专注于出海舆情监测分析与报告的网站

沃观Wovision

出海企业 海外舆情监测 舆情监测网站 出海舆情

时序数据库 IoTDB 集成 MyBatisPlus,告别复杂编码,简化时序数据 ORM 开发

Apache IoTDB

第六届机械工程、智能制造与自动化技术国际学术会议 (MEMAT 2025)

搞科研的小刘

工程机械

[大厂实践] 少即是多:Zendesk 长时间作业执行优化

俞凡

架构

低空经济从“蓝图”迈向“实景”,技术与应用协同成为产业焦点

科技经济

得物TiDB升级实践

得物技术

数据库 TiDB 数据库性能优化

开源能源管理系统:赋能可持续能源转型的 “透明化引擎”

开源能源管理系统

开源 能源管理系统

2020年需要关注的5大Android开发技术_大前端_Jake Lee_InfoQ精选文章