当前位置: 首页 > news >正文

疯狂的SOVA:Android银行木马“新标杆”

2021年8月初,一款针对Android银行APP的恶意软件出现在人们的视野中,ThreatFabric
安全研究人员首次发现了这一木马,在其C2服务器的登录面板,研究人员发现,攻击者将其称之为SOVA。

** SO** ** V** ** A简介**

在俄语中,SOVA译为猫头鹰,或许是攻击者期望该恶意软件如同猫头鹰一般,成为夜间的优秀捕食者。研究人员确认这是一个全新的Android银行木马,且被发现时正处于开发和测试阶段。

与之同时,研究人员还发现,攻击者已经为其未来可实现的功能建立了清晰的路线图。随后几个月的时间里,SOVA陆续更新了多个版本,真的实现了其更新路线图中提到的诸多功能,包括双因素身份验证
(2FA) 拦截、cookie
窃取和针对新目标、国家(例如多家菲律宾银行)的注入等。

SOVA 路线图(2021 年 9 月)

很明显,SOVA表现出想要“大干一场”的强烈意愿,这也是其在初始阶段就进行分发的原因之一。该恶意软件希望将分布式拒绝服务(DDoS)、中间人(MiTM)和RANSOMSORT功能整合到其武器库中——在现有的银行覆盖、通知操作和键盘记录服务之上,足以给目标用户造成难以置信的伤害。它还有一个其他Android
恶意软件中不常见的功能:窃取会话cookie,这意味着犯罪分子无需知道银行凭据即可访问用户的有效登录会话,这也是很多银行APP感到非常头痛的地方。

此外,SOVA 以完全使用 Kotlin 开发而著称,Kotlin 是一种 Android 支持的编码语言,被许多人认为是 Android
开发的未来。如果作者对未来功能的承诺保持不变,那么 SOVA 可能会成为迄今为止在 Kotlin 中完全开发的最完整、最先进的 Android 恶意软件。

在迭代了V2和V3版本后,SOVA在一段时间内陷入了“沉睡”状态,但却在2022年5月再次被研究人员监测到处于活跃状态,并更新至V4版本,针对的目标也从2021年的90个增加至200个,包括银行应用程序和加密货币交易所/钱包。

有意思的是,安全研究人员还发现SOVA增加了一个令人意想不到的新功能——可对手机等移动端进行数据加密和勒索攻击。

** 起底SO** ** V** ** A**

1、语境

如下图所示,该截图包含了SOVA 混淆和打包版本的 VirusTotal 页面。在文件哈希下方突出显示的字符串是文件上传到 VirusTotal
时使用的名称,文件名为“Vormastor test
crypted.apk”。

根据作者的说法,美国和西班牙的不同银行机构已经有多种叠加可供选择,但它们提供了在买方有需要的情况下创造更多叠加的可能性。该恶意软件未来的版本可能会再次切换到JaVa,以解决其使用混淆软件的兼容性问题。

2、命令

以下是SOVA常用的命令列表:

3、能力

SOVA 的一大特点是不容易被发现,为了实现这一点,SOVA
滥用覆盖机制来诱骗受害者泄露他们的密码和其他重要的私人信息。在覆盖攻击中,用户在他们认为是合法的银行应用程序中输入他们的凭据,于是这些信息就交到了攻击者手中。SOVA
也有可能从设备中窃取会话 cookie,该功能并非第一次出现,但在现代 Android 木马中绝对不常见,且绝对是攻击者获取账户凭证的利器。

与大多数银行木马一样,SOVA 严重依赖 Accessibility
SerVices。首次启动时,该恶意软件会隐藏其应用程序图标,并滥用辅助功能服务来获取正常运行所需的所有权限。在其更新路线图中我们还可以看到,该恶意软件具备躲避双因素身份验证的能力。

具体来说,SOVA恶意软件的主要能力如下:

  • 窃取设备数据
  • 发信息
  • 覆盖和 Cookie 注入
  • 通过推送通知进行覆盖和 Cookie 注入
  • USSD 执行
  • 信用卡覆盖有效性检查
  • SMS的隐藏拦截
  • 通知的隐藏拦截
  • 键盘记录器
  • 卸载应用程序
  • 从受害者卸载中恢复

