Android 常用命令和工具解析之Trace相关
目录
1、Perfetto基本用法
1.1 perfetto抓取命令
1.2 Perfetto主界面
1.3 Perfetto常用技巧
1.3.1 CPU的运行状态
1.3.2 CPU的频率
1.3.3 CPU的所有任务
1.3.4 判断是否低内存
1.3.5 CPU的负载计算
1.3.6 查看某进程是否运行在大核
1.3.7 CPU的大核占用率计算
2、应用启动问题分析
3、卡帧丢帧问题分析
4、CPU运行状态分析
4.1 Running
4.1.1 应用启动场景
4.1.2 卡帧掉帧场景
案例一:android.bg进程抢占CPU大核导致应用启动Running过长
案例二:应用编译模式不一致导致应用启动Running过长
案例三:GMS应用执行verifyClass操作导致应用启动Running过长
案例四:温升限频导致游戏掉帧
4.2 Runnable
4.2.1 应用启动场景
4.2.2 卡帧丢帧场景
案例一:开机后负载高导致应用启动慢
案例二:性能参数重新适配优化CPU均衡能力
4.3 Sleep
案例一:wmshell架构变动导致应用横屏activityStart binder reply等锁耗时过长
案例二:Launcher异常绘制导致ActivityThreadMain Binder Transaction耗时过长
案例三:system_server因为其他进程出现批量binder响应导致Sleep耗时过长
4.4 IO
Trace工具对于Android性能开发的同仁来说是绝对重要的,没有之一,因为它能够帮助我们分析各个CPU的运行状态和运行的任务,可以通过这些信息来判定系统中各个进程之间的关系,能够从毫秒级跟踪系统的各个进程的状态。
针对Trace相关的介绍,已经有大佬深入系统的介绍了相关部分,当初我也是根据此专辑进行入门。感谢这位大佬的付出:Android Performance
另外还可以加入他们的知识星球,加入二维码如下:
1、Perfetto基本用法
Android提供了trace来记录系统当前的CPU和各个进程的情况,我可以通过它来跟踪Binder、卡顿掉帧、应用启动等相关领域的问题。
Trace的抓取可以参考:Android Perfetto 系列 2:Perfetto Trace 抓取 · Android Performance
Trace的解析可以参考:Android Perfetto 系列 3:熟悉 Perfetto View · Android Performance
下面我根据大佬的文档提取一些常用技巧进行总结。
1.1 perfetto抓取命令
我们可以通过perfetto命令来抓取trace,它是android自带的一个命令,如下解释:
C:\Users\Administrator>adb shell perfettoUsage: perfetto--background -d : Exits immediately and continues in the background.Prints the PID of the bg process. The printed PIDcan used to gracefully terminate the tracingsession by issuing a `kill -TERM $PRINTED_PID`.--background-wait -D : Like --background, but waits (up to 30s) for alldata sources to be started before exiting. Exitcode is zero if a successful acknowledgement isreceived, non-zero otherwise (error or timeout).--clone TSID : Creates a read-only clone of an existing tracingsession, identified by its ID (see --query).--config -c : /path/to/trace/config/file or - for stdin--out -o : /path/to/out/trace/file or - for stdoutIf using CLONE_SNAPSHOT triggers, each snapshotwill be saved in a new file with a counter suffix(e.g., file.0, file.1, file.2).--txt : Parse config as pbtxt. Not for production use.Not a stable API.--query : Queries the service state and prints it ashuman-readable text.--query-raw : Like --query, but prints raw proto-encoded bytesof tracing_service_state.proto.--help -hLight configuration flags: (only when NOT using -c/--config)--time -t : Trace duration N[s,m,h] (default: 10s)--buffer -b : Ring buffer size N[mb,gb] (default: 32mb)--size -s : Max file size N[mb,gb](default: in-memory ring-buffer only)--app -a : Android (atrace) app nameFTRACE_GROUP/FTRACE_NAME : Record ftrace event (e.g. sched/sched_switch)ATRACE_CAT : Record ATRACE_CAT (e.g. wm) (Android only)Statsd-specific and other Android-only flags:--alert-id : ID of the alert that triggered this trace.--config-id : ID of the triggering config.--config-uid : UID of app which registered the config.--subscription-id : ID of the subscription that triggered this trace.--upload : Upload trace.--dropbox TAG : DEPRECATED: Use --upload insteadTAG should always be set to 'perfetto'.--save-for-bugreport : If a trace with bugreport_score > 0 is running, itsaves it into a file. Outputs the path when done.--no-guardrails : Ignore guardrails triggered when using --upload(testing only).--reset-guardrails : Resets the state of the guardails and exits(testing only).Detach mode. DISCOURAGED, read https://perfetto.dev/docs/concepts/detached-mode--detach=key : Detach from the tracing session with the given key.--attach=key [--stop] : Re-attach to the session (optionally stop tracingonce reattached).--is_detached=key : Check if the session can be re-attached.Exit code: 0:Yes, 2:No, 1:Error.
C:\Users\Administrator>adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
Warning: No PTY. CTRL+C won't gracefully stop the trace. If you are running perfetto via adb shell, use the -tt arg (adb shell -t perfetto ...) or consider using the helper script tools/record_android_trace from the Perfetto repository.[170.449] perfetto_cmd.cc:1051 Connected to the Perfetto traced service, TTL: 20s
[190.712] perfetto_cmd.cc:1213 Wrote 33441573 bytes into /data/misc/perfetto-traces/trace_file.perfetto-traceC:\Users\Administrator>adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace .
/data/misc/perfetto-traces/trace_file.perfetto-trace: 1 file pulled, 0 skipped. 40.2 MB/s (33441573 bytes in 0.793s)
1.2 Perfetto主界面
- 即我们通常可以通过https://ui.perfetto.dev/网站来解析Trace文件,请各位一定要保存收藏
- 选择perfetto网站左侧菜单栏的Open trace file加载测试提供的trace文件,得到如上的主界面
- 通过W键来拉伸视图,通过S键来缩短视图,即可以通过W和S键来进行放大和缩小
- 通过A键来向左移动,通过D键来向右移动,即可以通过A和D键来左右移动时间轴
- 通过鼠标来进行圈选,可以圈选任何时间片段的某个或者多个进程或者CPU片段
- 通过M键来对某个时间片段进行快捷的选取,通过shift+M键可以标记多个时间片段
- 点击binder片段,会自动显示一根曲线指向对端线程
-
点击左侧带有标记的符号,可以将其置顶
-
点击runing片段,底部信息区左侧State:Running on CPU1点击跳转到对于的CPU片段
-
点击Runnable片段,底部信息区右侧Woken threads可以跳转到唤醒源的地方
1.3 Perfetto常用技巧
1.3.1 CPU的运行状态
通过Trace分析某个进程的CPU状态额外重要,CPU通常有Runing、Runnable、Sleeping、IO几个状态,他们分别表示CPU的运行状态、等待运行的状态、休眠状态、因为IO休眠的状态。详细分析参考后文。
如上例子为maps应用的冷启动过程,在启动阶段CPU在各个状态下的占比时长。
1.3.2 CPU的频率
通过Trace分析某个多个CPU运行的频率,这样有助于是否被限频,或者频率是否被拉满到最大,对后续温升限频,与对比机对比运行频率提供很大的帮助。详情分析参考后文
如上例子为maps应用的冷启动,导致CPU的频率从691M提升到2.4G khz,CPU被拉满运行。
1.3.3 CPU的所有任务
圈选所有CPU,底部信息栏会展示当前所有的任务状态,通过此手段可以有效地计算CPU负载、计算某进程大核占用率、系统是否存在低内存。详情分析参考后文
如上例子为maps应用的冷启动,此阶段maps进程在排行榜首位,说明它取得的cpu片段最高,整个系统它最活跃。
1.3.4 判断是否低内存
通过圈选所有CPU,如果kswapd0进程最活跃,那么说明当前处于低内存状态,因为kswapd0就是在低内存的时候被触发进行进程查杀
如上例子为wps应用的启动过程,但是wps应用并不是最活跃的,最活跃的是kswapd0,说明此时系统的内存已经比较紧张了。
1.3.5 CPU的负载计算
CPU负载的计算,可以用于和对比机进行对比,如果存在差异,我们可以认为系统的负载不一样导致的系统卡顿或者冷启动耗时过长。其计算公式如下:
CPU Loading = Wall duration / (8 * Selected range)
1.3.6 查看某进程是否运行在大核
可以通过点击指定进程的runing片段,然后点击底部信息栏的Runing on CPUX会在对于的CPU片段生成一个标记,将鼠标移动到这个标记上面,就会隐藏其他的进程,高亮当前进程,来判断该进程整个过程大部分时间处于哪个CPU,通常CPU6和CPU7就是大核。
注意:具体大核不同平台不一致,需要去查找芯片手册
如上例子通过选取进程143的Runing片段,从图中可以看出143进程大部分时间运行在CPU4,非大核。
1.3.7 CPU的大核占用率计算
跟CPU负载计算一致,我们可以针对某个进程,分别选取所有CPU的总运行时长,和大核所在的CPU(PS:通常CPU6和CPU7是大核)的总运行时长。在与对比机进行对比的时候,如果大核占用率存在明显的差异,我们可以考虑考虑存在摆核或者其他进程抢占问题存在。其公式如下:
CPU 大核占用率 = 大核运行此应用主线程Wall duration / 所有CPU运行此应用主线程Wall duration
2、应用启动问题分析
有些应用的启动过程本身都耗时特别长,可能长达几秒或者10秒,有些应用的启动过程耗时比较段,可能短至300ms都能启动。因此针对这类问题,通常需要有一台对比机进行对比,通过某些应用或者多个应用的启动来分析设备的性能问题。
Perfetto + trace来分析应用启动问题简直不言而喻。因为Perfetto解析trace文件之后,如果此阶段存在应用的启动,那么必定会有一个Android App Startups,如下为maps应用的启动过程:
如上例子为maps应用的启动过程,其启动流程会依次经历:
ZygoteInit
ActivityThreadMain
bindApplication
activityStart
activityResume
Choreographer#doFrame
PS:正常情况下以第一个Choreographer#doFrame作为结束点
如下依次介绍一下我们的分析思路:
- 和对比机确认启动阶段耗时是否存在差异?
- 和对比机确认CPU的运行状态是否存在差异?
- 和对比机确认CPU运行的频率是否存在差异?
- 和对比机确认CPU系统负载是否存在差异?
- 和对比机确认是否存在低内存?
- 和对比机确认是否存在其他进程抢占CPU资源?
3、卡帧丢帧问题分析
参考链接:Android Systrace 基础知识 - SurfaceFlinger 解读 · Android Performance
4、CPU运行状态分析
4.1 Running
参考链接:Systrace 线程 CPU 运行状态分析技巧 - Running 篇 · Android Performance
参考链接:https://online.mediatek.com/apps/quickstart/QS00157#QSS03759
参考链接:https://online.mediatek.com/apps/quickstart/QS00157#QSS03735
如上链接已经详细的对CPU Running状态做了比较深入的介绍。因此如果和对比机存在明显的Running差异,那么可以认为CPU的执行能力不够,或者存在高负载情况影响了CPU的执行能力。
4.1.1 应用启动场景
如下为MTK官方网站针对应用启动场景因为Running的原因的分析思路
总结如下:
- 和对比机的CPU频率是否处于同一水平?
- 是否存在频率限制,是否存在温升限频率,针对单个进程提升CPU频率
- 是否存在其他进程抢占,大核占用率是否一致?
- 系统负载是否一致,是否存在优化空间?
- DDR没有遇到过,不是很熟悉
4.1.2 卡帧掉帧场景
如下为MTK官方网站针对卡帧丢帧场景因为Running差异的分析思路
总结同应用启动场景
案例一:android.bg进程抢占CPU大核导致应用启动Running过长
通过和对比机check CPU运行状态和计算CPU大核占用率可以发现存在差异,圈选CPU所有任务可以发现system server进程的android.bg线程排行首位导致
案例二:应用编译模式不一致导致应用启动Running过长
通过和对比机check 应用启动的各个阶段,发现bindApplication阶段存在大量dex2oat操作。应用的dex2oat状态不同会影响代码的执行效率,等级越高执行速度越快(everything>speed>speed-profile>verify),但相对执行的dex2oat本身的执行也耗时。
dex2oat参考链接:https://online.mediatek.com/apps/quickstart/QS00111
针对此类问题有如下方案:
- MTK方案,在每次应用冷启动期间尝试执行dex2oat,尝试4次,参考DexOptExtImpl.java
- 展锐方案,Unipnp框架下的一个feather,逻辑跟mtk功能一致,参考DexOptimizeScene.java
- Android原生方案,设备空闲时自动进行后台dex2oat,这种方式触发的条件比较苛刻(灭屏待机+充电+间隔24小时),参考BackgroundDexOptService.java
案例三:GMS应用执行verifyClass操作导致应用启动Running过长
部分应用trace上看到大量verifyClass流程,校验的类路径都是com.google.android.gms.xxx,分析发现这些类都属于gmscore的插件apk,例如ads dynamite。通过trace发现,做校验类所在apk的路径大多数是/data/user_de/0/com.google.android.gms/app_chimera/m/0000X/xxx.apk,这些apk都属于com.google.android.gms的插件apk
综上分析,解决方案就是首次开机完成后,对gmscore的secondary apk做dex2oat预编译优化,生成插件apk的oat文件,让class_linker.cc中的verifyclass方法走不耗时的verifyClassFromOat
services/core/java/com/android/server/pm/PackageManagerService.java
使用adb shell dumpsys package com.google.android.gms的输出结果说明此方案有效
案例四:温升限频导致游戏掉帧
问题描述:原神在环温25度情况下游戏,会出现掉帧
原因分析:因为板温过高导致CPU频率被限制
4.2 Runnable
参考链接:Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇 · Android Performance
参考链接:https://online.mediatek.com/apps/quickstart/QS00250#QSS02568
参考链接:https://online.mediatek.com/apps/quickstart/QS00157#QSS03735
如上链接已经详细的对CPU Runnable状态做了比较深入的介绍。因此如果和对比机存在明显的Runnable差异,那么可以考虑CPU Loading负载及Task schedule调度策略有关系。
4.2.1 应用启动场景
如下为MTK官方网站针对应用启动场景因为Runnable的原因的分析思路
总结如下:
-
是否存在其他线程抢核,大核占用率是否存在差异?
-
是否存在绑核行为,能否提升该进程的优先级?
-
计算CPU的负载,看是否存在优化空间?
4.2.2 卡帧丢帧场景
如下为MTK官方网站针对卡帧丢帧场景因为Runnable差异的分析思路
总结如下:
- 计算CPU的负载,是否存在优化空间?
- 从调度策略方向考虑,能否对主线程/SF线程进行绑大核?
案例一:开机后负载高导致应用启动慢
问题描述:TOP应用主观体验,重启后相机、设置、Chrome、WhatsApp、TikTok、youtube、Twitter等应用进行冷启动卡顿、启动时间较慢
原因分析:主要是开机的时候后台起来的进程较多,导致负载重,响应较慢,这是一个典型的高负载场景
解决方案:配置powerhal相关参数,提升对于应用的优先级和亲和力
案例二:性能参数重新适配优化CPU均衡能力
问题描述:多个应用冷启动测试数据均差于对比机(红米13C)50ms以上
原因分析:CPU频率未拉满,且主要跑在小核;触摸滑动后提频时长不足,可能造成卡顿;内存读写速率较差;kswapd活跃且抢占大核资源
解决方案:修改各类参数和调度策略
4.3 Sleep
参考链接:CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇
参考链接:https://online.mediatek.com/apps/quickstart/QS00157#QSS03773
参考链接:https://online.mediatek.com/apps/quickstart/QS00250#QSS02562
应用启动场景和丢帧卡帧场景,MTK的分析思路都是去寻找唤醒源
总结如下:
-
MTK官方文档介绍的去查找唤醒源,唤醒源的查找方式可以参考1.2节。但在实际问题处理中感觉此方法并没有太大的作用
-
根据经验来看,系统调用、内核函数、锁等待、binder调用等都可能让线程进入sleeping状态,所以导致问题的原因可能很分散且不止一个,这类耗时没有通用的优化方案,只能结合具体问题深入分析找到异常点,同时优化整机性能,项目上最常见的是卡binder导致的sleeping耗时
案例一:wmshell架构变动导致应用横屏activityStart binder reply等锁耗时过长
应用横屏在activityStart阶段,有一个长约300ms的binder transaction耗时而对比机没有,binder reply在等锁,持锁端为system_server的另一个binder线程,该binder线程正在做updateGlobalConfiguration的reply操作,发起端是systemui::wmshell.main。最终确认是U上wmshell架构变化导致,推动systemUI解决。
案例二:Launcher异常绘制导致ActivityThreadMain Binder Transaction耗时过长
在ActivityThreadMain阶段,测试的binder transaction耗时明显比对比机长很多,对端操作都是system_server:attachApplication。但是测试机有一段明显的lock contention等锁耗时,持锁端是system_server:android:anim,可以看到测试版本上该线程多一个android.os.Handler:com.android.server.wm.WindowSurfacePlacer$Traverser(绘制准备流畅)。最终确认是Launcher的问题,应用启动时绘制所有页面的应用图标。
案例三:system_server因为其他进程出现批量binder响应导致Sleep耗时过长
应用整个启动过程中,测试机sleeping耗时比对比机多200ms。测试机上很多的binder耗时都比对比机更长,对端均是system_server,可以看到system_server的binder在执行次数是对比机的倍数,且大多数的binder都在响应一个应用demoThread(所属进程为Lazada)的transaction,而对比机没有这种现象,这种情况就需要排查binder调用端所属进程的异常行为。
4.4 IO
相关文章:
Android 常用命令和工具解析之Trace相关
目录 1、Perfetto基本用法 1.1 perfetto抓取命令 1.2 Perfetto主界面 1.3 Perfetto常用技巧 1.3.1 CPU的运行状态 1.3.2 CPU的频率 1.3.3 CPU的所有任务 1.3.4 判断是否低内存 1.3.5 CPU的负载计算 1.3.6 查看某进程是否运行在大核 1.3.7 CPU的大核占用率计算 2、应…...
使用IDEA构建springboot项目+整合Mybatis
目录 目录 1.Springboot简介 2.SpringBoot的工作流程 3.SpringBoot框架的搭建和配置 4.用Springboot实现一个基本的select操作 5.SpringBoot项目部署非常简单,springBoot内嵌了 Tomcat、Jetty、Undertow 三种容器,其默认嵌入的容器是 Tomcat,…...
Python学习34天
import random class Game: peo0 rob0 # # def __init__(self,peo,rob): # self.peopeo # self.robrob def Play(self): """ 石头剪刀布游戏,0代表石头,1代见到,2代表石头 …...
leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k,请返回数组中第 k 个最大的元素。 请注意,要求排名是从大到小的,因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...
科技赋能:企业如何通过新技术提升竞争力的策略与实践
引言 在当今瞬息万变的商业环境中,科技的迅猛发展正在重新定义行业的游戏规则。无论是小型企业还是跨国巨头,都感受到数字化转型的迫切需求。过去,企业竞争力更多依赖于成本控制、资源调配或市场覆盖,而如今,新技术的引…...
SAP开发语言ABAP开发入门
1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP(Advanced Business Application Programming)是SAP系统中的编程语言,主要用于开发企业级的业务应用程序,如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…...
快速理解微服务中Ribbon的概念
一.基本概念 1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。 2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。 3.Ribbon 主要解决的是在微服务架构中,多个服务…...
MTK主板_安卓主板方案_MTK联发科主板定制开发
联发科(MTK)主板以其强大的性能和多样化的功能而受到广泛关注。该平台包括多个型号,例如MT6761、MT8766、MT6762、MT6765、MT8768和MT8788等,均配置了四核或八核64位处理器,主频可高达2.0GHz。采用先进的12nm工艺,搭载Android 11.…...
Linux:文件管理(一)——文件描述符fd
目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档࿰…...
Excel的图表使用和导出准备
目的 导出Excel图表是很多软件要求的功能之一,那如何导出Excel图表呢?或者说如何使用Excel图表。 一种方法是软件生成图片,然后把图片写到Excel上,这种方式,因为格式种种原因,导出的图片不漂亮,…...
Python + 深度学习从 0 到 1(00 / 99)
希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【深度学习从 0 到 1】谢谢你的支持! ⭐ 什么是深度学习? 人工智能、机器学习与…...
高级AI记录笔记(五)
学习位置 B站位置:红豆丨泥 UE AI 教程原作者Youtube位置:https://youtu.be/-t3PbGRazKg?siRVoaBr4476k88gct素材自备 改良近战AI格挡行为 把近战AI的格挡行为从行为树中单独一个任务分块中给删除掉,因为我们希望敌人在受到伤害后立即进行…...
uniapp vue2项目迁移vue3项目
uniapp vue2项目迁移vue3项目,必须适配的部分 一、main.js 创建应用实例 // 之前 - Vue 2 import Vue from vue import App from ./App Vue.config.productionTip false // vue3 不再需要 App.mpType app // vue3 不再需要 const app new Vue({ ...App }) …...
平安科技Java面试题及参考答案
多个线程 a++,单个线程不管别的线程怎么改变 a 的值,只管自己的 a 的值,但是只有一个对象 在 Java 中,当多个线程对同一个对象的共享变量 a 进行 a++ 操作时,如果不进行适当的同步处理,就会出现数据不一致的问题。因为 a++ 操作并非原子操作,它实际上包含了读取 a 的值、…...
Element UI 打包探索【1】
目录 第一个命令 第二个命令 node build/bin/iconInit.js node build/bin/build-entry.js node build/bin/i18n.js node build/bin/version.js 总结 最近在接触组件库的项目,所以特意拿来Element UI借鉴学习一下,它算是做前端的同学们离不开的一…...
【通俗理解】神经网络中步长缩小的奥秘:优化算法与卷积操作的影响
【通俗理解】神经网络中步长缩小的奥秘:优化算法与卷积操作的影响 关键词提炼 #神经网络 #步长缩小 #优化算法 #卷积操作 #AdaGrad #感受野 第一节:步长缩小的类比与核心概念【尽可能通俗】 在神经网络中,步长缩小就像是运动员在赛跑中逐…...
C语言:C语言实现对MySQL数据库表增删改查功能
基础DOME可以用于学习借鉴; 具体代码 #include <stdio.h> #include <mysql.h> // mysql 文件,如果配置ok就可以直接包含这个文件//宏定义 连接MySQL必要参数 #define SERVER "localhost" //或 127.0.0.1 #define USER "roo…...
2023.11 Graph-Enriched Biomedical Language Models: A Research Proposal
Proceedings of the 13th International Joint Conference on Natural Language Processing and the 3rd Conference of the Asia-Pacific Chapter of the Association for Computational Linguistics: Student Research Workshop, pages 82–92 November 1–4, 2023. ©20…...
HTML详解(1)
1.HTML定义 HTML:超文本标记语言。超文本:通过链接可以把多个网页链接到一起标记:标签,带括号的文本后缀:.html 标签语法:<strong>需加粗文字</strong> 成对出现,中间包裹内容&l…...
Taro 鸿蒙技术内幕系列(三) - 多语言场景下的通用事件系统设计
基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测,本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 在鸿蒙生态系统中,虽然原生应用通常基于 ArkTS 实现,但在实际研发过程中发现,使用 C…...
Java图书管理系统(简易保姆级)
前面学习了这么多知识,为了巩固之前的知识,我们就要写一个图书管理系统来帮助大家复习,让大家的知识融会贯通~~~ 话不多说,直接开始今天的内容~ 首先呢,我们要有一个大体的思路: 实现效果思路有两种情况&a…...
maven 中<packaging>pom</packaging>配置使用
在 Maven 项目的 pom.xml 文件中, 元素用于指定项目的打包类型。默认情况下,如果 元素没有被显式定义,Maven 会假设其值为 jar。但是,当您设置 pom 时,这意味着该项目是一个 POM(Project Object Model&…...
uniapp使用腾讯云获取位置转为省市区
腾讯云获取位置转为省市区 腾讯位置服务提供了多种SDK程序包,其中的JavaScript版本的SDK适用于微信小程序,所以我们下载这个SDK包。 下载地址 在小程序项目中,创建lib目录,把SDK文件放入其中 <script>var QQMapWX requ…...
【git实践】分享一个适用于敏捷开发的分支管理策略
文章目录 1. 背景2. 分支管理实践2.1. 敏捷开发中分支管理面临的问题2.2. 分支管理策略2.3. 还需要注意的一些问题 3.总结 1. 背景 在实际的开发工作中,我们往往会面临多任务并行研发,多个环境管理的情况,这种情况下,一个合适的分…...
rpm方式安装postgres数据库及普通用户管理数据库
一、安装postgres 数据库 下载rpm安装包 wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-libs-15.5-1PGDG.rhel7.x86_64.rpm wget https://ftp.postgresql.org/pub/repos/yum/15/redhat/rhel-7.9-x86_64/postgresql15-15.5-1PGDG.rh…...
使用PgBackRest备份远程PG数据库
文章目录 环境准备总体要求1. 在 PostgreSQL 服务器上配置1.1 配置 PostgreSQL1.2 配置 SSH 密钥1.4 安装PgBackRest1.4.1 使用源码编译1.4.2 直接安装 配置文件 2. 在 PgBackRest 服务器安装PgBackRest2.1 安装 PgBackRest2.2 创建必要的目录2.3 编辑配置文件2.4 配置 SSH 密钥…...
笔记mfc11
Subclass(子类化)是MFC中最常用的窗体技术之一。子类化完成两个工作:一是把窗体类对象attach到一个windows窗体实体中(即把一个窗体的hwnd赋给该类)。另外就是把该类对象的消息加入到消息路由中,使得该类可以捕获消息。 让edit能…...
Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化
| (免费)线上研讨会时间:2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源,这不仅革新了新建工厂,也适用于改造现有工厂。 与现…...
Spring Boot 整合 ELK 全面指南:实现日志采集、分析与可视化
一、ELK简介 1.1 什么是ELK? ELK 是三个开源工具的组合: Elasticsearch:一个分布式全文搜索和分析引擎,用于存储和查询日志数据。Logstash:一个数据处理管道工具,用于收集、解析和处理日志数据。Kibana&…...
D80【 python 接口自动化学习】- python基础之HTTP
day80 requests请求加入headers 学习日期:20241126 学习目标:http定义及实战 -- requests请求加入headers 学习笔记: requests请求加入headers import requestsurlhttps://movie.douban.com/j/search_subjects params{"type":…...
在Windows环境下打包Qt C++项目为独立可执行文件的完整指南
目录 1. 配置Qt环境变量步骤: 2. 使用Release模式编译项目步骤: 3. 使用windeployqt工具收集依赖项步骤: 4. 精简复制后的文件目录方法一:使用windeployqt的选项方法二:手动删除不必要的文件方法三:使用静态…...
已存大量数据的mysql库实现主从各种报错----解决方案(看评论)
背景何谓“先死后生”本文使用技术1、实施流程图2、实施2.1、数据库备份2.2、搭建Mysql的Master-Slave2.2.1、准备工作2.2.2、开始部署2.2.3、账号配置2.2.4、slave 同步配置2.2.5、验证 2.3、Master做数据恢复 结语 背景 计划对已有大量数据的mysql库的主从搭建,使…...
Java爬虫:深入探索1688接口的奥秘
在数字化时代,数据成为了企业最宝贵的资产之一。对于电商企业来说,获取和分析数据的能力直接关系到其市场竞争力。阿里巴巴旗下的1688平台,作为中国领先的批发贸易平台,拥有海量的商家和商品信息,成为了众多企业获取数…...
Linux——基础命令(1)
目录 一、认识Linux 终端命令格式 查阅命令帮助信息 -help 辅助操作 自动补全 清屏和查看当前工作目录 二、基本命令 文件和目录常用命令 1.ls-查看文件与目录 2.cd切换目录 (1)touc创建文件或修改文件时间 (2)mkdir创…...
Java知识及热点面试题总结(一)
今天开始对Java进行总复习,主要针对热点面试题,我们再根据试题内容延申相关知识; 1.、Java中equals与“”的区别详解 讲二者区别之前,先大概讲解一下基本数据类型和引用类型的概念,当然,有一定基础的朋友…...
基于 AI 的软件工程: 超级程序员
徐昊 《AI时代的软件工程》-极客时间课程学习总结 帮助你更好地利用 LLM 提高效率,还可以站在一个更全面的立场上,讨论如何将 LLM 引入团队或是组织。 核心观点: AI 辅助业务建模:通过将模型转化为 Mermaid 格式,将我们的模型表达为大语言模型能够理解的形式。通过添加注…...
Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别
文章目录 Spring Boot 2 和 Spring Boot 3 中使用 Spring Security 的区别1. Jakarta EE 迁移2. Spring Security 配置方式的变化3. PasswordEncoder 加密方式的变化4. permitAll() 和 authenticated() 的变化5. 更强的默认安全设置6. Java 17 支持与语法提升7. PreAuthorize、…...
浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)
首先,在InternStudio平台上创建开发机。 创建成功后点击进入开发机打开WebIDE。进入后在WebIDE的左上角有三个logo,依次表示JupyterLab、Terminal和Code Server,我们使用Terminal就行。(JupyterLab可以直接看文件夹)…...
微信小程序+Vant-自定义选择器组件(多选
实现效果 无筛选,如有需要可参照单选组件中的方法.json文件配置"component": true,columns需要处理成含dictLabel和dictValue字段,我是这样处理的: let list arr.map(r > {return {...r,dictValue: r.xxxId,dictLabel: r.xxx…...
Vue.js 学习总结(15)—— 如何快速删除 node_modules 依赖文件
一、删除 node_modules 依赖为什么慢? 直接通过图形用户界面删除 node_modules 文件夹慢,原因主要有以下5点原因: (1)文件数量巨大:node_modules依赖可能会有上万个文件和文件夹,那么就使得操作…...
PyTorch基础05_模型的保存和加载
目录 一、模型定义组件——重构线性回归 二、模型的加载和保存 2、序列化保存对象和加载 3、保存模型参数 一、模型定义组件——重构线性回归 回顾之前的手动构建线性回归案例: 1.构建数据集;2.加载数据集(数据集转换为迭代器);3.参数初…...
Vue.js前端web练习范例:随鼠标移动的小球
技术选型:运用html、css、script、及vue组件 开发需求:编写在指定容器区域内随鼠标移动的小球,当鼠标超出容器,小球保持在边界位置不动 程序设计: 1、创建440px*440px的容器;创建30px半径的小球; 2、记录小球在面板中…...
计算机网络----基本概念
基本概念 在这一章从整体上介绍计算机网络的概况, 为后续的学习搭建起整体的框架; 介绍计算机网络中的基础术语和概念; 什么是因特网 『 因特网 』是一个世界范围内互联了数以亿计的计算设备的计算机网络; 因特网具体构成 因特网互联了数以亿计的计算设备, 这些设备被称为…...
创建可直接用 root 用户 ssh 登陆的 Docker 镜像
有时候我们在 Mac OS X 或 Windows 平台下需要开发以 Linux 为运行时的应用,IDE 或可直接使用 Docker 容器,或 SSH 远程连接。本地命令行下操作虽然可以用 docker exec 连接正在运行的容器,但 IDE 远程连接的话 SSH 总是一种较为通用的连接方…...
Linux 查看内核日志的方法
文章目录 1. dmesg 命令一. 介绍内核环形缓冲区的特点 二. 主要功能三. dmesg 使用 2. 查看kmsg文件/dev/kmsg 的用途使用 /dev/kmsg与 dmesg 的关系 3. 内核日志消息的打印行为 1. dmesg 命令 一. 介绍 dmesg(display message 或 display driver message 的缩写&…...
详解登录MySQL时出现SSL connection error: unknown error number错误
目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后,使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件,然后按下图所示添加配置 此时再…...
DRNN 神经网络的Jacobian 信息辨识
DRNN 神经网络的 Jacobian 信息辨识 1. 基本原理 Jacobian 矩阵用于描述多输入多输出系统中输入和输出之间的偏导关系,其形式为: 对于 DRNN(Dynamic Recurrent Neural Network),其动态特性使得 y(t)\mathbf{y}(t)y(t…...
麒麟系统x86安装达梦数据库
一、安装准备前工作 操作系统:银河麒麟V10,CPU: x86_64 架构 下载地址,麒麟官网:https://www.kylinos.cn/ 数据库:dm8_20220915_x86_kylin10_64 下载地址,达梦数据库官网:https://…...
uniapp定义new plus.nativeObj.View实现APP端全局弹窗
为什么要用new plus.nativeObj.View在APP端实现弹窗?因为uni.showModal在APP端太难看了。 AppPopupView弹窗函数参数定义 参数一:弹窗信息(所有属性可不填,会有默认值) 1.title:"", //标题 2.content:"", //内容 3.confirmBoxCo…...
git branch -d 删除分支
Git进行版本控制时,删除分支是常见的操作。特别是当特定的功能开发完成或者分支不再需要时,删除分支可以帮助保持仓库的整洁。删除本地分支和删除远端分支是两个独立的操作。如果需要同时删除本地和远端的分支,需要分别执行以下两个命令。 一…...