使用ADB工具分析Android应用崩溃原因:以闪动校园为例
使用adb工具分析模拟器或手机里app出错原因以闪动校园为例
使用ADB工具分析Android应用崩溃原因:以闪动校园为例
前言
应用崩溃是移动开发中常见的问题,尤其在复杂的Android生态系统中,找出崩溃原因可能十分棘手。本文将以流行的校园应用"闪动校园"为例,详细介绍如何利用Android Debug Bridge (ADB)工具分析应用崩溃原因,从而快速定位和解决问题。
1. ADB工具简介
Android Debug Bridge (ADB)是Android SDK中的一个强大命令行工具,它允许开发者与连接的Android设备或模拟器进行通信。通过ADB,我们可以:
- 安装/卸载应用
- 传输文件
- 运行shell命令
- 收集日志信息
- 调试应用
ADB的基本架构包括三个组件:
客户端 ⟷ 服务器 ⟷ 守护进程(adbd)
(电脑) (电脑) (设备)
2. 准备工作
2.1 安装ADB工具
如果你已经安装了Android Studio,ADB工具已包含在SDK中。你也可以单独下载平台工具:
# Windows用户
# 下载platform-tools后,添加到环境变量Path中
echo %PATH%
setx PATH "%PATH%;C:\path\to\platform-tools"# Linux/Mac用户
echo $PATH
export PATH=$PATH:/path/to/platform-tools
2.2 验证设备连接
首先,我们需要确认设备已经正确连接并被识别:
adb devices
正常输出应该如下所示:
List of devices attached
emulator-5554 device # 模拟器
HSKW7N8012345 device # 物理设备
如果设备显示为unauthorized
,需要在设备上确认USB调试授权。
2.3 开启开发者选项
在Android设备上:
- 进入
设置 > 关于手机
- 连续点击
版本号
7次,开启开发者选项 - 返回设置页面,进入
开发者选项
- 开启
USB调试
3. 收集应用崩溃日志
3.1 清除现有日志
在开始分析前,最好先清除现有的日志,以避免干扰:
adb logcat -c
3.2 查找应用包名
要针对特定应用过滤日志,我们需要知道其包名。有几种方法可以找到包名:
方法1:通过应用名称查找
adb shell pm list packages | findstr "闪动"
可能的输出:
package:com.huachenjie.shandong_school
方法2:获取当前运行的应用包名
adb shell dumpsys window | findstr "mCurrentFocus"
方法3:编程方式获取包名
// 在应用代码中
String packageName = getApplicationContext().getPackageName();
Log.d("AppInfo", "Package name: " + packageName);
3.3 运行应用并收集崩溃日志
现在我们知道闪动校园的包名是com.huachenjie.shandong_school
,可以针对性地收集日志:
# 过滤特定应用的日志
adb logcat | findstr "com.huachenjie.shandong_school"# 或者只查看错误级别的日志
adb logcat *:E
让应用崩溃,然后查看日志输出。为了方便分析,我们可以将日志保存到文件:
# 在Windows下保存日志到桌面
adb logcat > C:\Users\用户名\Desktop\crash_log.txt
4. 日志分析与错误定位
4.1 理解Logcat输出格式
Logcat的基本输出格式如下:
日期 时间 PID-TID/包名 优先级/标签: 消息
例如:
05-15 14:30:22.123 1234-5678/com.huachenjie.shandong_school E/AndroidRuntime: FATAL EXCEPTION: main
其中:
05-15 14:30:22.123
:日期和时间1234-5678
:进程ID和线程IDcom.huachenjie.shandong_school
:包名E
:错误级别(Error)AndroidRuntime
:日志标签FATAL EXCEPTION: main
:错误消息
4.2 常见的崩溃类型及分析
空指针异常 (NullPointerException)
E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.huachenjie.shandong_school, PID: 12345java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.huachenjie.shandong_school.model.User.getName()' on a null object referenceat com.huachenjie.shandong_school.ui.ProfileActivity.updateUI(ProfileActivity.java:120)at com.huachenjie.shandong_school.ui.ProfileActivity.onCreate(ProfileActivity.java:65)
分析:在ProfileActivity.java
的第120行,尝试调用user.getName()
,但user
对象为null。
解决方案:在调用前添加空值检查:
if (user != null) {String name = user.getName();// 处理name
} else {// 处理user为null的情况Log.e("ProfileActivity", "User object is null");// 可能需要重新获取用户数据或显示错误信息
}
数组索引越界 (ArrayIndexOutOfBoundsException)
E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.huachenjie.shandong_school, PID: 12345java.lang.ArrayIndexOutOfBoundsException: length=5; index=5at com.huachenjie.shandong_school.util.DataProcessor.processData(DataProcessor.java:78)
分析:在DataProcessor.java
的第78行,尝试访问数组索引5,但数组长度只有5(索引应为0-4)。
解决方案:确保索引在有效范围内:
if (index < array.length) {// 安全地访问array[index]
} else {Log.e("DataProcessor", "Index out of bounds: " + index + " for array length: " + array.length);
}
类型转换异常 (ClassCastException)
E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.huachenjie.shandong_school, PID: 12345java.lang.ClassCastException: com.huachenjie.shandong_school.model.Staff cannot be cast to com.huachenjie.shandong_school.model.Studentat com.huachenjie.shandong_school.ui.CourseActivity.displayStudentInfo(CourseActivity.java:156)
分析:在CourseActivity.java
的第156行,尝试将Staff
对象强制转换为Student
对象。
解决方案:使用instanceof检查类型再转换:
if (user instanceof Student) {Student student = (Student) user;// 处理学生对象
} else if (user instanceof Staff) {Staff staff = (Staff) user;// 处理职工对象
} else {Log.e("CourseActivity", "Unknown user type: " + user.getClass().getName());
}
4.3 ANR (Application Not Responding) 分析
除了崩溃,应用还可能出现ANR问题。我们可以通过以下命令收集ANR信息:
adb pull /data/anr/traces.txt ./anr_analysis.txt
典型的ANR日志示例:
----- pid 12345 at 2023-05-15 14:30:22 -----
Cmd line: com.huachenjie.shandong_schoolDALVIK THREADS (40):
"main" prio=5 tid=1 Blocked| group="main" sCount=1 dsCount=0 obj=0x73467890 self=0x7f98765430| sysTid=12345 nice=0 cgrp=default sched=0/0 handle=0x7f87654320| state=S schedstat=( 0 0 0 ) utm=1234 stm=567 core=0 HZ=100| stack=0x7ff1234000-0x7ff1256000 stackSize=8MB| held mutexes=at com.huachenjie.shandong_school.database.DatabaseHelper.getStudentData(DatabaseHelper.java:230)- waiting to lock <0x87654320> (a java.lang.Object) held by thread 23at com.huachenjie.shandong_school.ui.MainActivity$loadData(MainActivity.java:178)at com.huachenjie.shandong_school.ui.MainActivity.onCreate(MainActivity.java:75)
分析:主线程在等待一个被线程23持有的锁,这导致了UI线程阻塞,引发ANR。
解决方案:避免在主线程进行数据库操作,应该使用异步处理:
// 不要在主线程中直接操作数据库
new Thread(new Runnable() {@Overridepublic void run() {final List<Student> students = databaseHelper.getStudentData();// 使用Handler或runOnUiThread更新UIrunOnUiThread(new Runnable() {@Overridepublic void run() {updateUI(students);}});}
}).start();// 或使用AsyncTask(已弃用但仍常见)
private class LoadDataTask extends AsyncTask<Void, Void, List<Student>> {@Overrideprotected List<Student> doInBackground(Void... params) {return databaseHelper.getStudentData();}@Overrideprotected void onPostExecute(List<Student> students) {updateUI(students);}
}// 较新的选择是使用协程(Kotlin)
lifecycleScope.launch(Dispatchers.IO) {val students = databaseHelper.getStudentData()withContext(Dispatchers.Main) {updateUI(students)}
}
5. 高级调试技巧
5.1 使用自定义过滤器
可以同时使用多个过滤条件优化日志查看体验:
# 查看特定应用的特定标签
adb logcat -v threadtime ActivityManager:I MyApp:D *:S# 使用正则表达式过滤
adb logcat | findstr -r "Exception|Error|FATAL"
5.2 利用Android Studio分析崩溃
除了命令行工具,Android Studio也提供了强大的日志分析功能:
- 在Android Studio中,打开Logcat窗口
- 连接设备并选择应用进程
- 使用过滤器和搜索功能定位错误
5.3 使用自定义日志记录器
在闪动校园应用中实现一个自定义的日志记录器,可以大大提高调试效率:
public class Logger {private static final String TAG = "闪动校园";private static final boolean DEBUG = BuildConfig.DEBUG;public static void d(String message) {if (DEBUG) {Log.d(TAG, buildLogMsg(message));}}public static void e(String message, Throwable e) {Log.e(TAG, buildLogMsg(message), e);// 在开发版本中,可以将错误信息保存到文件if (DEBUG) {saveErrorToFile(message, e);}}private static String buildLogMsg(String message) {StackTraceElement element = Thread.currentThread().getStackTrace()[4];String className = element.getClassName();className = className.substring(className.lastIndexOf('.') + 1);return String.format("%s.%s(%s:%d): %s",className, element.getMethodName(),element.getFileName(),element.getLineNumber(),message);}private static void saveErrorToFile(String message, Throwable e) {try {File logDir = new File(Environment.getExternalStorageDirectory(), "闪动校园/logs");if (!logDir.exists()) {logDir.mkdirs();}SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.CHINA);String fileName = "error-" + sdf.format(new Date()) + ".txt";File logFile = new File(logDir, fileName);PrintWriter writer = new PrintWriter(new FileWriter(logFile));writer.println("错误信息: " + message);writer.println("时间: " + new Date().toString());writer.println("\n堆栈跟踪:");e.printStackTrace(writer);writer.close();} catch (Exception ex) {Log.e(TAG, "保存错误日志失败", ex);}}
}
在应用代码中使用:
try {// 可能会抛出异常的代码User user = getUserFromServer();processUserData(user);
} catch (Exception e) {Logger.e("获取用户数据失败", e);// 处理错误,例如显示友好的错误消息showErrorDialog("无法连接到服务器,请稍后再试");
}
5.4 监控应用性能
除了崩溃分析,我们还可以使用ADB监控应用性能:
# 监控内存使用
adb shell dumpsys meminfo com.huachenjie.shandong_school# 监控CPU使用
adb shell top -n 1 | findstr "com.huachenjie.shandong_school"# 监控电池使用
adb shell dumpsys batterystats com.huachenjie.shandong_school
6. 自动化崩溃分析
6.1 使用脚本自动收集和分析日志
可以创建批处理脚本或Shell脚本自动化日志收集过程:
Windows批处理脚本 (collect_logs.bat):
@echo off
echo 清除现有日志...
adb logcat -cecho 开始收集日志,按Ctrl+C停止...
adb logcat -v threadtime > "%USERPROFILE%\Desktop\app_log_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"echo 日志已保存到桌面。
Linux/Mac Shell脚本 (collect_logs.sh):
#!/bin/bash
echo "清除现有日志..."
adb logcat -cecho "开始收集日志,按Ctrl+C停止..."
adb logcat -v threadtime > ~/Desktop/app_log_$(date +%Y%m%d_%H%M%S).txtecho "日志已保存到桌面。"
6.2 集成Crash报告工具
对于生产环境,建议集成专业的崩溃报告工具,如Firebase Crashlytics:
// 在app/build.gradle中添加依赖
dependencies {// Firebase Crashlyticsimplementation 'com.google.firebase:firebase-crashlytics:18.3.7'implementation 'com.google.firebase:firebase-analytics:21.3.0'
}
初始化代码:
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 初始化FirebaseFirebaseApp.initializeApp(this);// 开发环境下禁用崩溃报告if (BuildConfig.DEBUG) {FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false);}// 设置用户信息以便更好地分析崩溃try {User currentUser = UserManager.getInstance().getCurrentUser();if (currentUser != null) {FirebaseCrashlytics.getInstance().setUserId(currentUser.getId());// 添加自定义键值对FirebaseCrashlytics.getInstance().setCustomKey("user_type", currentUser.getType());FirebaseCrashlytics.getInstance().setCustomKey("school_id", currentUser.getSchoolId());}} catch (Exception e) {Log.e("Application", "设置用户信息失败", e);}}
}
7. 闪动校园案例分析
以下是一个实际案例,说明如何使用ADB分析闪动校园应用的一个具体崩溃问题:
问题描述
用户报告在打开"课程表"页面时应用崩溃。
分析过程
步骤1: 收集崩溃日志
adb logcat -c
adb logcat | findstr "com.huachenjie.shandong_school" > crash_log.txt
步骤2: 日志分析
崩溃日志示例:
05-15 10:23:45.678 12345-12345/com.huachenjie.shandong_school E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.huachenjie.shandong_school, PID: 12345java.lang.IllegalStateException: Could not execute method for android:onClickat androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)...Caused by: java.lang.reflect.InvocationTargetExceptionat java.lang.reflect.Method.invoke(Native Method)...Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.List<com.huachenjie.shandong_school.model.Course> com.huachenjie.shandong_school.api.CourseService.getCourses(java.lang.String)' on a null object referenceat com.huachenjie.shandong_school.ui.CourseActivity.loadCourses(CourseActivity.java:145)at com.huachenjie.shandong_school.ui.CourseActivity.onButtonClick(CourseActivity.java:98)
步骤3: 定位根本原因
分析表明在CourseActivity.java
第145行,应用尝试调用courseService.getCourses(semesterId)
,但courseService
对象为null。
步骤4: 创建修复方案
// 原始代码(有问题)
private void loadCourses(String semesterId) {List<Course> courses = courseService.getCourses(semesterId);displayCourses(courses);
}// 修复后的代码
private void loadCourses(String semesterId) {if (courseService == null) {// 懒加载初始化服务courseService = ServiceLocator.getCourseService();// 如果仍然为null,优雅处理if (courseService == null) {Log.e("CourseActivity", "CourseService初始化失败");Toast.makeText(this, "无法加载课程数据,请重启应用", Toast.LENGTH_LONG).show();return;}}try {List<Course> courses = courseService.getCourses(semesterId);if (courses != null) {displayCourses(courses);} else {showEmptyCourseView();}} catch (Exception e) {Logger.e("加载课程数据失败", e);Toast.makeText(this, "加载课程数据失败: " + e.getMessage(), Toast.LENGTH_LONG).show();showErrorView();}
}
8. 总结
通过本文,我们详细介绍了如何使用ADB工具分析Android应用崩溃问题,以闪动校园应用为例。主要内容包括:
- ADB基础知识与设置
- 收集应用崩溃日志的方法
- 常见崩溃类型分析与解决
- ANR问题的识别与处理
- 高级调试技巧
- 自动化崩溃分析工具
- 实际案例分析与解决
掌握这些技能将帮助开发者更快地定位和解决应用问题,提高应用稳定性和用户体验。
参考资料
风车模拟器相关
相关文章:
使用ADB工具分析Android应用崩溃原因:以闪动校园为例
使用adb工具分析模拟器或手机里app出错原因以闪动校园为例 使用ADB工具分析Android应用崩溃原因:以闪动校园为例 前言 应用崩溃是移动开发中常见的问题,尤其在复杂的Android生态系统中,找出崩溃原因可能十分棘手。本文将以流行的校园应用&q…...
C++双链表介绍及实现
双链表详解 1. 基本概念 双链表(双向链表) 是一种链式数据结构,每个节点包含两个指针: 前驱指针(pre):指向直接前驱节点后继指针(next):指向直接…...
推流265视频,网页如何支持显示265的webrtc
科技发展真快,以前在网页上(一般指谷歌浏览器),要显示265的视频流,都是很鸡肋的办法,要么转码,要么用很慢的hls,体验非常不好,而今谷歌官方最新的浏览器已经支持265的web…...
linux多线(进)程编程——(6)共享内存
前言 话说进程君的儿子经过父亲点播后就开始闭关,它想要开发出一种全新的传音神通。他想,如果两个人的大脑生长到了一起,那不是就可以直接知道对方在想什么了吗,这样不是可以避免通过语言传递照成的浪费吗? 下面就是它…...
Allpairs工具下载及操作流程(联动Deepseek)
目录 一、Allpairs工具下载及操作流程二、Allpairs工具使用易错问题 Allpairs工具产生的原因 Allpairs工具的产生源于软件测试领域对高效组合测试方法的迫切需求,其核心目标是解决传统测试方法在多因素组合场景下用例数量爆炸和测试效率低下的问题。 一、Allpairs工…...
wkhtmltopdf 实现批量对网页转为图片的好工具,快速实现大量卡片制作
欢迎来到涛涛聊AI 1、需求痛点 在学习当中经常遇到一些知识点,想和大家分享。但只有文本形式,很多人不愿意去阅读,也看不到重点。 如果自己去单独设计页面版式,又太浪费时间。那就想着有没有一种方法,可以把一个知识…...
case客户续保预测中用到的特征工程、回归分析和决策树分析的总结
文章目录 [toc]1. 回归分析概述1.1 基本概念1.2 与分类的区别 2. 常见回归算法2.1 线性回归2.2 决策树回归2.3 逻辑回归(Logistic Regression)2.3 其他算法补充:通俗版:决策树 vs 随机森林🌳 决策树:像玩「…...
最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu)
最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu) 摘要: FFmpeg是一个强大的开源工具,广泛应用于音视频处理,支持格式转换、视频剪辑、流媒体推送…...
vue webSocket
vue webSocket 一、vue2 webSocketwebSocket.jsvue2 二、vue3 webSocket tswebSocket.tsvue3 一、vue2 webSocket webSocket.js export default {data() {return {websock: null, // 建立的连接,存websocket实例化的lockReconnect: false, // 是否真正建立连接…...
Flask+Influxdb+grafna构建电脑性能实时监控系统
Influx下载地址,这里下载了以下版本influxdb-1.8.5_windows_amd64.zip 运行前需要先启动Influx数据库: 管理员方式运行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf,以influxdb.conf配置文件启动数…...
【golang/jsonrpc】go-ethereum中json rpc初步使用(websocket版本)
说在前面 操作系统:win11 wsl2go-ethereum版本:1.15.8 关于json-rpc 官网 server 定义方法type CalculatorService struct{}func (s *CalculatorService) Add(a, b int) int {return a b }func (s *CalculatorService) Div(a, b int) (int, error) {…...
【C++】 —— 笔试刷题day_15
刷题day_15,继续加油!!! 一、平方数 题目解析 题目给出一个数,让我们找到离它最近的一个平方数,然后输出即可。 算法思路 这道题总体来说还是非常简单的。 这里先来看一种思路,就是从1开始找…...
网站备案详解
当小型网站开发完毕具备上线条件后,需要完成域名映射与相关备案,才能合法运维。就像婴儿出生后,要开出生证明并去派出所上户口一样,备案后就是有“户口”的网站啦。具体效果见:CodingLife 一:服务器部署 …...
IPV6应用最后的钥匙:DDNS-GO 动态域名解析工具上手指南--家庭云计算专家
DDNS-GO作为一款轻量级开源工具,其IPv6功能通过自动化动态域名解析,有效解决了家庭网络因运营商动态分配IPv6地址导致的访问难题。用户无需复杂配置,即可将冗长的IPv6地址绑定至易记域名,并实时同步IP变化,显著提升了N…...
ubuntu 系统安装Mysql
安装 mysql sudo apt update sudo apt install mysql-server 启动服务 sudo systemctl start mysql 设置为开机自启 sudo systemctl enable mysql 查看服务状态 (看到类似“active (running)”的状态信息代表成功) sudo systemctl status mysql …...
Go:方法
方法声明 type point struct { X, Y float64 }// 普通函数 func Distance(p, q Point) float64 {return math.Hypot(q.x - p.x, q.y - p.Y) }// Point类型的方法 func (p Point) Distance(q Point) float64 {return math.Hypot(q.x - p.x, q.y - p.Y) }方法声明与普通函数声…...
十四种逻辑器件综合对比——《器件手册--逻辑器件》
目录 逻辑器件 简述 按功能分类 按工艺分类 按电平分类 特殊功能逻辑器件 应用领域 详尽阐述 1 逻辑门 一、基本概念 二、主要类型 三、实现方式 四、应用领域 2 反相器 工作原理 基本功能 主要应用 常见类型 特点 未来发展趋势 3 锁存器 基本概念 工作原理 主要类型…...
[网鼎杯 2022 青龙组]fakeshell
这个题,我们查壳之后是upx壳。 但是当我们用upxunpack解包的时候我们解不出来。 说明有人动过这个包。 然后我们打开010eider,修改他的魔改 将此处,我们改成UPX我们在解包就可以了。然后我重新使用upxunpack 之后我们成功得到未加密的文件…...
vivado + modelsim 仿真:Post-Synthesis Timing Simulation
Vivado 结合Modelsim 实现综合后仿真的一种方法 Post-Synthesis Timing Simulation 使用Vivado 生成仿真所需文件创建Modelsim工程参考文档 使用Vivado 生成仿真所需文件 Vivado simulation 中可勾选Generate simulation scripts only;勾选-sdf_anno; 在testbanch文件中例化gl…...
可能存在特殊情况,比如控制台显示有延迟、缓冲问题等影响了显示顺序。
从控制台输出看,正常逻辑应是先执行 System.out.println(" 未处理异常演示 "); 输出对应文本,再因 arr 为 null 访问 length 触发 NullPointerException 输出异常信息。可能存在特殊情况,比如控制台显示有延迟、缓冲问题等影响…...
使用Python建模量子隧穿
引言 量子隧穿是量子力学中的一个非常有趣且令人神往的现象。在经典物理学中,我们通常认为粒子必须克服一个势垒才能通过它。但是,在量子力学中,粒子有时可以“穿越”一个势垒,即使它的能量不足以克服这个势垒。这种现象被称为“量子隧穿”。今天,我们将通过 Python 来建…...
Python-控制语句
控制语句 控制语句和逻辑思维 控制语句:把语句组合成能完成一定功能的小逻辑模块分类:顺序、选择、循环“顺序结构”:代表“先执行a,再执行b”的逻辑“条件判断结构”:代表“如果…,则…”的逻辑“循环结构”:代表“如果…则重复执行…”的逻辑条件判断结构 选择结构通…...
库学习04——numpy
一、基本属性 二、 创建数组 (一)arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一个参数n的话,默认是从0到n-1的一维数组。 (二)自定义reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …...
DeepSeek在应急救援领域的应用解决方案
DeepSeek在应急救援领域的应用解决方案 一、引言 1.1 应急救援领域现状 近年来,我国应急管理工作全面加强,取得了显著成效。然而,一系列重特大灾害事故暴露出我国应急管理体系存在诸多问题短板。例如,在责任落实、应急处突、法…...
【HCIP】GRE VPN实验笔记
一、实验拓扑 二、实验要求 1、按照图示配置IP地址 2、在R1和R3上配置默认路由使公网区域互通 3、在R1和R3上配置GRE VPN,使两端私网能够互相访问,Tunnel口IP地址如图 4、在R1和R3上配置RIPv2或者ospf或者静态,来传递两端私网路由 三、实…...
ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译
一、TL;DR MLLM在感知方面存在不足(远远比不上专家模型),比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex,旨在从模型设计和数据开发两个角度来填补这一感知能力的缺口ChatRex通过proposal边界框输入到LLM中将其转…...
10min速通Linux文件传输
实验环境 在Linux中传输文件需要借助网络以及sshd,我们可通过systemctl status sshd来查看sshd状态 若服务未开启我们可通过systemctl enable --now sshd来开启sshd服务 将/etc/ssh/sshd_config中的PermitRootLogin 状态修改为yes 传输文件 scp scp (Sec…...
CE、NCE、InfoNCE的演变过程
CE、NCE、InfoNCE的演变过程及数学推导和关系 在机器学习和深度学习中,交叉熵( C E CE CE)、噪声对比估计( N C E NCE NCE)和信息噪声对比估计( I n f o N C E InfoNCE InfoNCE)是三个紧密相关…...
在Vue项目的引入meting-js音乐播放器插件
开源项目:https://github.com/swzaaaaaaa/NBlog 1、开源项目中音乐播放插件的使用流程 步骤1:下载meting-js相关文件 在MetingJS官方仓库或其他可靠的CDN获取meting-js的JavaScript文件以及相关依赖(如APlayer的文件)。将它们下…...
rapidocr 2.0 在线demo来了
引言 今日北京大风,大家都窝在家里,自己也趁着周末更新了RapidOCR在线demo,适配rapidocr2.0系列。 rapidocr2.0支持4个推理引擎(ONNRuntime、OpenVino、PaddlePaddle和PyTorch),且整理了文本检测和文本识…...
Compose笔记(十五)--进度条
这一节了解一下Compose中的进度条,有两种类型的进度条可供使用,分别是线性进度条(LinearProgressIndicator)和圆形进度条(CircularProgressIndicator),每种进度条又可分为确定模式和不确定模式。…...
图谱可视化的海洋生物信息查询网站的设计与实现(springboot+ssm+vue)含文档
图谱可视化的海洋生物信息查询网站的设计与实现(springbootssmvue)含文档 该系统是一个图谱可视化的海洋生物信息查询网站,主要功能包括海洋动物、海洋植物、生物图鉴、保护生物和海洋生物分布等模块;用户可以通过系统首页访问这些模块;在海…...
目标追踪Hyperspectral Adapter for Object Tracking based on Hyperspectral Video
论文作者:Long Gao,Yunhe Zhang,Langkun Chen,Yan Jiang,Weiying Xie,Yunsong Li 作者单位:Xidian University;the University of Sheffield 论文链接:http://arxiv.org/abs/2503.22199v1 内容简介: 1)方向&#x…...
【HD-RK3576-PI】Linux制作deb包的方法
1.什么是deb包 ? DEB包是Debian及其衍生Linux发行版(如Ubuntu、Linux Mint等)使用的软件包格式。DEB包主要用于简化软件的安装、更新和卸载过程。它实际上是一个归档文件,通常包含了两个主要部分: 数据压缩包…...
FileInputStream 详解与记忆方法
FileInputStream 详解与记忆方法 一、FileInputStream 核心概念 FileInputStream 是 Java 中用于从文件读取原始字节的类,继承自 InputStream 抽象类。 1. 核心特点 特性说明继承关系InputStream → FileInputStream数据单位字节(8bit)用…...
什么是回表?哪些数据库存在回表?
目录 一、什么是回表1. 回表的核心流程2. 示例说明3. 回表的性能问题4. 总结 二、哪些数据库会有回表1. MySQL(InnoDB)2. Oracle3. 其他数据库(如 SQL Server、PostgreSQL)4. 总结 三、非聚集索引与聚集索引的区别及产生原因1. 聚…...
跨平台开发的挑战与突破:Java开发工具的探索与实践!
全文目录: 开篇语前言摘要概述源码解析代码实例代码解析代码解析1. import java.io.File;2. public class CrossPlatformFileManager3. public static void main(String[] args)4. String filePath "example.txt";5. File file new File(filePath);6. *…...
JDK的卸载与安装
卸载JDK 删除java的1安装目录 卸载JAVA_HOME 删除path下关于java的路径 java -version查看 安装JDK 百度搜索JDK,找到下载地址 同意协议 下载电脑对应版本 双击安装 记住安装路径 配置环境变量 我的电脑–>右键–>属性–>高级系统设置 环境变…...
CyclicBarrier 基本用法
CyclicBarrier 基本用法 简介 CyclicBarrier 是 Java 并发包(java.util.concurrent)中的一个同步辅助类。它允许一组线程相互等待,直到到达某个公共屏障点(common barrier point)。只有当所有参与的线程都到达屏障点…...
限流、降级、熔断、隔离?
在微服务架构中,服务限流、降级、熔断和隔离是保障系统高可用性的核心手段,但它们解决的问题和应用场景不同。以下是它们的区别、解决方案和实际案例的详细说明: 一、服务限流(Rate Limiting) 定义:通过限…...
asm汇编源代码之-字库转换程序
将标准的16x16点阵汉字库(下载16x16汉字库)转换成适合VGA文本模式下显示的点阵汉字库 本程序需要调用file.asm中的子程序,所以连接时需要把file连接进来,如下 C:\> tlink chghzk file 调用参数描述如下 C:\> chghzk ; 无调用参数,转换标准库文件(SRC16.FNT)为适合VGA…...
深入浅出:信号灯与系统V信号灯的实现与应用
深入浅出:信号灯与系统V信号灯的实现与应用 信号灯(Semaphore)是一种同步机制,用于控制对共享资源的访问。在多线程或多进程环境下,信号灯能够帮助协调多个执行单元对共享资源的访问,确保数据一致性与程序…...
定时器介绍及简单应用
定时器介绍及简单应用 文章目录 定时器介绍及简单应用1.定时器基本介绍1.1MSP430的四种定时器: 2.定时器A(Timer_A)2.1特点2.2寄存器的命名2.3寄存器表格2.4计数器原理说明2.4.1时钟源、分频器、计数器、工作模式2.4.2计数器复位 2.5定时器中断2.5.1定时…...
运行一次性任务与定时任务
运行一次性任务与定时任务 文章目录 运行一次性任务与定时任务[toc]一、使用Job运行一次性任务1.创建一次性任务2.测试一次性任务3.删除Job 二、使用CronJob运行定时任务1.创建定时任务2.测试定时任务3.删除CronJob 一、使用Job运行一次性任务 1.创建一次性任务 (…...
TypeScript入门
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
MySQL数据库备份与恢复详解
在数据库管理中,数据的备份与恢复是至关重要的一环。对于MySQL数据库,定期备份不仅能防止数据丢失,还能在发生故障时快速恢复数据库。本文将详细介绍MySQL数据库的备份与恢复方法,覆盖所有常用备份和恢复方式,帮助大家…...
【c语言】猜凶手
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信…...
Java学习打卡-Day25-注解和反射、Class类
注解(JDK5引入) 什么是注解? Java注解(Annotation),也叫元数据。一种代码级别的说明,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面…...
【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
CMake中add_custom_target用法详解
在 CMake 中,add_custom_target 是一个用于创建自定义构建目标的命令。它主要用于定义一些不生成文件,但需要执行的特定操作(比如运行脚本、执行命令、触发其他构建步骤等)。以下是它的核心用途和特点: 基本语法 add_…...