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

通过ADB来实现脚本来控制手机

ADB

简介

adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟.

通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,诸如刷资源,各种app的签到

环境配置

电脑端

将下面3个文件弄到一个文件夹里D:\android\adb,然后将其添加到path,adb环境就配置好了

AdbWinUsbApi.dll
AdbWinApi.dll
adb.exe

然后将这个文件夹添加到path中

cmd中 adb version检查是否添加成功

手机端

开发者选项

开启开发者选项 : 以小米手机为例,先进入开发者设置,miui版本号点5下,更多设置->开发者选项->开启

打开usb调试 : 在开发者选项中,开启usb调试以便于执行adb指令,miui还需要开启usb调试(安全设置)

获取坐标 : 开发者选项中,开启指针位置以便于模拟触摸时获取位置

设备管理

远程调试

基于内网穿透实现远程调试,就可以不用占用那少得可怜的usb口了,下面是统一管理所有设备的命令

开启关闭服务,默认会自动开启,关闭服务可用于断开多个连接的设备
adb start-server
adb kill-serveradb devices 查看设备列表,如果有模拟器一般会自动连接,所以如果想在开模拟器时断开设备就需要获取模拟器ip:port然后断开

实现步骤

先使用内网穿透得到虚拟IP 如100.119.133.92

推荐tailscale或蒲公英

手机通过usb调试设置监听端口adb tcpip 5555

断开手机后,电脑连接 如adb connect 100.119.133.92:5555

调试结束后可以adb disconnect 100.119.133.92:5555 断开连接

远程控制

scrcpy 使用这个软件,在上面远程连接之后就可以进行远程控制,当然也可以直接连usb获得稳定的投屏

手机adb

Local ADB

  • 先连接任意一个 Wi-Fi,就算没有接入互联网都可以;
  • 然后打开 LADB,将它调整为小窗模式(或分屏模式)——因为无线调试的配对码等信息每次点击都会动态生成,所以才需要小窗模式同时打开本应用和开发者选项;
  • 进入开发者选项,开启无线调试,首次使用需要配对设备,将配对码和端口填入本应用即可;
  • 开心使用adb

应用管理

常见命令中常见pm和am的缩写

pm package manager

am activity manager

一个package下有多个activity(界面)

查看应用列表

adb shell pm list packages    		查看所有应用
adb shell pm list packages -s		查看系统应用
adb shell pm list packages -3		查看第三方应用
adb shell pm list packages vivo	 	查看带关键词vivo的应用

安装应用

adb install [-r] [-d] [-g] <apk-file>
-r覆盖 -d降级覆盖 -g授予所有运行权限

例如 adb install "D:\android\apk\com.supercell.clashofclans.apk"

卸载应用

adb uninstall [-k] <package-name>
-k 表示卸载应用但保留数据和缓存目录。

例如adb uninstall com.supercell.clashofclans

获取activity和package

adb shell dumpsys window w | findstr mCurrent

得到 mCurrentFocus=Window{8554b85 u0 com.supercell.clashofclans/com.supercell.titan.GameApp}

然后可以得到

activity : com.supercell.clashofclans/com.supercell.titan.GameApp

package : com.supercell.clashofclans

可以通过下面cmd代码获取

