一次组件化与Android Jetpack的实践

news2024/11/16 18:54:52

前言

至今为止从事Android开发两年多了,17年开始实习时,恰逢APP刚刚立项不久,当时新项目沿用了旧项目古老的MVC架构。从那之后一直都是根据飘忽不定的需求,没有规则的垒代码。

直到18年中,其他项目组开发的APP要求集成到了我们项目组的APP中,从这时开始项目的代码、APP的功能,爆炸性增多,代码本身也开始变得极难维护,调试旧代码经常找不到位置,需要全局搜索有时还要连蒙带猜,也就是从那时起,我开始意识到一个好架构以及规范的重要性!

目录

  • 项目简介
  • APP概览
  • 项目结构
  • 组件复用
  • 后续展望
  • 总结
  • 参考资料

正文

一、项目简介

本次实践的内容是基于Android JetPack组件实现MVVM架构,并结合当下较为流行的组件化开发方式,编写的一个菜谱类型的小型应用。组件化的过程中结合了我把公司的APP组件化后,得到一些经验和教训,做了一些优化和调整

需要强调的是,实际使用了Data Binding后,不仅调试bug时想砸电脑,后来在读过nanchen大佬的文章《不一样的角度谈 DataBinding的坑》后决定,在本次实践暂不采用Data Binding,后续会单独开设分支来实现DataBinding。

项目当前的MVVM架构设计的可能并不理想,而且界面优化还存在一定的问题,不过没关系,后续会以该项目为案例,系统性的实践Android中常见的启动优化、内存优化以及布局优化等等,实践过程也会完整的整理成文章记录下来,方便日后学习、讨论,如果感兴趣话记得关注哦。

数据来源:聚合数据-菜谱大全、Easy-Mock

后台服务器:Bmob(使用了bmob用户管理的部分api,其他数据主要使用easy-mock产生模拟数据)

开发语言:Kotlin(部分使用了Java)

主要使用的Jetpack组件
LiveData-Android Architecture Components探索(1)-LiveData
ViewModel-​​​​​​​Android Architecture Components探索(2)-ViewModel
Navigation-​​​​​​​Android Architecture Components探索(3)-Navigation
Room、Lifecycle

使用到的第三方框架:App中使用了很多第三方框架,这里只列举几种,Tinker(热修复)、ARouter、Glide、RxJava、Retrofit、BaseRecyclerViewAdapterHelper、X5WebView等等。

开源地址:https://github.com/linux-link/Fan

二、APP概览

 

 

 

 

三、项目结构

本项目概念上的结构如图所示

实际结构如图所示

 

 

下面分别解释各个module的作用:

  • Library-Base

    整个项目的基类,所有的第三方框架和自定义View框架都在这里添加依赖,以方便统一管理。

  • View_Xxx

    通用的自定义View框架。一些APP特有的view效果可以抽出独立成一个Module。例如:本项目使用了一个仿红板报的3D翻页效果库,就可以把它独立成一个module。

  • General_Xxx

    通用的自定义工具框架。一些所有项目可以公用的框架,为了方便日后在其他项目中使用,可以抽出独立成一个module,不能与项目的业务逻辑有关联。例如:本项目中网络框架就被单独封装成一个module。

  • Library-Architecture

    通用框架库。一般包含BaseApplication、常用的工具类以及架构层的封装例如BaseMvvmActivity等等。

    这个module在封装时需要考虑一定的通用性,最理想的情况的是,在重新开一个新的项目时,可以直接拷贝使用。

  • Library-Component

    服务于组件化的module。与业务逻辑相关,主要包含一些组件化的封装,一些子组件需要抽出的公共类也会放在这里。需要注意的是,Library-Component是其他所有子组件必需依赖的库。

  • Component_Xxx

    子组件。APP中各个业务逻辑的具体实现,既可以编译为library,用作其他组件的类库,也可以编译为application,可以独立运行调试。

    在项目根目录的build.gradle可以通过xxx_isSingleCompile的值来控制各个module是否需要独立运行。

  • app

    整个项目的入口,又被成为APP壳,在这里面将所有的子组件全部打包进apk中,为了加快编译速度,主要使用runtimeOnly。

