百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Jetpack来了:走近Google标准应用架构

ccwgpt 2024-10-10 04:45 23 浏览 0 评论

开发应用程序就像搭积木。没有良好架构的应用程序,就像没有搭好底座的积木,随着项目复杂度的上升,维护起来会困难重重,工程师会不停地陷入技术债务之中——“积木的倒塌”只是时间问题。

如何把握模块的粒度,在保持模块独立性的同时,又不影响模块间的通信,是全世界优秀的Android工程师共同追求的目标。为了解决这一问题,各类架构模式层出不穷,比较著名的有MVC、MVP和MVVM。Jetpack正是在这一背景下诞生的。它由Google官方推出,用于方便工程师搭建符合MVVM规范的Android应用程序。

本文选自《Android Jetpack应用指南》一书,让我们跟随下文一同走近Google标准应用架构。

01 ▊ Android应用程序架构设计标准的缺失

一个Android应用程序通常至少有一个Activity,当我们要开发一个小型Android应用程序时,通常会将大部分的代码写在Activity/Fragment中。这些代码包括业务逻辑、数据Model、UI控件等。当涉及网络数据获取或数据库CRUD(Create、Retrieve、Update、Delete,即增加、查询、更新、删除)操作时,还需要用到工作线程,进而,我们还不得不考虑Activity/Fragment的生命周期问题。

针对一个小型项目,将大部分代码写在Activity/Fragment中并没有什么问题,但对于中大型项目而言,随着时间的推移和业务复杂度的增加,Activity/Fragment中的代码会变得复杂且难以维护。因此,我们需要将代码按照功能或类型的不同进行分类,并放到不同的包或类文件中,但又不破坏彼此正常的功能和通信。

这在软件开发中叫作“解耦”。为了将代码解耦以应对日益膨胀的代码量,工程师在应用程序中引入了“架构”的概念。使之在不影响应用程序各模块组件间通信的同时,还能够保持模块的相对独立。这样不仅有利于后期维护,也有利于代码测试。

关于架构,相信大家或多或少都听说过MVC (Model View Controller)、MVP (Model View Presenter)和MVVM (Model View ViewModel)。

在Android应用程序开发中,一直以来都有用到MVC,将 Activity/Fragment 与布局文件分开就是一种最简单、最基本的MVC思想,只是它没有很好地解决我们的问题,所以才有了MVP和MVVM。

由于Google官方并没有推出关于Android应用程序架构设计的标准,因此,世界各地的工程师只能自己创造各种解决方案,但这些方案都面临着以下问题。

  • 非Google官方解决方案:

由于不是Google官方解决方案,所以工程师不敢轻易在自己的线上项目中使用这些方案,除了害怕引入未知问题,更重要的是担心这些解决方案后期是否有开发者持续跟进维护。

  • 无法辨别最佳解决方案:

Android的应用架构始终处于一个混乱的阶段,Android工程师很困惑,他们不确定自己使用的架构是否真的是最佳方案。这不仅增加了工程师的学习成本,还可能最终导致他们开发出的应用程序质量参差不齐。

Android工程师希望Google官方可以推出并维护一些关于架构的组件或指南,这样他们就可以将更多的精力放在自己的业务代码上了。Google也意识到了这个问题,这便有了Jetpack,Jetpack正是为了解决这些问题而诞生的。


02 ▊ 什么是Jetpack

前面提到,Jetpack是Google为了解决Android架构问题而引入的,但实际上Jetpack能做的不止这些。

按照Google官方的说法:

Jetpack是一套库、工具和指南,可以帮助开发者更轻松地编写应用程序。Jetpack中的组件可以帮助开发者遵循最佳做法、摆脱编写样板代码的工作并简化复杂的任务,以便他们能将精力集中放在业务所需的代码上。

Jetpack主要包括4个方面,如下图所示,分别是架构(Architecture)、界面(UI)、行为(Behavior)和基础(Foundation)。


03 ▊ Jetpack 与 AndroidX

在2018年的Google I/O大会上,Google宣布用AndroidX代替Android SupportLibrary,AndroidSupport Library在版本28之后就不再更新了,未来的更新会在AndroidX中进行。不仅如此,AAC(Android Architecture Component)中的组件也被并入AndroidX。所以,当使用Jetpack的组件时,经常会看到以“androidx”开头的包名。

下图从包名的变化,我们便可以看出,AndroidSupport Library与AAC中的各种组件已经迁移到了AndroidX中。

为什么Jetpack组件需要以兼容包的形式存在,而不是成为Framework的一部分呢?

很简单,这是为了提供向后兼容,使Jetpack组件能够应对更加频繁的更新。除了Android Support Library和AAC,其他一些需要频繁更新和迭代的特性也被并入了AndroidX,例如Emoji。


04 ▊ 迁移至AndroidX

如果你从未在项目中使用过Jetpack组件,现在你希望将项目迁移至AndroidX,那么可以在菜单栏中选择 Refactor → Migrate to AndroidX... 选项,将你的项目迁移至AndroidX。

此时,会出现一个对话框,询问迁移之前是否需要以Zip文件的形式备份项目,如下图所示。这里建议备份一份,以防迁移出错。


05 ▊ 新建项目默认支持AndroidX