@echo offsetlocal enabledelayedexpansion
rem 先查询window w mCurrent属性,如果为空,则查询window w imeControlTarget属性
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a 
if "!activity!"=="" (
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
for /f "delims=}" %%a in ("!activity!") do set activity=%%a 
rem for /f "tokens=3 delims= " %%a in ("!activity!") do set activity=%%a
for %%I in (!activity!) do (set activity=%%I) 
for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%aecho activity  :  !activity!
echo package   :  !package!endlocal

提取安装包

获取了安装路径后pull到指定目录里并重命名为com.supercell.clashofclans.apk

adb shell pm path com.supercell.clashofclans
adb pull /data/app/com.supercell.clashofclans-HyrIPsbKlOHBjZwM4LnczA==/base.apk D:\android\com.supercell.clashofclans.apk

用cmd实现批量操作

@echo off
rem 获取安装包
set outputpath=D:\android\apk\
set package=com.supercell.clashofclans
for /f "delims=" %%a in ( 'adb shell pm path %package%' ) do set originalString=%%a
for /f "tokens=2 delims=:" %%a in ("%originalString%") do set apkpath=%%a
adb pull %apkpath% %outputpath%%package%.apk

启动和停止应用

rem 启动
adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp>nul
rem 强行停止
adb shell am force-stop com.supercell.clashofclans

行为模拟

按键模拟

按键模拟都是像下面这种格式,不同的按键对应不同的id

rem 模拟主页键
adb shell input keyevent 3

下面是常用id-按键表

id按键
3home
4返回
187多任务
24增加音量
25减小音量
26电源键
164静音
220提高亮度
221降低亮度

详细的见官网 KeyEvent | Android Developers

触摸模拟

rem 单击 (1200,70)为x,y坐标
adb shell input tap 1200 70rem 滑动 从(600,700)滑动到(600,900)经历1000ms
adb shell input swipe 600 700 600 900 1000rem 长按 用滑动实现
adb shell input swipe 100 100 100 100 1000

系统控制

rem 执行关机命令
adb shell reboot -prem 执行重启命令
adb shell rebootrem 进入Recovery
adb reboot recoveryrem 进入Fastboot
adb reboot fastboot

实战

获取当前活动的activity和package

@echo offsetlocal enabledelayedexpansion
rem 先查询window w mCurrent属性
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a 
if "!activity!"=="" ( REM 如果没有查询到,则查询window w imeControlTarget属性,此处只试了两款手机,其他的可以自己打印出window w再找
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
for /f "delims=}" %%a in ("!activity!") do set activity=%%a 
rem 通过循环得到空格的最后一段,因为不同的指令输出的我们所需的信息都在最后
for %%I in (!activity!) do (set activity=%%I)  
for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%aecho activity  :  !activity!
echo package   :  !package!endlocal

coc辅助刷夜世界资源

坐标需要根据屏幕分辨率自行调整

chcp 65001
@echo offset m=7
:m
set /a m+=1adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
choice /t 12 /d y  >nulset  /a n = %m% %% 8
if %n% == 0  (
echo 圣水已收集
adb shell input swipe 600 700 600 900 1000
adb shell input tap 1060 80
adb shell input tap 1100 600
adb shell input tap 1200 70
)rem 皮卡一字滑
adb shell input tap 120 650
adb shell input tap 1035 500
choice /t 5 /d y  >nuladb shell input tap 360 650
FOR /L %%i in (1,1,2) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)adb shell am force-stop com.supercell.clashofclans
goto m

冲杯

chcp 65001
@echo offif "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:beginset m=7
:m
set /a m+=1adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
choice /t 12 /d y  >nulset  /a n = %m% %% 8
if %n% == 0  (
echo 圣水已收集
adb shell input swipe 600 700 600 900 1000
adb shell input tap 1000 200
adb shell input tap 1100 600
adb shell input tap 1200 70
)adb shell input tap 120 650
adb shell input tap 1035 500
choice /t 5 /d y  >nuladb shell input tap 260 650
adb shell input tap 200 450
adb shell input tap 1200 100adb shell input tap 360 650
FOR /L %%i in (1,1,2) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)
choice /t 80 /d y  >nul
adb shell input tap 260 650
adb shell input tap 200 450
adb shell input tap 1200 100adb shell input tap 1100 660
FOR /L %%i in (1,1,3) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)adb shell am force-stop com.supercell.clashofclansgoto m

TODO

录制操作

record