此外,在其之前发布的路线图中,研究人员还发现了以下的能力:

  • 自动 3 阶段叠加注射
  • 自动 cookie 注入
  • 剪贴板操作
  • 分布式拒绝服务
  • 改善面板健康
  • 勒索软件(卡号覆盖)
  • 中间人(MitM)
  • 普通推送通知
  • 更多叠加
  • VNC
  • 2FA拦截

从上述能力可以看出,SOVA 背后的组织者的思路非常激进,尝试将恶意软件和僵尸网络的功能相结合,并力推SOVA 进入Android
银行恶意软件的不同领域。随着这些功能在后续版本中陆续变成现实,SOVA 也逐渐成为Android领域中具备高危险性的恶意软件。

(1)、覆盖攻击

与大多数 Android 银行木马一样,SOVA 依靠覆盖攻击从受害者那里窃取 PII。如果用户试图访问包含在 SOVA
的活动目标列表中的银行应用程序,恶意软件将收到 Accessibility SerVices 的通知,并将显示一个 WebView
覆盖,伪装成预期的银行应用程序。

此外,攻击者声称未来的 SOVA 版本将具有所谓的 3-stage-
oVerlay,如下图所示:

可以预见的是,3段叠加之后SOVA将拥有更强大的功能,甚至将额外的软件下载到目标设备上。

而目标列表包含在名为“packageList.txt”的资产文件中,此列表非常广泛,包含需要信用卡访问权限才能运行的银行应用程序、加密货币钱包和购物应用程序。

(2)、cookie窃取

SOVA 的另一个关键能力是窃取 cookie 的能力。由于Cookie允许用户在浏览器上保持打开的会话而无需输入任何凭据,因此攻击者窃取 cookie
后就可以直接访问受害者的 Web 会话。具体来说,SOVA 将创建一个 WebView 以打开目标应用程序的合法 Web URL,并在受害者成功登录后使用
Android CookieManager 窃取
cookie。

根据已发现的代码片段,研究人员已经知晓攻击者是如何创建覆盖 WebView,具体代码如下:

this.setContentView(0x7F070001);  // layout:actiVity_web_ViewWebView V1 = (WebView)this.a(0x7F05001D);  // id:web_ViewChecks.checkNotNullWithName(V1, "web_View");WebSettings webSettings = V1.getSettings();Checks.checkNotNullWithName(webSettings, "web_View.settings");webSettings.setJaVaScriptEnabled(true);((WebView)this.a(0x7F05001D)).setLayerType(2, null);  // id:web_ViewString link = this.getIntent().getStringExtra("link");boolean getCookieFlag = this.getIntent().getBooleanExtra("getCookie", false);CookieManager cookieManager = CookieManager.getInstance();CookieSyncManager.createInstance(this.getApplicationContext());cookieManager.setAcceptThirdPartyCookies(((WebView)this.a(0x7F05001D)), true);  // id:web_ViewcookieManager.acceptCookie();CookieSyncManager.getInstance().startSync();WebView webView2 = (WebView)this.a(0x7F05001D);  // id:web_ViewChecks.checkNotNullWithName(webView2, "web_View");Checks.checkNotNullWithName(cookieManager, "cookieManager");webView2.setWebViewClient(new CustomWebViewClient(this, ((boolean)(((int)getCookieFlag))), cookieManager));if(link != null) {((WebView)this.a(0x7F05001D)).loadUrl(link);  // id:web_View}

需要注意的是,该恶意软件不需要特定权限即可运行此代码,研究人员在测试过程中发现,SOVA可轻松地从 Gmail 或 PayPal 等主要网站窃取会话
cookie,甚至是创建应用程序列表自动监控 cookie 的选项。

(3)、DDoS攻击

DDoS 攻击是SOVA的核心能力之一,也是当前 Android
恶意软件生态系统中不常见的功能,其目标是耗尽设备的资源,使其对目标用户不可用。在最初的版本中这个功能并没有出现,但是背后的组织者已经设置了一个startddos命令,它将在
Kotlin 协程中执行以下代码:

do {retrofitManager V3 = this.mRetrofitManager;if(!V3.isActiVe) {return l.a;}Objects.requireNonNull(V3.retrofitClient);this.i = V1_1;this.j = 1;}while(retrofitClient.ddosEndpoint.request(this.link, this) != V0);

在SOVA的路线进化图中,我们可以发现这个功能还在继续开发之中,但尽管如此,SOVA实际上能够使用 RetroFit 为给定的 URL 创建请求。

RetroFitBuilder DDOSretroFitBuilder = new RetroFitBuilder();DDOSretroFitBuilder.setHTTPClient(okHTTPClient);DDOSretroFitBuilder.setBaseUrl("http://google.com/");myConVerterFactory DDoSConVerterFactory = myConVerterFactory.c();DDOSretroFitBuilder.conVerterFactories.add(DDoSConVerterFactory);retrofitClient.ddosEndpoint = (ddosEndpoint)DDOSretroFitBuilder.buildRetrofit().getProxyClass(ddosEndpoint.class);

如上所示,尽管它将 “google.com” 设置为基本 URL,但通过使用 RetroFit 的 @Url 注释,作者能够动态输入一个全新的 URL。

** SO** ** V** ** A** ** V** ** 4**

SOVA V4版本是一次阶段性更新,在这个版本中SOVA的威胁指数更高,且传播能力、隐藏能力也都有了相应的提升。例如在V4版本中,SOVA 背后的组织者
(TA) 尝试将恶意软件隐藏在假冒的 Android 应用程序中,这些应用程序带有流行应用程序的徽标,例如 Chrome、亚马逊、NFT
平台或其他。

SOVA V4 使用的主要图标

SOVA
V4版本还更新了一项新的功能,即获取受感染设备的屏幕截图,以此从受害者那里获取更多信息。例如该恶意软件可以投射/录制屏幕,悄无声息获取用户的关键信息,并对对敏感信息进行记录和存储(如下图所示)。这些功能与可访问性服务相结合,使
TA 能够执行手势,从而实现在受感染设备上进行欺诈活动。这和目前我们常见的Android
银行木马(Oscorp或BRATA)的做法并无二致。

SOVA V4 的投射/录制功能

在SOVA
V4版本,攻击者可以轻松管理多个命令。其中包括屏幕点击、滑动、复制/粘贴、显示覆盖屏幕以此隐藏屏幕信息获取的能力等。所有已经获取或存储的敏感信息都会发送回C2服务器,这是一个十分明显的指标,意味着SOVA仍然只是一个过渡版本,其背后的组织者还在不断开发新的功能和特性。

同时,SOVA V4版本还对其核心功能cookie 窃取机制进行了重构和改进。其组织者详细列出了他们感兴趣的 Google 服务(如 Gmail、GPay
、Google 密码管理器等),以及其他应用程序的列表。对于每一个被盗的 cookie,SOVA 还将收集附加信息,以便更精细化实施欺诈活动。

另一个重构的功能是其“保护模块”,该模块最主要的功能是保护恶意软件被卸载。当用户试图从设置中卸载该恶意软件时,SOVA
能够拦截这些操作,自动返回主屏幕,并弹出一个小窗口“此应用程序是安全的”。

SOVA V3 和 V4 之间的“保护”代码比较

和市场上主流Android 银行木马一样,SOVA 使用 .apk后缀只是为了解压恶意软件,释放真正具备恶意功能的 .dex 文件。在之前的版本中,SOVA
将 .dex 文件存储在应用程序的目录中,而在当前版本中,它使用设备的共享存储目录(“Android/obb/”)进行存储,更直接也更加有效。

此外SOVA V4还增加了一个全新的模块,专门用于Binance交易所和Trust Wallet(Binance
官方加密钱包)。对于这两种应用程序,攻击者旨在获取不同的信息,例如账户余额、受害者在应用程序内执行的不同操作,最后甚至是用于访问加密钱包的助记词(单词集合)等。

** SO** ** V** ** A** ** V** ** 5**

就在SOVA V4版本重出江湖之际,Cleafy ASK又在野外发现了多个SOVA变异样本,疑似是SOVA
V5版本。在对其新版本的代码进行分析后,安全研究人员再次发现其代码又有了重大的变化,增加了不少新的功能,此外恶意软件与 C2
服务器之间通信也发生了一些小变化。

例如在 SOVA V5版本中并未观察到
V4版本的VNC模块,安全人员认为这个功能尚未集成到V5版本中。有意思的是,安全人员发现了多个用于调试的日志,综合这些信息 SOVA
V5很有可能还处于开发之中。

SOVA V5 命令列表

尽管还在开发初期,但是SOVA V5有一个核心功能值得引起行业的注意,新增加了一个勒索软件模块,该模块在2021 年 9
月公布的路线图中宣布,没想到如今真的成为了现实。

SOVA V5 的勒索软件模块

虽然目前勒索软件功能似乎并未全部完成,但是不妨碍大家对此感兴趣,这在Android
银行木马领域十分罕见。毕竟在用户的普遍认知中,勒索软件一般是针对PC端。该恶意组织十分敏锐地顺应了近年来的发展趋势,目前移动设备已成为大多数的个人和商业数据的中央存储。一旦勒索软件功能落地,SOVA将一骑绝尘。

** SOVA正气势汹汹**

根据Cleafy ASK的报告,2022年 Android
银行恶意软件家族呈爆炸式增长;无论是从数量上还是质量上皆是如此。随着进入数字化转型期,以及移动支付使用量急剧增加,攻击者开始转换思路跟随这一大趋势,因此积极新技术、新方法强化移动端的攻击力度也就不足为奇了。

SOVA就是其中代表之一,虽然它仍然处于起步阶段,但是已表现出极大的野心,正气势汹汹而来。目前SOVA的基础功能已经完善,并且可以和其他现代 Android
银行恶意软件一较长短。关键是SOVA没有停下更新迭代的脚步,其背后的组织者显然也对其寄予厚望,那份明确的功能路线图也从侧面印证了这一观点。

如果真的按照路线图所展示的功能,那么在不久的将来,SOVA可通过 VNC、DDoS
功能、勒索软件和高级覆盖攻击来识别设备上的欺诈行为。这些功能将使它成为市场上功能最丰富的 Android 恶意软件,并可能成为Android
银行木马的“新标杆”。

网络安全工程师企业级学习路线

这时候你当然需要一份系统性的学习路线

如图片过大被平台压缩导致看不清的话,可以在文末下载(无偿的),大家也可以一起学习交流一下。

一些我收集的网络安全自学入门书籍

一些我白嫖到的不错的视频教程:

上述资料【扫下方二维码】就可以领取了,无偿分享

相关文章:

疯狂的SOVA:Android银行木马“新标杆”

2021年8月初,一款针对Android银行APP的恶意软件出现在人们的视野中,ThreatFabric 安全研究人员首次发现了这一木马,在其C2服务器的登录面板,研究人员发现,攻击者将其称之为SOVA。 ** SO** ** V** ** A简介** 在俄语中…...

汽车零部件企业数字工厂管理系统建设方案

在汽车零部件制造领域,伴随工业信息化与机器人化,制造模式逐渐从 CAD/CAE/CAM 数字化设计及加工走向全产品周期虚拟现实的数字化工厂管理系统平台,实现虚拟现实设计制造,防范产品缺陷并预防设备故障,大幅提高生产效率。…...

【线程同步工具】Semaphore源码解析

控制对资源的一个或多个副本的并发访问 Java API 提供了一种信号量机制 Semaphore。 一个信号量就是一个计数器, 可用于保护对一个或多个共享资源的访问。 当一个线程要访问多个共享资源中的一个时,它首先需要获得一个信号量。如果信号量内部的计数器的…...

获取实时天气

一、用天气API(需要付费) 网址:https://www.tianqiapi.com/请求方式及url:请求方式:GET接口地址:https://tianqiapi.com/free/day请求示例https://www.tianqiapi.com/free/day?appid_____&appsecret__…...

【数据库】redis数据持久化

目录 数据持久化 一, RDB 1, 什么是RDB 2,持久化流程 3, 相关配置 案例演示: 4, 备份和恢复 1、备份 2、恢复 3,优势 4, 劣势 二,AOF 1,什么是A…...

前端编译、JIT编译、AOT编译

一、前端编译:java设计之初就是强调跨平台,通过javac将源文件编译成于平台无关的class文件, 它定义了执行 Java 程序所需的所有信息(许多Java"语法糖",是在这个阶段完成的,不依赖虚拟机&#xff…...

父子组件中,子组件调用父组件的方法

父子组件中&#xff0c;子组件调用父组件的方法 方法一&#xff1a;直接在子组件中通过this.$parent.event来调用父组件的方法 父组件 <template><p><child>父组件</child></p> </template> <script>import child from ~/compone…...

第七章.深度学习

第七章.深度学习 7.1 深度学习 深度学习是加深了层的深度神经网络。 1.加深层的好处 1).可以减少网络的参数数量 5*5的卷积运算示例&#xff1a; 重复两次3*3的卷积层示例&#xff1a; 图像说明&#xff1a; ①.一次5 * 5的卷积运算的区域可以由两次3 * 3的卷积运算抵消&a…...