如果你的Android Studio为最新版本,那么在新建一个项目时,应该能在创建过程中看到“Useandroidx.* artifacts”这个选项。这表示,新创建的项目会默认配置对AndroidX的支持,如下图所示。

如果没有看见此选项,那么请检查你的SDK配置。通过 Tools → SDK Manager 打开配置界面,确保你已经安装了Android 9.0及以上版本的SDK。

本文选自博文视点新书《Android Jetpack应用指南》。


《Android Jetpack应用指南》

叶坤著

  • Android开发者必学
  • 国内外第一本系统介绍Jetpack的图书

本书讲解的是Android Jetpack最核心的内容——架构。对Jetpack中的每个组件都进行深入浅出地介绍。学习组件如何使用的同时,也对其源码进行简要分析。每个组件都通过实例进行演示,最大程度地减少读者的学习成本。


▊ 作者简介

叶坤

毕业于闽南师范大学计算机系。曾先后就职于网龙、搜狐畅游17173、豆瓣。在豆瓣任职期间,负责豆瓣FM Android客户端的研发工作。现为美餐网资深Android工程师,负责美餐行星项目Android客户端的研发工作。他在大学期间便开始自学Android研发技术,从事Android研发已有10年,在该领域有较为丰富的经验,曾译《Android高性能编程》一书。除了码字,他还十分喜爱阿根廷探戈。

相关推荐

netty系列之:使用Jboss Marshalling来序列化java对象

简介在JAVA程序中经常会用到序列化的场景,除了JDK自身提供的Serializable之外,还有一些第三方的产品可以实现对JAVA对象的序列化。其中比较有名的就是Googleprotobuf。当然...

6款可替代dreamweaver的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

Java—类加载的基本机制和过程

类加载的基本机制和过程运行Java程序,就是执行java这个命令,指定包含main方法的完整类名,以及一个classpath,即类路径。类路径可以有多个,对于直接的class文件,路径是class文件...

什么是双亲委派机制?(转载)

原文章地址:https://www.cnblogs.com/hollischuang/p/14260801.html什么是双亲委派机制首先,我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而...

[架构师必看]我在系统设计上犯过的14个错

在上篇《架构师画像》的文章中提到了自己在系统设计上犯过的一些错,觉得还挺有意义的,这篇文章就来回顾下自己近八年来所做的一些系统设计,看看犯的一些比较大的血淋淋的错误(很多都是推倒重来),这八年来主要做...

ONOS架构之子系统介绍

前言:为了方便灵活性,ONOS采取的是一种模块化结构,一方面能灵活地组织各种模块,容易让开发者扩展出新的模块,同时通过隔离令系统的模块各司其职而不会互相干扰。实际上ONOS是由多个子系统组成,本文将对...

基于微信小程序的在线课堂系统设计与实现-计算机毕业设计源码

摘要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,在线课堂微信小程序被用户普遍使用,为方便用户能够...

微信小程序云开发教室预约系统的前后端交互与数据库设计

需求描述:需要申请使用教室时,可点击教室申请查看教室的使用状况及相关设备。确定好需要的教室后,按学期、校区、教学楼、周次、星期、节次、等维度筛选,并备注用途。例如:当我点击该教室申请占用后,该教室状态...

微信小程序开发准备材料以及方式

这里讲述小程序注册类型为企业类型时所需要的资料,首先需要一个新的邮箱号,作为登陆账号,需要管理员或者法人的身份信息、已绑定银行卡的微信号、手机号、营业执照、开户银行信息,或者一些特殊行业所需要的办理的...

webman 事务回滚失效问题记录

大家好,我是yangyang.最近有用到webman这个框架写业务,写代码的过程中,遇到了一个奇葩的问题:基于webman下使用laravel的orm组件事务回滚不生效简单介绍下webmanwebma...

PHP实时通信:Workerman篇

一般做Web开发,用的是HTTP协议进行通信,是一个简单的请求-响应协议。做PHP开发的都很清楚这一点。只能由浏览器发起请求,服务器响应内容。服务器不能主动向浏览器推送消息。多个浏览器之间也不能互相发...

PHP培训课程内容都有哪些?PHP培训哪些内容?

作为一门经久不衰的开发语言,php开发工程师一直是很多年轻人选择学习和就业的职业方向,那么PHP培训课程主要学习哪些内容呢?一、企业级开发专题:深入剖析企业实际开发过程,教授最实用的企业级技术PHP7...

go 和 php 性能如何进行对比?

PHP性能很差吗?每次讲到PHP和其他语言间的性能对比,似乎都会发现这样一个声音:单纯的性能对比没有意义,主要瓶颈首先是数据库,其次是业务代码等等。好像PHP的性能真的不能单独拿出来讨论似的。但其实一...

突然发现php工作变少了

突然发现php工作变少了。好像不大行了,被go取代了魔法涂鸦python和php对比如下:1.python依赖管理需然简单,但依赖本身做的比较宽松,一但版本更新,或修改,就有一堆问题;2.传统py...

php高并发的瓶颈到底在哪

php高并发的瓶颈到底在哪?是同步阻塞?还是nginx+fpm不断创建-销毁进程资源过度消耗?高并发到底是什么问题,是语言问题嘛,为什么说php不适合高并发?求大佬指点从2009年后一直用lnmp,从...

取消回复欢迎 发表评论: