第3.2.3节 Android动态调用链路的获取
3.2.3 Android App动态调用链路
在Android应用中,动态调用链路指的是应用在运行时的调用路径。这通常涉及到方法调用的顺序和调用关系,特别是在应用的复杂逻辑中,理解这些调用链路对于调试和性能优化非常重要。
1,动态调用链路获取方法
要获取Android应用的动态调用链路,可以使用以下几种方法:
(1)使用调试工具:
(2)使用日志:
(3)使用性能分析工具:
(4)使用第三方工具:
(5)动态分析工具:
(6)字节码插桩:
每种方法都有其优缺点,选择合适的方法取决于你的具体需求和应用的复杂性。如果你只是想简单地查看某个功能的调用链路,使用调试工具或日志可能是最简单的选择;如果需要更深入的分析,Profiler或第三方工具可能更合适。
2,动态调用链路的使用
静态调用链路主要用来分析需求开发的影响范围,界定测试范围。动态调用链路主要和用例关联起来,需要知道哪些用例执行过程中,会调用哪些类或是函数,如下图所示:
通过获取用例的动态调用链路后,可以做如下事情:
- 过滤用例执行中的前置和后置步骤,减少用例关联的代码;
- 通过路径覆盖,推荐用例,用最小的用例集来覆盖最大的功能面;
- 用例执行失败,问题定位与修复。
Android App的动态调用链路采取插桩方式进行记录,由于jacoco Android插件没有开源,可以借助于服务端的jacoco来开发新的插件来实现,主要流程如下:
一,Trace插件开发
1,保存类函数对应关系
借助于jacoco插件的核心功能,对项目代码进行插桩,对每一个类和函数进行插桩,记录类的classid, methodid,执行次序和执行时间。插桩的过程中,将classid, 类名,methodid,函数名与参数等信息记录到class-method-map.txt文件中,打包的时候会将文件生成保存到工作目录中。
public class JacocoPlugin extends Transform implements Plugin<Project> {.....@Override
public void transform(TransformInvocation transformInvocation)throws TransformException, InterruptedException, IOException {super.transform(transformInvocation);System.out.println("AutoTest " + project.getName() + "," + project.getDisplayName() + "," + project.getPath());System.out.println("--------------------------");long start = System.currentTimeMillis();long copyCost = 0;long instrumentCost = 0;long copyDirCost = 0;Collection<TransformInput> inputs = transformInvocation.getInputs();TransformOutputProvider outputProvider = transformInvocation.getOutputProvider();for (TransformInput input : inputs) {//对项目中的jar包进行处理for (JarInput jarInput : input.getJarInputs()) {String jarName = jarInput.getName();File dest = outputProvider.getContentLocation(jarName,jarInput.getContentTypes(), jarInput.getScopes(), Format.JAR);//暂时不对app应用引用的jar包进行注入,防止因引用包造成二次注入 2024013if (filterJar(jarInput, sKwaiTestConfig) && project.getPlugins().hasPlugin("com.android.library")) {System.out.println("process jar is:" + jarName);System.out.println("process jar abspath is :" + jarInput.getFile().getAbsolutePath());sKwaiTestConfig.classJars.add(jarInput.getFile().getAbsolutePath());long tStart = System.currentTimeMillis();transformJar(jarInput, dest, jarName);long tEnd = System.currentTimeMillis();instrumentCost += (tEnd - tStart);} else {long cStart = System.currentTimeMillis();FileUtils.copyFile(jarInput.getFile(), dest);long cEnd = System.currentTimeMillis();copyCost += (cEnd - cStart);System.out.println("App Project " + project.getName() + "," + project.getDisplayName() + "," + project.getPath() + " not transform jar files!");}//System.out.println("transform jar的位置:"+dest.getAbsolutePath());}long dStart = System.currentTimeMillis();for (DirectoryInput directoryInput : input.getDirectoryInputs()) {File dest = outputProvider.getContentLocation(directoryInput.getName(),directoryInput.getContentTypes(), directoryInput.getScopes(), Format.DIRECTORY);if (filterDir(directoryInput, sKwaiTestConfig)) {String relatePath = directoryInput.getFile().getAbsolutePath();System.out.println("process dir file is:" + relatePath);sKwaiTestConfig.classDirs.add(relatePath);Instrumenter instrumenter = new Instrumenter(new OfflineInstrumentationAccessGenerator());transformDirectory(directoryInput.getFile(), dest, relatePath, instrumenter);} else {FileUtils.copyDirectory(directoryInput.getFile(), dest);}//System.out.println("transform 类的位置:" + dest.getAbsolutePath());}long dEnd = System.currentTimeMillis();copyDirCost = dEnd - dStart;}if (FLAG.decrementAndGet() == 0) {if (!TraceMethodVisitor.sMap.isEmpty()) {Utils.writeTraceMap(sTraceMapPath, TraceMethodVisitor.sMap);sKwaiTestConfig.customTraceMapPath = sTraceMapPath;//清除早期的trac数据TraceMethodVisitor.sMap.clear();} else {System.out.println("TraceMethodVisitor 为空!");}String configStr = (new Gson()).toJson(sKwaiTestConfig);Utils.writeKwaiTestFile(sKwaiTestConfigPath, configStr);System.out.println("Auto test jacoco writeKwaiTestFile");}long end = System.currentTimeMillis();System.out.println("---------------Auto test jacoco transform end-----------");System.out.println("Auto test jacoco copy jar cost:" + copyCost + "ms");System.out.println("Auto test jacoco copy dir cost:" + copyDirCost + "ms");System.out.println("Auto test jacoco instrument cost:" + instrumentCost + "ms");System.out.println("Auto test jacoco transform cost:" + (end - start) / 1000 + "s");System.out.println("---------执行 transform---------------");
}
.....
}
2,记录用例执行路径
在类函数中添加记录用例执行路径的操作,如:新建CSTraceHelper类
public class CSTraceHelper {....private Thread sConsumer = new Thread(() -> {if (sFirstInit) {sFirstInit = false;} else {return;}if (sStoragePath == null) {return;}for (; ; ) {flushTraceData();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});public static void flushTraceData() {if (sStoragePath != null && (!sKDSStore.isEmpty() || !sNativeStore.isEmpty())) {appendDataToFile();}
}
/**
将trace信息写入文件
**/
private static void appendDataToFile() {synchronized (sNativeStore) {FileWriter fileWriter = null;BufferedWriter bw = null;try {File dataDir = new File(sStoragePath);if (!dataDir.exists()) {dataDir.mkdirs();}File dataFile = new File(dataDir, TRACE_FILE_NAME);if (!dataFile.exists()) {dataFile.createNewFile();}Log.d(TAG, "Trace文件:" + dataFile.getAbsolutePath());fileWriter = new FileWriter(dataFile, true);bw = new BufferedWriter(fileWriter);Long value = sNativeStore.poll();HashMap<String, TraceDataSimple> map = new HashMap<>();while (value != null) {// 从 long 值中恢复三个 int 值int classId = (int) (value >> 42);int methodId = (int) ((value >> 21) & 0x1FFFFF);int line = (int) (value & 0x1FFFFF);//Log.d(TAG,"appendDataToFile cid:"+classId+",mId:"+methodId+",line:"+line+",value="+value);String key = classId + "" + methodId;if (map.containsKey(key)) {map.get(key).lines.add(String.valueOf(line));} else {TraceDataSimple method = new TraceDataSimple();method.tName = "t";method.timeMillis = System.currentTimeMillis();method.cid = classId;method.mid = methodId;method.lines.add(String.valueOf(line));map.put(key, method);}value = sNativeStore.poll();}Iterator<Map.Entry<String, TraceDataSimple>> it = map.entrySet().iterator();while (it.hasNext()) {bw.write(it.next().getValue().toSimpleString());}bw.flush();} catch (IOException e) {Log.d(TAG, "appendDataToFile catch error:" + e.getMessage());e.printStackTrace();} finally {try {if (bw != null) {bw.close();}if (fileWriter != null) {fileWriter.close();}} catch (IOException e) {Log.d(TAG, "appendDataToFile finally error:" + e.getMessage());e.printStackTrace();}}Log.d(TAG,"Trace 数据写入完成:"+sStoragePath);}
}
/*** 重新注入项目* @param cId 类ID* @param mId 方法ID* @param line 行号*/
public static void injectTcEp(long cId, int mId, int line) {// Log.d(TAG,"sStoragePath="+sStoragePath+",sNeedInject="+sNeedInject);if (sStoragePath != null && sNeedInject) {// 将三个 int 值存储到一个 long 值中long value = ((long) cId << 42) | ((long) mId << 21) | (long) line;Log.d(TAG,"Inject cid:"+cId+",mId:"+mId+",line:"+line+",value="+value);sNativeStore.offer(value);}
}
......
}
同时在Android插件JacocoPlugin的TraceMethodVisitor类中添加给函数注入记录trace信息的操作
public class TraceMethodVisitor extends MethodVisitor {......private void injectMethod() {mv.visitLdcInsn(classID);mv.visitLdcInsn(id);mv.visitLdcInsn(line);mv.visitMethodInsn(INVOKESTATIC, "com/kwai/test/core/CSTraceHelper", "injectTcEp","(JII)V", false);
}
.......
}
执行打包命令
./gradlew upload
将会在指定的目录下,生成新插件的所有包。
二,新插件使用
在要关联用例的App中,添加新的jacoco插件,打包后就会自动对函数中的类,函数进行插桩。如果想同时采集覆盖率数据,控制好相关的开关即可。打包完成后做如下操作:
1,将打包后的class文件上传到指定位置,如精准测试平台,在生成覆盖率报告时候要用到。
2,将生成的class-method-map.txt文件上传到精准测试平台,解析用例与代码的关联关系时需要查询类和函数信息。
C: com.gavin.asmdemo.MainActivity 1 com/gavin/asmdemo/MainActivity.java
M: onCreate(android.os.Bundle) 0 12
M: toSecond(android.view.View) 1 18
M: toThrid(android.view.View) 2 24
M: onStop() 3 8
M: onStart() 4 8
C: com.gavin.asmdemo.ThridActivity 2 com/gavin/asmdemo/ThridActivity.java
M: onCreate(android.os.Bundle) 0 14
M: toShow(android.view.View) 1 19
M: thToIndexPage(android.view.View) 2 26
M: onStop() 3 10
M: onStart() 4 10
C: com.gavin.asmdemo.BaseActivity 3 com/gavin/asmdemo/BaseActivity.java
M: onCreate(android.os.Bundle) 0 17
M: onStart() 1 24
M: onStop() 2 32
C: com.gavin.asmdemo.SecondActivity 4 com/gavin/asmdemo/SecondActivity.java
M: onCreate(android.os.Bundle) 0 11
M: seToThrid(android.view.View) 1 16
M: toIndexPage(android.view.View) 2 21
M: onStop() 3 7
M: onStart() 4 7
3,在测试需求时,根据需求,上传覆盖率,trace信息文件。
4,生成覆盖率报告时,解析trace信息,记录追溯关系。
5,根据业务特点,过滤一下trace信息,就可以拿到用例与代码的精准关联关系。
相关文章:
第3.2.3节 Android动态调用链路的获取
3.2.3 Android App动态调用链路 在Android应用中,动态调用链路指的是应用在运行时的调用路径。这通常涉及到方法调用的顺序和调用关系,特别是在应用的复杂逻辑中,理解这些调用链路对于调试和性能优化非常重要。 1,动态调用链路获…...
【Android】文件分块上传尝试
【Android】文件分块上传 在完成一个项目时,遇到了需要上传长视频的场景,尽管可以手动限制视频清晰度和视频的码率帧率,但仍然避免不了视频大小过大的问题,且由于服务器原因,网络不太稳定。这个时候想到了可以将文件分…...
大模型中的三角位置编码实现
Transformer中嵌入表示 位置编码的实现 import torch import math from torch import nn# 词嵌入位置编码实现 class EmbeddingWithPosition(nn.Module):"""vocab_size:词表大小emb_size: 词向量维度seq_max_len: 句子最大长度 (人为设定,例如GPT2…...
深入详解人工智能数学基础——微积分中的自动微分及其在PyTorch中的实现原理
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...
【Linux学习笔记】系统文件IO之重定向原理分析
【Linux学习笔记】系统文件IO之重定向原理分析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】系统文件IO之重定向原理分析前言一. 系统文件I/01.1 一种传递标志位的方法1.2 hello.c写文件:1.3 he…...
《React Native与Flutter:社交应用中用户行为分析与埋点统计的深度剖析》
React Native与Flutter作为两款备受瞩目的跨平台开发框架,正深刻地影响着应用的构建方式。当聚焦于用户行为分析与埋点统计时,它们各自展现出独特的策略与工具选择,这些差异和共性不仅关乎开发效率,更与社交应用能否精准把握用户需…...
Cesium高度参考系统
🌍 Cesium高度参考系统趣味探索 🚀 高度参考系统形象比喻 想象一下,你正在玩一个积木游戏: CLAMP_TO_GROUND:积木被"强力胶水"粘在桌面上,无论桌面高低起伏如何 RELATIVE_TO_GROUND:积木放在"微型支架"上,始终保持离桌面固定距离 NONE:积木漂…...
海纳思(Hi3798MV300)机顶盒遇到海思摄像头
海纳思机顶盒遇到海思摄像头,正好家里有个海思Hi3516的摄像头模组开发板,结合机顶盒来做个录像。 准备工作 海纳斯机顶盒摄像机模组两根网线、两个电源、路由器一块64G固态硬盘 摄像机模组和机顶盒都接入路由器的LAN口,确保网络正常通信。 …...
[python] 类
一 介绍 具有相同属性和行为的事物的通称,是一个抽象的概念 三要素: 类名,属性,方法 格式: class 类名: 代码块 class Pepole:name "stitchcool"def getname(self):return self.name 1.1 创建对象(实例化) 格式: 对象名 类名() p1 Pepole()…...
Python中的事件循环是什么?事件是怎么个事件?循环是怎么个循环
在Python异步编程中,事件循环(Event Loop)是核心机制,它通过单线程实现高效的任务调度和I/O并发处理。本文将从事件的定义、循环的运行逻辑以及具体实现原理三个维度展开分析。 一、事件循环的本质:协程与任务的调度器…...
单片机-STM32部分:11、ADC
飞书文档https://x509p6c8to.feishu.cn/wiki/OclUwlkifiRKR2k6iLbczn5tn8g STM32的ADC是一种逐次逼近型模拟数字转换器。 是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。 逐次逼近型ADC的原理图下: STM32f103系列有3个ADC,精度为12…...
【含文档+PPT+源码】基于微信小程序的社区便民防诈宣传系统设计与实现
项目介绍 本课程演示的是一款基于微信小程序的社区便民防诈宣传系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…...
Laravel 安全:批量赋值 fillable 与 guarded
Laravel 的模型中有两个 protected 字段 fillable 与 guarded,注意:必须是 protected 以上开放程度。 我们经常通过提交表单进行数据的增删改,为了方便的进行数据批量修改操作 Laravel 提供了批量赋值机制: 假如我们想要在数据库…...
[杂谈随感-13]: 人的睡眠,如何布置床的位置比较有安全?感?
睡眠环境中的床位布置直接影响心理安全感与睡眠质量,需从空间防御性、人体感知机制及环境心理学多维度综合设计。 以下基于科学原理与实践案例,系统解析床位布置的核心策略: 一、空间防御性布局:构建心理安全边界 背靠实体墙&a…...
协议路由与路由协议
协议路由”和“路由协议”听起来相似,但其实是两个完全不同的网络概念。下面我来分别解释: 一、协议路由(Policy-Based Routing,PBR) ✅ 定义: 协议路由是指 根据预设策略(策略路由࿰…...
内网穿透系列三:开源本地服务公网映射工具 tunnelmole
以下是对 tunnelmole 简要介绍: tunnelmole 是一款开源的内网穿透工具,一行命令就能把本地http服务映射成公网可访问的链接提供公共免费的网络服务,直接下载运行命令即可使用,也支持自行配置搭建私有客户端、服务端参考开源地址&…...
发行基础:本地化BUG导致审核失败
1、早上收到邮件,Steam客服说本地化功能找不到,无法切换多国语言,所以正式版V1.0程序未通过。 大脑瞬间有要爆炸的感觉,测试后发现V1以及demo都存在同样问题。 属于重大BUG,需要立即解决,最高优先级。 2、…...
QB/T 1649-2024 聚苯乙烯泡沫塑料包装材料检测
聚苯乙烯泡沫塑料包装材料是指以可发行聚苯乙烯珠粒为原料,经加热预发泡后在模具中加热成型而制得,具有闭孔结构的聚苯乙烯泡沫塑料包装材料。 QB/T 1649-2024聚苯乙烯泡沫塑料包装材料检测项目: 测试项目 测试标准 外观 QB/T 1649 气味…...
【Day 24】HarmonyOS端云一体化开发:云函数
一、端云开发核心架构 1. 技术栈对比 维度传统开发模式HarmonyOS端云一体化方案优势 开发工具需独立配置前后端环境DevEco Studio统一开发端云代码降低60%环境搭建时间部署流程手动部署服务器与数据库一键部署至AGC Serverless免运维,自动弹性伸缩通信安全需自行实…...
大模型(LLMs)强化学习——RLHF及其变种
大模型(LLMs)强化学习——RLHF及其变种面 一、介绍一下 LLM的经典预训练Pipeline?二、预训练(Pre-training)篇 具体介绍一下 预训练(Pre-training)?三、有监督微调(Sup…...
20250510解决NanoPi NEO core开发板在Ubuntu core22.04.3系统下适配移远的4G模块EC200A-CN的问题
1、h3-eflasher-friendlycore-jammy-4.14-armhf-20250402.img.gz 在WIN10下使用7-ZIP解压缩/ubuntu20.04下使用tar 2、Win32DiskImager.exe 写如32GB的TF卡。【以管理员身份运行】 3、TF卡如果已经做过会有3个磁盘分区,可以使用SD Card Formatter/SDCardFormatterv5…...
WinCC V7.2到V8.0与S71200/1500系列连接通讯教程以及避坑点
声明:WinCC与PLC连接详细指导与注意避坑点,部分图片和描述来源于网络,如有冒犯,请联系本人删除。 1.环境介绍 自WinCC V7.2版本起,软件新增加了 "SIMATIC S7-1200, S7-1500 Channel"通道,用于WinCC与 S7-1…...
WPF 性能 UI 虚拟化 软件开发人员的思考
UI 虚拟化是 WPF 采用的一项技术,框架会仅创建用户可见的 UI 元素。例如,如果 ListView 中有 1000 个文本块控件,但您只能查看其中的 10 个,那么 VisualTree 中也只会显示 10 个文本块。向下滚动时,不再可见的元素将被…...
服务器综合实验(实战详解)
该文章的目录部分 实验内容 实验完成步骤 虚拟机准备 配置两个虚拟机的本地仓库 虚拟机A: 虚拟机B: 配置SSH公钥互信 虚拟机A: 编辑 虚拟机B: 提供基于bind的DNS服务 虚拟机A: 项目需求1: …...
【动态导通电阻】软硬开关下GaN器件的动态RDSON
2019年,浙江大学的Rui Li、Xinke Wu等人基于双脉冲和多脉冲测试方法,研究了在硬开关和软开关条件下商用氮化镓(GaN)功率器件的动态导通电阻(R DSON )特性。实验结果表明,不同GaN器件在硬开关和软开关条件下的动态R DSON 表现出不同的行为,这些行为受关断电压和频率的影…...
Java基础 5.10
1.方法重写课堂练习 package com.logic.override_; //编写一个Person类 包括属性/private(name, age) 构造器 方法say(返回自我介绍的字符串) //编写一个Student类 继承Person类 增加id score 属性/private 以及构造器 //定义say方法(返回自我介绍的信息) //在main中 分别创建…...
通信原理绪论
(I)信息量:第j条消息中包含的信息定义为:I(j) 消息是信息的表现形式 消息是信息的一种抽象和本质内容 消息中所含的信息量是该消息出现概率的函数,即 I I[P(x)] P(x)越小,I越…...
Maven 插件配置分层架构深度解析
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
jMeter压测环境部署JDK+Groovy+JMeter+Proto+IntelliJ IDEA
为确保 Groovy、JDK 和 JMeter 三者的版本兼容性,需遵循以下核心原则和步骤: 一、版本兼容性对照表 组件推荐版本范围关键兼容规则JDKJava 8/11/17 (LTS)- JMeter 5.6 支持 Java 11/17GroovyGroovy 3.0.7 或 4.0- Groovy 3.x 支持 Java 8-17 - Groovy 4…...
c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能
# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录。 # 财务管理系统功能描述 1.可以自行设置记账科目,做凭…...
深度解析 MySQL 与 Spring Boot 长耗时进程:从故障现象到根治方案(含 Tomcat 重启必要性分析)
一、典型故障现象与用户痛点 在高并发业务场景中,企业级 Spring Boot 应用常遇到以下连锁故障: 用户侧:网页访问超时、提交表单无响应,报错 “服务不可用”。运维侧:监控平台报警 “数据库连接池耗尽”,To…...
一种运动平台扫描雷达超分辨成像视场选择方法——论文阅读
一种运动平台扫描雷达超分辨成像视场选择方法 1. 专利的研究目标与意义1.1 研究目标1.2 实际意义2. 专利的创新方法与技术细节2.1 核心思路与流程2.1.1 方法流程图2.2 关键公式与模型2.2.1 回波卷积模型2.2.2 最大后验概率(MAP)估计2.2.3 统计约束模型2.2.4 迭代优化公式2.3 …...
【程序员AI入门:开发】11.从零构建智能问答引擎:LangChain + RAG 实战手册
1、技术选型 组件推荐方案说明文本嵌入模型sentence-transformers/all-MiniLM-L6-v2轻量级且效果较好的开源模型向量数据库FAISS高效的本地向量检索库大语言模型GPT-3.5/开源LLM(如ChatGLM3)根据资源选择云端或本地模型文档处理框架LangChain简化RAG流程…...
《深入理解Linux网络》笔记
《深入理解Linux网络》笔记 前言参考 前言 前段时间看了《深入理解Linux网络》这本书,虽然有些地方有以代码充篇幅的嫌疑,但总体来说还是值得一看的。在这里简单记录一下笔记,记录下对网络新的理解。 内核是如果接受网络包的? 如…...
【计算机视觉】优化MVSNet可微分代价体以提高深度估计精度的关键技术
优化MVSNet可微分代价体以提高深度估计精度的关键技术 1. 代价体基础理论与分析1.1 标准代价体构建1.2 关键问题诊断 2. 特征表示优化2.1 多尺度特征融合2.2 注意力增强匹配 3. 代价体构建优化3.1 自适应深度假设采样3.2 可微分聚合操作改进 4. 正则化与优化策略4.1 多尺度代价…...
致远A8V5-9.0安装包(包含信创版)【附百度网盘链接】
A8适用于中大型企业,基于"以人为中心"的产品理念,致力于为企业构建和完善“数字智能”的协同运营体系,以组织模型为基础,连接各项工作和业务,聚合信息、资源和能力,实现组织内和跨组织的高效协同…...
terminal 共享工具ttyd
ttyd 是一个非常轻量的工具,它可以将你的终端(如 bash)通过 Web 页面共享出去,适合教学、演示、远程协作等场景,而且 支持 macOS、ARM64、Linux 等平台。 ⸻ ✅ 一、ttyd 简介 • 将 shell 包装成 WebSocket 服务&am…...
右值引用的剖析
引入:为什么要有右值引用? 右值引用的存在,就是为了解决左值引用解决不了的问题! 左值引用的问题: 我们知道,左值引用在做参数和做返回值都可以提高效率;但是有时候,我们无法用左…...
MIT XV6 - 1.4 Lab: Xv6 and Unix utilities - find
接上文 MIT XV6 - 1.3 Lab: Xv6 and Unix utilities - primes find 继续实验,实验介绍和要求如下 (原文链接 译文链接) : Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution…...
PyTorch API 8 - 工具集、onnx、option、复数、DDP、量化、分布式 RPC、NeMo
文章目录 torch.nn.inittorch.nn.attention工具集子模块 torch.onnx概述基于 TorchDynamo 的 ONNX 导出器基于TorchScript的ONNX导出器贡献与开发 torch.optim如何使用优化器构建优化器每个参数的选项执行优化步骤optimizer.step()optimizer.step(closure) 基类算法如何调整学习…...
解决使用宝塔Linux部署前后端分离项目遇到的问题
问题一:访问域名转圈圈,显示404,403 没有解决跨域问题,在后端yml中设置content:/prod(生产环境),在前端.env文件中将http://127.0.0.1:8080/替换为公网IP,并在vite.conf…...
力扣top100 矩阵置零
开辟数组来标记元素为0的行和列,然后将对应的行和列的元素全部置为0; class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> l(m),r(n);for(int i …...
JavaScript基础-作用域概述
在学习JavaScript的过程中,理解其作用域(Scope)机制是至关重要的。它不仅影响变量的生命周期和可见性,还决定了代码执行期间如何查找变量值。本文将深入探讨JavaScript的作用域概念,包括全局作用域、函数作用域、块级作…...
【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施
【经验总结】Ubuntu 22.04.5 LTS 将内核从5.15.0-140 升级到6.8.0-60后纽曼无线网卡无法使用解决措施 问题现象定位过程问题根因解决方案将内核内核从6.8.0-60 降级到5.15.0-140。1、回滚内核版本2、解决重启系统,找不到选择内核版本的菜单问题3、将新版本的kernel卸…...
MQTT协议介绍
一、MQTT定义 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议ÿ…...
jetson orin nano super AI模型部署之路(五)tensorrt C++ api介绍
我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现,可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...
excel函数操作案例
需求分析1:学习时间与最终成绩之间的关系 问题:学习时间的长短是否对学生的最终成绩有显著影响? 操作步骤:选择"study_hours"和"final_grade"列完整数据,选择散点图 单击B,按住ctrl键…...
各种音频产品及场景总结
本文记录和总结各种音频产品以及音频场景,比如音箱、耳机、对讲机、录音笔、助听器、声卡等等。 蓝牙耳机 蓝牙耳机现在已经很普及了,主要功能就是连着手机等设备然后播放音频,所以,肯定要有扬声器模块;然后还可以接打…...
Java后端开发day46--多线程(二)
(以下内容全部来自上述课程) 多线程 1. Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题, 但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, 为了更清晰的表达如何加锁和释放锁,JDK5以…...
U盘制作系统盘(含U盘恢复)
✅ 准备工作 1. 一个至少 8GB 容量的 U 盘 注意:U 盘将被格式化,请提前备份数据。 2. 一台可以联网的 Windows 电脑 📥 下载官方制作工具(推荐) 1. 打开微软官网下载页面: 👉 Windows 11 下载…...