需要单独说明的是,每一个子组件中还包含了一个gradle.properties文件,里面设定了该组件被编译成AAR库时一些属性,以及私有maven仓库的地址和用户名与密码。

四、组件复用(2019-08-22 更新)

组件化的一个重要目的就是能够在另一个项目中复用当前APP的一些组件,就像我们在项目中使用implementation引入一些第三方库一样,这些第三方库也可以当作一个组件。不过为了隐私的需要,我们多数时候是在公司的内网使用nexus搭建一个私有的maven仓库。

关于如何搭建maven仓库就不再介绍了,请自行百度,这里我在华为云服务器上搭建了一个公用的maven仓库(自行搭建maven仓库时,尽量使用内存大于2GB的主机),公网地址:http://119.3.215.243:9882,用户名:public,密码:123456@qq.com。

有了maven仓库,接下来我们就可以尝试将组件打包并上传到maven仓库中,给别项目使用。

1.编译aar类库并上传maven仓库

  • 选择一个module,执行build命令,将这个module编译成一个aar类库。编译好的aar文件,一般在对应module的build->outputs->aar下

在gradle.properties中配置maven仓库地址,以及组件的其他属性 

执行upload脚本,将aar类库上传到maven仓库中 

控制台出现successful,表示上传成功 

 

接下来就是如何在当前项目或其他项目中使用这个aar的类库

2.使用aar类库

  • 在根部目录的version.gradle中添加私有maven仓库的地址

使用在gradle.properties配置的唯一项目标识,引入aar类库 

 

 

在setting.gradle中,把一些已经编译成aar类库module注释掉

 

通过以上这些步骤,我们实现了组件的本地复用以及不同项目间的复用,而且因为大量的组件被编译成了aar类库,项目全编译时,这部分组件就不需要再进行编译,大幅提高了项目的编译效率。

五、后续展望

当前的APP依然十分简单,或者说简陋,当前正在学习如何部署、开发一个简单的后台,后面会逐渐放弃bmob,同时增加APP的复杂度,引入更多的开发技术,比如我最感兴趣的插件化、NDK、React Native或者Flutter等等。
最终目的还是希望能在一个APP中实践当下的主流开发技术,然后从中选择一个方向深入研究,不过这都是后话了。毕竟理想很丰满,现实很骨干=_=。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言入门篇——介绍篇

目录 1、什么是C语言 1、C语言的优点 3、语言标准 4、使用C语言的步骤 5、第一个C语言程序 6、关键字 1、什么是C语言 1972年,贝尔实验室的丹尼斯里奇和肯汤普逊在开发UNIX操作系统时设计了C语言,C语言是在B语言的基础上进行设计。C语言设计的初衷…

算法记录 | Day38 动态规划

对于动态规划问题,将拆解为如下五步曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509.斐波那契数 思路: 确定dp数组(dp table)以及下标的含义&#x…

Linux应用编程(线程)

与进程类似,线程是允许应用程序并发执行多个任务的一种机制,线程参与系统调度,事实上,系统调度的最小单元是线程、而并非进程。 一、线程概述 什么是线程? 线程是参与系统调度的最小单位。它被包含在进程之中&#x…

shell之自定义mykill(十六)

公众号:Android系统攻城狮 简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】&am…

2023-04-21:用go语言重写ffmpeg的metadata.c示例。

2023-04-21:用go语言重写ffmpeg的metadata.c示例。 答案2023-04-21: 这段 Go 代码演示了如何使用 ffmpeg-go 库中的函数来读取多媒体文件元数据,包括视频、音频等信息。它的大体过程如下: 设置环境变量以加载 FFmpeg 动态链接库…

紫砂壶型和泥料适配茶叶

