网站开发沟通东莞网页制作网站

web/2025/9/28 21:13:19/文章来源:
网站开发沟通,东莞网页制作网站,网站色彩搭配,国内app开发商背景 近年来#xff0c;随着手机业务的快速发展#xff0c;为满足手机端用户诉求和业务功能的迅速增长#xff0c;移动端的技术架构也从单一的大工程应用#xff0c;逐步向模块化、组件化方向发展。以高德地图为例#xff0c;Android 端的代码已突破百万行级别#xff0…背景 近年来随着手机业务的快速发展为满足手机端用户诉求和业务功能的迅速增长移动端的技术架构也从单一的大工程应用逐步向模块化、组件化方向发展。以高德地图为例Android 端的代码已突破百万行级别超过100个模块参与最终构建。 试想一下如果没有一套标准的依赖检测和监控工具用不了多久模块的依赖关系就可能会乱成一锅粥。 从模块 Owner 的角度看为什么依赖分析这么重要 1.作为模块 Owner我首先想知道“谁依赖了我依赖了哪些接口”。唯有如此才能评估本模块改动的影响范围以及暴露的接口的合理性。 2.我还想知道“我依赖了谁调用了哪些外部接口”对所需要的外部能力做到心中有数。 从全局视角看一个健康的依赖结构要防止“下层模块”直接依赖“上层模块”更要杜绝循环依赖。通过分析全局的依赖关系可以快速定位不合理的依赖提前暴露业务问题。 因此依赖分析是研发过程中非常重要的一环。 常见的依赖分析方式 提到 Android 依赖分析首先浮现在脑海中的可能是以下这些方案 分析 Gradle 依赖树。扫描代码中的 import 声明。使用 Android Studio 自带的分析功能。 我们逐个来分析这几个方案 1. Gradle 依赖树 使用 ./gradlew :module:dependencies --configuration releaseCompileClasspath -q 命令很容易就可以得到模块的依赖树如图 不难发现这种方式有两个问题 声明即依赖即使代码中没有使用的库也会输出到结果中。只能分析到模块级别无法精确到方法级别。 2. 扫描 import 声明 扫描 Java 文件中的 import 语句可以得到文件(类)之间的调用关系。 因为模块与文件(类)的对应关系非常容易得到(扫描目录)。所以得到了文件(类)之间的依赖关系即是得到了模块之间文件(类)级别的依赖关系。 这个方案相比 Gradle 依赖扫描提升了结果维度可以分析到文件(类)级别。但是它也存在一些缺点 无法处理 import * 的情况。扫描“有 import 但未使用对应类”的场景效率太低(需要做源码字符串查找)。 3. 使用 IDE 自带的分析功能 触发 Android Studio 菜单 「Analyze」 - 「Analyze Dependencies」可以得到模块间方法级别的依赖关系数据。如图 Android Studio 能准确分析到模块之间“方法级别”的引用关系支持在 IDE 中跳转查看也能扫描到对 Android SDK 的引用。 这个方案比前面两个都优秀主要是准确。但是它也有几个问题 耗时较长全面分析 AMap 全源码大约需要 10 分钟。分析结果无法为第三方复用无法生成可视化的依赖关系图。分析正向依赖和逆向依赖需要扫描两次。 总结一下上述三种方案Gralde 依赖基于工程配置粒度太粗且结果不准。“Import 扫描方案”能拿到文件级别依赖但数据不全。IDE 扫描虽然结果精准但是数据复用困难不便于工程化。 为什么要使用字节码来分析 参考 Android 构建流程图所有的 Java 源代码和 aapt 生成的 R.java 文件都会被编译成 .class 文件再被编译为 dex 文件最终通过 apkbuilder 生成到 apk 文件中。图中的 .class 文件即是我们所说的 Java 字节码它是对 Java 源码的二进制转义。 在 Android 端常见的字节码应用场景包括 字节码插桩用于实现对 UI 、内存、网络等模块的性能监控。修改 jar 包针对无源码的库通过编辑字节码来实现一些简单的逻辑修改。 回到本文的主题为什么要分析字节码而不是 Java 代码或者 dex 文件 不使用 Java 代码是因为有些库以 jar 或者 aar 的方式提供我们获取不到源码。不使用 dex 文件是因为它没有好用的语法分析工具。所以解析字节码几乎是我们唯一的选择。 如何使用字节码分析依赖关系 要得到模块之间的依赖关系其实就是要得到“模块间类与类”之间的依赖关系。而要确定类之间的关系分析类字节码的语句即可。 1. 在什么时机来分析 了解 Android 构建流程的同学应该对 transform 这个任务不陌生。它是 Android Gradle 插件提供的一个字节码 Hook 入口。 在 transform 这个任务中所有的字节码文件(包括三方库) 以 Input 的格式输入。 以JarInput 为例分析其 file 字段可得到模块的名称。解析 file 文件即可得到此模块所有的字节码文件。 有了模块名称和对应路径下的 class 文件就建立了模块与类的对应关系这是我们拿到的第一个关键数据。 2. 使用什么工具分析 解析 Java 字节码的工具最常用的包括 JavassitASMCGLib。ASM 是一个轻量级的类库性能较好但需要直接操作 JVM 指令。CGLib 是对 ASM 的封装提供了更高级的接口。 相比而言Javassist 要简单的多它基于 Java 的 API 无需操作 JVM 指令但其性能要差一些(因为 Javassit 增加了一层抽象)。在工程原型阶段为了快速验证结果我们优先选择了 Javassit 。 3. 具体方案是怎样的 先看一个简单的示例如何分析下面这段代码的调用关系 1: package com.account; 2: import com.account.B; 3: public class A { 4: void methodA() { 5: B b new B(); // 初始化了 Class B 的实例 b 6: b.methodB(); // 调用了 b 的 methodB 方法 7: } 8: }第1步初始化环境加载字节码 A.class注册语句分析器。 // 初始化 ClassPool将字节码文件目录注册到 Pool 中。 ClassPool pool ClassPool.getDefault(); pool.insertClassPath(class文件所在目录) // 加载类A CtClass cls pool.get(com.account.A); // 注册表达式分析器到类A MyExprEditor editor new MyExprEditor(ctCls) ctCls.instrument(editor)第2步自定义表达式解析器分析类A(以解析语句调用为例)。 class MyExprEditor extends ExprEditor { Override void edit(MethodCall m) {// 语句所在类的名称def clsAName ctCls.name// 语句在哪个方法被调用def where m.where().methodInfo.getName()// 语句在哪一行被调用def line m.lineNumber// 被调用类的名称def clsBName m.className// 被调用的方法def methodBName m.methodName } // 省略其它解析函数 ... } ExprEditor 的 edit(MethodCall m) 回调能拦截 Class A 中所有的方法调用(MethodCall)。 除了本例中对 MethodCall 的解析它还支持解析 newnew ArrayConstructorCallFieldAccessInstanceOf强制类型转换try-catch 语句。 解析完 Class A我们得到了 A 对 B 的依赖信息 Class1Class2Exprmethod1method2lineNocom.account.Acom.account.BNewExprmethodA 5com.account.Acom.account.BmethodCallmethodAmethodB6 ------------------- ------------------------------------------------------- 简单解释如下 类 com.account.A 的第5行(methodA方法内)调用了 com.account.B 的构造函数 类 com.account.A 的第6行(methodA方法内)调用了 com.account.B 的 methodB 函数 这便是“类和类之间方法级”的依赖数据。结合第1步得到的“模块和类”的对应关系最终我们便获得了“模块间方法级的依赖数据”。 基于这些基础数据我们还可以自定义依赖检测规则、生成全局的模块依赖关系图等本文就不展开了。 小结 本文主要介绍了模块依赖分析在研发过程中的重要性分析了 Android 常见的依赖分析方案从 Gradle 依赖树分析 Import 扫描使用 IDE 分析到最后的字节码解析方案逐步递进。越是接近源头的解法才是越根本的解法。 原文链接 本文为云栖社区原创内容未经允许不得转载。

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

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