#!/bin/bash - if [ "$1" == "-h" ]; thenecho "-s: to generate Shell file "echo "-c: to generate C program file "echo "-h: help "exit
fi
#apk信息
PACKAGE=$(awk -F '=' '$1~/PACKAGE/{print $2;exit}' ./config.ini)
ACTIVITY=$(awk -F '=' '$1~/LAUNCH_ACTIVITY/{print $2;exit}' ./config.ini)
#设备信息
DEVICE_NAME=$(awk -F '=' '$1~/DEVICE_NAME/{print $2;exit}' ./config.ini)
echo "Touch device is [ $DEVICE_NAME ]"
#文件定义
file=./out/cmds.txt
t0file=tmp0.txt
t1file=tmp1.txt
t2file=tmp2.txt#-------------------------------------------------------------------------------
#  函数: 比较两个 Float 数值
#-------------------------------------------------------------------------------
compare_float(){local a=$1local b=$2awk -va=$a -vb=$b 'BEGIN {if(a>b) printf("true"); else printf("false")}'
}compare_string(){local a=$1local b=$2awk -va=$a -vb=$b 'BEGIN {if(a!=b) printf("true"); else printf("false")}'
}#组合事件过滤条件echo "-----recorder started"
trap "echo  '= recoder stopped ='" SIGINT
#重启app
adb shell am force-stop $PACKAGE
adb shell am start -W -n $PACKAGE/$ACTIVITY
#获取输出事件并重定向到文件
adb shell getevent -t | grep -E --line-buffered "$DEVICE_NAME" >$t0file
echo "-=============$DEVICE_NAME"
#替换"[","]","/dev/input/event/",":"为空字符串
sed 's/\[//g;s/\]//g;s/\/dev\/input\/event//g;s/\://g' $t0file >$t1file
#把文件中的相关内容格式化
#正则解释:
#     1. awk - 转换 第3列 和 第4列 数值为十进制模式(因为ioctl接收的是十进制)
#     2. sed - 4294967295 实为 -1, 原因是-1为0xFFFF,FFFF(4294967295)
cat $t1file |\awk '{print $2, strtonum("0x"$3), strtonum("0x"$4), strtonum("0x"$5)}' |\sed 's/4294967295/-1/g' >$t0file#sleep_arry_line=()                              # 有睡眠操作的event
#sleep_arry_time=()                              # 保存睡眠时间
awk '{print $1}' $t1file >$t2file                # 抽取时间列,存至 $t2file
tstart=$(sed -n '1p' $t2file)
tend=$(sed -n '$p' $t2file)
tdiff=0
index=1
while read t; docase $t in$tstart|$tend )                         # 第一个时间和最后一个时间无需比较tdiff=0.000000;;* )prev=$(sed -n "$(($index-1)) p" $t2file)tdiff=$(awk -va=$t -vb=$prev 'BEGIN {printf("%lf\n",a-b)}');;esacecho "$tdiff "#sleep_arry_line+=($index)sleep_arry_time+=($(awk -va=$tdiff 'BEGIN {print a*1000000}'))((index++))
done < $t2file >$t1file    paste $t1file $t0file >$filerm $t0file $t1file $t2file
echo "-----Generate txt file, output file is [ $file ]"if ([[ $1 =~ "s" ]]); then# 两个event时间差# 因为一个触屏操作(如点击一下),需由多个event来组成mindiff=0.01shellfile="./out/cmds.sh"scmdfile="scmd.txt"ssleepfile="ssleep.txt"ssleepfinalfile="sleep.txt"awk '{print "sendevent /dev/input/event"$2" "$3" "$4" "$5}' $file >$scmdfile awk '{print $1}' $file >$ssleepfileindex=1while read t;doif $(compare_float $mindiff $t); thenecho ''else echo "sleep $t; "fidone < $ssleepfile > $ssleepfinalfilepaste $ssleepfinalfile $scmdfile >$shellfilerm $scmdfile $ssleepfinalfile $ssleepfileadb push ./out/cmds.sh /data/local/tmp/cmds.shecho "-----Generate shell file , output file is [ $shellfile ]"
fi
if ([[ $1 =~ "c" ]]); thenmodelcfile=template.c                           # 模板C语言文件targetcfile=./jni/cmds.ctcfile=tmpc.cmindiff=$(awk -F '=' '$1~/TIME_INTERVAL/{print $2;exit}' ./config.ini)currentdev="">$tcfilewhile read line; do                             # 输出临时C语言文件sleeptime=$(echo $line|awk '{print ($1)*1000000}')device=$(echo $line|awk '{print "/dev/input/event"$2}')type=$(echo $line|awk '{print $3}')code=$(echo $line|awk '{print $4}')value=$(echo $line|awk '{print $5}')if $(compare_float $sleeptime $mindiff); thenecho "    usleep($sleeptime);" >>$tcfilefiif $(compare_string $currentdev $device);then currentdev=$devicecat<<EOF >>$tcfileevent.type = $type;event.code = $code;event.value = ${value}u;fd = open("$device", O_RDWR);write(fd, &event, event_size);
EOFelsecat<<EOF >>$tcfileevent.type = $type;event.code = $code;event.value = ${value}u;write(fd, &event, event_size);
EOFfidone < $fileappend_line=55sed "$append_line r $tcfile" $modelcfile >$targetcfilerm $tcfileecho "-----Generate C file , output file is [ $targetcfile ]"#编译生成的c命令文件cd ./jnindk-buildcd ../cp ./libs/armeabi-v7a/cmds ./out/cmdsadb push ./out/cmds /data/local/tmp/cmdsrm -r ./libs ./obj
fi
#关闭app
adb shell am force-stop $PACKAGE
echo "-----Successfully, totally spent time: $SECONDS seconds"