一、壶型 1、紫砂壶泡茶,一般是壶音频率较高者,适宜配泡重香气的茶叶,如青茶;壶音稍低者较宜配泡重滋味的茶,如乌龙、铁观音。 壶音频率:是将壶盖取下,一手托住壶身一手用壶盖轻敲壶把产生的声音 2、容量在200ml以下…

MVC、MVP、MVVM:谁才是Android开发的终极之选?

概述 MVC、MVP、MVVM 都是在 Android 开发中经常用到的架构思想,它们都是为了更好地分离代码、提高代码可复用性、方便维护等目的而设计的。下面对这三种架构思想进行简单的介绍和比较。 MVC MVC 架构是最早被使用的一种架构,它把程序分成了三个部分&…

【LeetCode: 152. 乘积最大子数组 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

双语|中国和印度仍然主导着美国的国际学者领域

由美国国务院教育和文化事务局支持的国际教育学会期刊《门户开放》,调查了2021-2022赴美的国际学者来源情况,发表文章,“China and India still dominate international scholars field in US”(中国和印度仍然主导着美国的国际学…

初中级测试工程师,软件测试面试题总结大全(功能/接口/自动化测试)你要的都有...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般软件测试的面…

安全防御 IPsec VPN

目录 1.什么是数据认证,有什么用,有哪些实现的技术手段? 2.什么是身份认证,有什么用,有哪些实现的技术手段? 3.什么是VPN技术? 4.VPN技术有哪些分类? 5.IPsec技术能够提供哪些安…

linux中静态库与动态库

linux中静态库与动态库 1. 静态库静态库的制作:静态库的使用: 2. 动态库动态库的制作:动态库的使用: linux中静态库与动态库的区别 1. 静态库 静态库的制作: gcc add.c mult.c -c //这样就生成add.o mult.o目标文件 …

【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作; (2)掌握广义线性回归模型(logistic模型、sofmax模型)、前馈神经网络模型的原理; (3)熟练掌…

UBUNTU下NFS配置(用于嵌入式开发)

1. NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就…

低代码(九)低代码平台后设计一:模型驱动

我们先看一下汽车的基本构造,由车身、发动机、方向盘等多个零部件构成,因为它是一个工业产品,有实物存在,摸得着看得见,所以大家很容易理解。日本丰田汽车是如何做到自动化流水线生产的,本质上是把产品xBOM…

BufferedOutputStream,BufferedInputStream是字节流,对象处理流,序列化,输入输出流,转换流

BufferedInputStream字节输入流 意思就是InputStream类及其子类都能以参数的形式放到BufferedInputStream构造器的参数 package com.hspedu.outputstream_;import java.io.*;/*** author 韩顺平* version 1.0* 演示使用BufferedOutputStream 和 BufferedInputStream使用* 使用他…

数据挖掘:心脏病预测(测评指标;EDA)

目录 一、前期准备 二、实战演练 2.1分类指标评价计算示例 2.2数据探索性分析(EDA) 2.2.1 导入函数工具箱 2.2.2 查看数据信息等相关数据 判断数据缺失和异常 数字特征相互之间的关系可视化 类别特征分析(箱图,小提琴图&am…

ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

1. 关键字 下面是Swift语言中的常见关键字及其说明和代码应用实例: class:定义一个类,用于封装一组相关的属性和方法。 示例代码: class Person {var name: String ""var age: Int 0 }struct:定义一个…

网络安全与攻防-常见网络安全攻防

目录 攻击手段&防御策略 阻断服务攻击(DoS) 地址解析欺骗(ARP攻击)(Address Resolution Protocol spoofing) 跨站脚本攻击(XSS) SQL注入 跨站请求伪造(csrf&am…

AlgoC++第二课:线性回归

目录 线性回归前言1. 定义2. 房价预测案例2.1 定义问题:2.2 MSE是如何被定义的?(如何推导的?)2.3 总结 3. 代码3.1 C实现3.1.1 数据读取和处理3.1.2 线性回归模型3.1.3 参数输出和预测3.1.4 完整示例代码3.1.5 C知识点 3.2 python实现3.2.1 房…