小学生学Arduino---------点阵(三)动态的显示与清除

学习目标&#xff1a; 1、理解“整数值”的概念与使用 2、理解“N1”指令的意义 3、掌握“反复执行多次”指令的使用 4、掌握屏幕模块的清除功能指令 5、理解“反复执行”指令与“反复执行多次”指令的嵌套使用 6、搭建电路图 7、编写程序 效果&#xff1a; 整数包括&#xf…...

opencv图片处理

目录1 图片处理1.1 显示图片1.2 旋转图片1.3 合并图片1.4、Mat类1.4.1、像素的储存结构1.4.2、访问像素数据1.6、rgb转灰度图1.7、二值化1.8、对比度和亮度1.9、图片缩放1.9.1、resize临近点算法双线性内插值1.9.2、金字塔缩放1.10、图片叠加1 图片处理 1.1 显示图片 #includ…...

C++ Primer Plus 学习笔记(二)—— 复合类型

数组 当我们只是定义了数组&#xff0c;而没有对数组进行初始化时&#xff0c;那数组的值将是未定义的。 在对数组进行初始化时&#xff0c;如果只对数组的一部分进行初始化&#xff0c;编译器会将把其他元素自动设置为0。 #include <iostream>using namespace std;in…...

代码随想录算法训练营第七天 | 454.四数相加II 、 383. 赎金信、15. 三数之和、18. 四数之和 、总结

打卡第七天&#xff0c;还是哈希表。 今日任务 454.四数相加II383.赎金信15.三数之和18.四数之和总结 454.四数相加II 代码随想录 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, ve…...

apply函数族

apply函数族 apply函数族是R语言中帮助用户实现高效的向量化运算的一系列函数&#xff0c;包括apply,lapply,sapply,vapply等。 apply() apply函数以列或行为单位进行循环操作&#xff0c;可以处理matrix、array数据&#xff0c;返回一个向量或matrix。 apply(data,1/2,fuc…...

读书笔记可读性素材

《深入理解Java虚拟机》 《深入理解Java虚拟机》 《深入理解Java虚拟机》 本地方法栈&#xff08;Native Method Stacks&#xff09; 本地方法栈&#xff08;Native Method Stacks&#xff09; 本地方法栈&#xff08;Native Method Stacks&#xff09; -----------------…...

【C++】vector 模拟实现

vectorvector 容器vector 基本使用vector 定义库中各类接口的使用迭代器容量相关接口元素访问相关接口元素修改相关接口模拟实现 vector前期准备构造与析构赋值运算符重载迭代器相关容量相关元素访问相关元素的修改相关二维数组的创建对于自定义类型数据的测试vector 容器 C S…...

canvas初体验

canvas介绍 Canvas 最初由Apple于2004 年引入&#xff0c;用于Mac OS X WebKit组件&#xff0c;为仪表板小部件和Safari浏览器等应用程序提供支持。后来&#xff0c;它被Gecko内核的浏览器&#xff08;尤其是Mozilla Firefox&#xff09;&#xff0c;Opera和Chrome实现&#x…...

JavaWeb12-线程通讯(线程等待和唤醒)

目录 1.方法介绍 1.1.wait()/wait(long timeout)&#xff1a;让当前线程进入等待状态。 1.1.1.wait执行流程 1.1.2.wait结束等待的条件 1.1.3.wait() VS wait(long timeout) 1.1.4.为什么wait要放在Object中&#xff1f; --->PS&#xff1a;wait(0) 和 sleep(0) 的区…...

江苏专转本如何事半功倍的备考

专转本如何事半功倍的备考 一个人学习成绩的优劣取决于他的学习能力&#xff0c;学习能力包括三个要素&#xff1a;规范的学习行为&#xff1b;良好的学习习惯&#xff1b;有效的学习方法。有了规范的学习行为才能培养出良好的学习习惯&#xff0c;形成了良好的学习习惯就会形成…...

linux下安装mongoDB