replay

#apk信息
PACKAGE=$(awk -F '=' '$1~/PACKAGE/{print $2;exit}' ./config.ini)
ACTIVITY=$(awk -F '=' '$1~/LAUNCH_ACTIVITY/{print $2;exit}' ./config.ini)
#重启app
adb shell am force-stop $PACKAGE
adb shell am start -W -n $PACKAGE/$ACTIVITY
#回放事件
adb shell /data/local/tmp/cmds
#不同的手机权限系统不一样,如果你得手机需要root权限下才能运行回放命令,请替换为以下回放命令
#adb shell su -c busybox chmod 755 /data/local/tmp/cmds
#adb shell su -c /data/local/tmp/cmdsadb shell am force-stop $PACKAGE

ini

*******************************以下配置信息中不能有空格****************************************
#apk信息
PACKAGE="com.baidu.searchbox"
LAUNCH_ACTIVITY="com.baidu.searchbox.MainActivity"
#输入device信息,多个输入设备用“|”分隔
DEVICE_NAME=event2:|event9:
#两个事件之间的间隔,这个依据机器的性能而不同,需要手动设置,单位是微妙
TIME_INTERVAL=10000

相关文章:

通过ADB来实现脚本来控制手机

ADB 简介 adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟. 通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,…...

机器学习之K-means聚类

概念 K-means是一种常用的机器学习算法,用于聚类分析。聚类是一种无监督学习方法,它试图将数据集中的样本划分为具有相似特征的组(簇)。K-means算法的目标是将数据集划分为K个簇,其中每个样本属于与其最近的簇中心。 以下是K-means算法的基本步骤: 选择簇的数量(K值)…...

SSH 端口转发:如何将服务绑定到本地 IP 地址

在日常工作中&#xff0c;我们经常需要访问位于远程服务器上的服务&#xff0c;如数据库、Web 应用程序或其他类型的服务器。直接访问这些服务可能会因为安全限制或网络配置而变得复杂或不可能。这时&#xff0c;SSH 端口转发就成了我们的得力助手。在本篇博客中&#xff0c;我…...

回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 (多指标,多图)

回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实ZOA-LSTM基于斑马优化算法优化长短期记忆神经网络的多输入单输出数据回归预测模型 &#xff08;…...

python实现图像的二维傅里叶变换——冈萨雷斯数字图像处理

原理 二维傅里叶变换是一种在图像处理中常用的数学工具&#xff0c;它将图像从空间域&#xff08;我们通常看到的像素排列&#xff09;转换到频率域。这种变换揭示了图像的频率成分&#xff0c;有助于进行各种图像分析和处理&#xff0c;如滤波、图像增强、边缘检测等。 在数学…...

We are a team - 华为OD统一考试

OD统一考试 题解&#xff1a; Java / Python / C 题目描述 总共有 n 个人在机房&#xff0c;每个人有一个标号 (1<标号<n) &#xff0c;他们分成了多个团队&#xff0c;需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中&#xff0c;具体的: 消息构成为 a b …...

NFC物联网智慧校园解决方案