相关文章

网站建设合同是否交纳印花税哪些平台可以发广告

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在并发编程中,了解任务的性质对于选择合适的并发策略和资源分配至关重要。本篇博客将深入探讨 CPU 密集型和 IO 密集型任务的概念,分析它们在并…

西安SEO网站建设哪家好广州网页设计公司排名

环境: threejs:129 (在浏览器的控制台下输入: window.__THREE__即可查看版本)vscodewindowedge 透视相机或正交相机都有一个zoom参数,它可以用来将相机排到的内容在canvas上缩放显示。 要点:…

环保网站模版php网站源码删除

文章目录 1、UC Merced Land-Use 2、Indian Pines 3、KSC 4、Washington DC 5、BigEarthNet 6、水体卫星图像的图像 7、城市航拍图像分割数据集 8、游泳池和汽车卫星图像检测 9、人工月球景观数据集 10、马萨诸塞州道路数据集 1、UC Merced Land-Use 数据集下载地址&am…

企业网站有哪四种类型佛山八戒网站建设

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上,精心挑选和组合的色彩配色,往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中,我们需要有坚实的色彩理论知识,同时还需要擅于从生活中观察和提取灵感。以…

网站建设哪些好app小程序

在指针浅谈(二)http://t.csdnimg.cn/SKAkD中我们讲到了const修饰指针、指针运算、野指针、assert断言和传址调用的内容,今天我们继续学习有关数组名、指针访问数组、一维数组传参的本质相关的内容,内容比较深入,如果觉得哪里讲解的不行&#…