一、下载mongoDB包 下载地址&#xff1a; https://www.mongodb.com/try/download/community 个人建议&#xff1a;如果是学习阶段&#xff0c;使用5以下版本更好些。 二、安装及配置 1、安装 # 1、解压 $ tar -zxvf mongodb-linux-x86_64-rhel70-4.4.19-rc1.tgz# 2、迁移目…...

掌握MySQL分库分表(七)广播表、绑定表实战,水平分库+分表实现及之后的查询和删除操作

文章目录什么是广播表广播表实战数据库配置表Java配置实体类配置文件测试广播表水平分库分表配置文件运行测试什么是绑定表&#xff1f;绑定表实战配置数据库配置Java实体类配置文件运行测试水平分库分表后的查询和删除操作查询操作什么是广播表 指所有的分片数据源中都存在的…...

企业为什么需要数据可视化报表

数据可视化报表是在商业环境、市场环境已经改变之后&#xff0c;发展出来为当前企业提供替代解决办法的重要方案。而且信息化、数字化时代&#xff0c;很多企业已经进行了初步的信息化建设&#xff0c;沉淀了大量业务数据&#xff0c;这些数据作为企业的资产&#xff0c;是需要…...

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因&#xff0c;因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台&#xff1b;因此&#xff0c;预防总比哀叹好&#xff0c;这就是为什么众…...

【Java并发编程】线程安全(一)Synchronized原理

Synchronized底层实现 简单来说&#xff0c;Synchronized关键字的执行主体是线程对象&#xff0c;加锁是通过一个锁对象来完成的是&#xff0c;而锁对象底层关联了一个c源码的monitor的对象&#xff0c;monitor对象底层又对应了操作系统级别的互斥锁&#xff0c;同一时刻只有一…...

[apollo]vue3.x中apollo的使用

[apollo]vue3.x中apollo的使用通过客户端获取Apollo配置环境工具的安装获取Apollo配置相关代码错误提示Uncaught (in promise) Error: Apollo client with id default not found. Use provideApolloClient() if you are outside of a component setup通过开放接口获取Apollo配置…...

system()函数启用新进程占有原进程的文件描述符表的问题

我在A程序中占用了/dev/video0这个独占模式的设备文件&#xff0c;在A中用system函数启用了B程序&#xff0c;B程序的代码中并不包含对/dev/video0的访问&#xff0c;但是我发现B程序也占用了/dev/video0&#xff0c;并且我在A程序中关闭了/dev/video0后&#xff0c;A程序不再占…...

nignx(安装,正反代理,安装tomcat设置反向代理,ip透传)

1安装nginx 安装wget Yum install -y wget 下载(链接从官网找到右键获取) 以下过程root 安装gcc Yum -y install gcc c 安装pcre Yum install -y pcre pcre-devel Openssl Yum install -y openssl openssl-devel 安装zlib Yum install -y zlib zlib-devel 安装make Yum inst…...

sklearn模块常用内容解析笔记

文章目录 回归模型评价指标R2_score预备知识R2_score计算公式r2_score使用方法注意事项参考文献回归模型评价指标R2_score 回归模型的性能的评价指标主要有:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score。但是当量纲不同时,RMSE、MAE、MSE难以衡量模…...

我的 System Verilog 学习记录(2)

引言 从本文开始&#xff0c;就开始系统学习 System Verilog &#xff0c;不只是语法&#xff0c;还有结合 Questa Sim 的实际编程练习、Debug。 本文简单介绍 System Verilog 语言的用途以及学习的必要性。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08…...

【调研报告】Monorepo 和 Multirepo 的风格对比及使用示例

带有权重的Monorepo和Multirepo对比 功能/特性MonorepoMultirepoMonorepo权重值Multirepo权重值代码管理管理多个代码库更加复杂管理单个代码库更加简单37依赖管理可以简化依赖管理依赖冲突可能会更加困难73构建和部署构建和部署更加容易构建和部署可能需要更多的配置82团队协…...

Retrofit源码分析

文章目录一、简介二、源码分析2.1Retrofit的本质流程2.2源码分析2.2.1 创建Retrofit实例步骤1步骤2步骤3步骤4步骤5总结2.2.2创建网络请求接口的实例外观模式 & 代理模式1.外观模式2. 代理模式步骤3步骤4总结2.2.3执行网络请求同步请求OkHttpCall.execute()1.发送请求过程2…...