近场通信(Near Field Communication&#xff0c;NFC)又称近距离无线通信&#xff0c;是一种短距离的高频无线通信技术&#xff0c;允许电子设备之间进行非接触式点对点数据传输交换数据。这个技术由免接触式射频识别(RFID)发展而来&#xff0c;并兼容 RFID&#xff0c;主要用于…...

鸿蒙系列--组件介绍之容器组件

一、Badge 描述&#xff1a;给其他组件添加标记 子组件&#xff1a;支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…...

perl使用find函数踩坑

前言 写了一个脚本可以同时检查多个仿真log文件&#xff0c;并生成html表格。按照文件修改时间从新到旧排序。但是一直无法使用stat函数获取修改时间。 结论&#xff1a;find函数会改变程序执行的当前目录&#xff0c;find(\&process_files, $dir);函数是在$dir目录下运行…...

Java IDEA JUnit 单元测试

JUnit是一个开源的 Java 单元测试框架&#xff0c;它使得组织和运行测试代码变得非常简单&#xff0c;利用JUnit可以轻松地编写和执行单元测试&#xff0c;并且可以清楚地看到哪些测试成功&#xff0c;哪些失败 JUnit 还提供了生成测试报告的功能&#xff0c;报告不仅包含测试…...

深入理解 c++ 函数模板

函数模板是C中的一种强大特性&#xff0c;它允许程序员编写一个可以处理多种数据类型的函数。通过使用模板&#xff0c;我们可以编写一次函数&#xff0c;然后在多种数据类型上使用它&#xff0c;这大大提高了代码的复用性。 1. 基本概念 函数模板是一种参数化类型的工具&…...

系列十二、Linux中安装Zookeeper

一、Linux中安装Zookeeper 1.1、下载安装包 官网&#xff1a;Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码&#xff1a;yyds 1.2、上传至/opt目录 1.3、解…...

k8s之陈述式资源管理

1.kubectl命令 kubectl version 查看k8s的版本 kubectl api-resources 查看所有api的资源对象的名称 kubectl cluster-info 查看k8s的集群信息 kubectl get cs 查看master节点的状态 kubectl get pod 查看默认命名空间内的pod的信息 kubectl get ns 查看当前集群所有的命…...

7天玩转 Golang 标准库之 http/net

在构建web应用时&#xff0c;我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务&#xff0c;而Go语言在这方面为我们提供了强大的内置工具&#xff1a;net/http标准库&#xff0c;它为我们操作和处理HTTP协议提供了便利。 基础用法 一&#xff1a;处理HTTP请求 首…...

钡铼技术集IO数据采集可编程逻辑控制PLC无线4G环保物联网关

背景 数据采集传输对于环保企业进行分析和决策是十分重要的&#xff0c;而实时数据采集更能提升环保生产的执行力度&#xff0c;从而采取到更加及时高效的措施。因此实时数据采集RTU成为环保企业的必备产品之一。 产品介绍 在推进环保行业物联网升级过程中&#xff0c;环保RTU在…...

STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1 、时钟树配置 3.1.2、外设参数配置 3.1.3 、外设中断配置 3.2、生成代码 3.2.1、外设初始化函数调用流程 3.2.2、外设中断函数调用流程 3.2.3、添加其他必要代码 4、常用函数 …...

HarmonyOS4.0系统性深入开发08服务卡片架构

服务卡片概述 服务卡片&#xff08;以下简称“卡片”&#xff09;是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用&#xff08;当前卡片使用方只支持系统应用&#xff0c;如桌…...

002文章解读与程序——中国电机工程学报EI\CSCD\北大核心《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机优化》已提供下载资源

&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;&#x1f446;下载资源链接&#x1f4…...

Typora快捷键设置详细教程

文章目录 一、快捷键设置步骤二、设置快捷键简单案例参考资料 一、快捷键设置步骤 在typora软件中&#xff0c;快捷键的设置步骤主要为&#xff1a; 打开【文件】–>【偏好设置】&#xff0c;找到【通用】–>【打开高级设置】&#xff0c;找到 conf.user.json 文件。 然…...

《异常检测——从经典算法到深度学习》25 基于深度隔离林的异常检测算法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...