石家庄外贸网站制作公司网站免费诊断

过桥 题目大意: 有n个人要过一条桥,每个人都有自己的过桥时间,一条桥同时只能有2个人过(过桥时间求较慢的一人),且要有人拿着手电筒才能过,只有一个手电筒,且不能扔手电筒&#xf…

网站挂载wordpress获取当前页面内容

前言 该内容是 OWASP TOP 10 的学习笔记,笔记内容来源 B 站龙哥的视频【12.Top漏洞10:服务器请求伪造_哔哩哔哩_bilibili】 一、访问控制崩溃 概念 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xf…

个人电脑做网站违法吗wordpress 4.8.3

这本书所处时代背景尽管与我生活的时代背景不同,但是我仍是被人物的生活所打动。这本书为我们描述了一个拥有一百亩的阔少爷徐福贵因为赌而输掉全部家产,到经历将自己的父亲,母亲,儿子,女儿,女媳&#xff0…

一般设计网站页面用什么软件做吉林省科瑞建设项目管理有限公司网站

窗口操作就是把多个采集周期设置成一个窗口,一起来计算,然后进行滑动,根据设置的滑动大小。 窗口大小和滑动大小,要是采集周期的倍数 package date_10_17_SparkStreamingimport org.apache.spark.SparkConf import org.apache.s…

沧州建设网站公司单页面网站多少钱

最近在工作中遇到了std::map中的lower_bound与upper_bound&#xff0c;再次记录下其功能和使用方式。 std::map<char, int> mp; mp.lower_bound<key> &#xff1a; 返回的是第一个大于、等于key的iterator&#xff0c;如果没有则返回空。 mp.upper_bound<key…

戴尔网站建设规划衡水seo排名

2023年7月25日至26日&#xff0c;由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;、中国通信标准化协会主办的以“云领创新&#xff0c;算启新篇”为主题的“2023可信云大会”在北京成功举办。会上公布了多项前瞻领域的评估结果和2023年度最佳实践案例&#x…

现在做个网站要多少钱asp.net 当前网站

select p.name, m.definition from sys.procedures p inner join sys.sql_modules m on p.object_id m.object_idwhere m.definition like %150% 感谢怡红公子

自适应网站设计稿开发一款小程序

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

微电影网站源码xiazaiwordpress删除缓存

Python中的函数参数传递方式是怎样的&#xff1f; 在Python中&#xff0c;函数参数传递是函数调用的重要部分&#xff0c;它决定了如何将数据从调用者传递到函数中。Python的参数传递方式主要可以分为两类&#xff1a;位置参数&#xff08;Positional Arguments&#xff09;和…

深圳苍松大厦 网站建设做网站的广告词

1 问题 1&#xff09;合并2个文件&#xff0c;这里用paste命令 2&#xff09;找到匹配的文件里面替换内容&#xff0c;这里用find 和 -exec或xargs命令组合 2 实现 1&#xff09;合并2个文件&#xff0c;这里用paste命令&#xff0c;我们在paste后面加参数-d 然后加" &…

建站运营新闻深圳市工程交易中心

文章目录 1.环境准备2.验证码服务2.1 kratos 初始化验证码服务项目2.2 使用 Protobuf 定义验证码生成接口2.3 业务逻辑代码实现 1.环境准备 protoc和protoc-gen-go插件安装和kratos工具安装 protoc下载 下载二进制文件&#xff1a;https://github.com/protocolbuffers/protobu…

公益环保网站建设信息流优化师面试常见问题

企业在品牌推广前需要制订一系列有针对性和连续性的步骤&#xff0c;这些步骤定睛于长期策略&#xff0c;而且要适应目标客户的使用方式和习惯。在企业内部导入品牌VI是前提&#xff0c;外部的宣传则是强调品牌所宣扬的内涵和精神实质&#xff0c;总体来说&#xff0c;这只是一…

个人网站设计要求互联网保险经纪公司十大排名

基本数据类型 整型 整型分为以下两个大类&#xff1a; 按长度分为&#xff1a;int8、int16、int32、int64 对应的无符号整型&#xff1a;uint8、uint16、uint32、uint64 其中&#xff0c;uint8就是我们熟知的byte型&#xff0c;int16对应C语言中的short型&#xff0c;int64对应…

国外买域名的网站网站建设罒金手指下拉壹陆

http://www.openedv.com/docs/tool/dap/ST-LINKV2.html https://www.stmcu.com.cn/Designresource/detail/fi rmware_software/709492

宁波建设工程主管部门网站lnmp快速安装wordpress

最长公共前缀 题目说明&#xff1a; * 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; * 输入&#xff1a;strs ["flower","flow","flight"] * …