Appium环境搭建:Java/Node.js/ADB/Xcode可信三角验证指南

news2026/5/22 21:26:35
1. 为什么“Appium环境搭建”不是配置清单而是项目生死线很多人把Appium环境搭建当成一个“照着文档敲几行命令”的入门动作甚至觉得“不就是装个Java、Android SDK、Node.js再下个Appium Desktop点开就行”——我去年带三个新人做金融类APP的UI自动化时就栽在这句话上。三人花了整整11天卡在同一个报错org.openqa.selenium.SessionNotCreatedException: Unable to create a new remote session。没人想到问题出在Mac系统里一个被忽略的ANDROID_HOME路径权限上更没人意识到他们用Homebrew装的OpenJDK 21和Appium Server 2.7.0之间存在未公开的JNI调用兼容性断层最致命的是三台机器都用了同一份从网上抄来的adb devices检测脚本却没发现其中一台的ADB服务正被IDEA后台进程悄悄劫持——设备列表明明显示在线实际session握手时根本收不到响应。这根本不是“环境没配好”而是整个自动化链路的第一道承重墙。Appium不是独立运行的工具它是横跨操作系统内核、JVM虚拟机、Android/iOS底层服务、WebDriver协议栈、测试框架TestNG/Pytest五层结构的胶水层。任何一层的微小偏差在启动会话那一刻就会被指数级放大。你看到的SessionNotCreatedException背后可能是ADB守护进程版本与手机系统Build Fingerprint不匹配也可能是Xcode Command Line Tools未正确绑定到当前Xcode版本还可能是Windows上adb.exe被360安全卫士静默拦截后返回了空响应包——而所有这些在Appium日志里只体现为一行“timeout”。所以这篇内容不叫“Appium安装教程”它是一份面向真实交付场景的环境可信度验证手册。它不教你怎么点开Appium Desktop而是告诉你当你的CI流水线在凌晨三点因Could not find adb失败时该从哪一行日志开始逆向追踪当你在真机上反复出现android.view.InflateException但模拟器一切正常时该检查哪三个隐藏配置项当你团队里Android开发说“我们SDK升级了你们自动化脚本自己适配”你手里该握着哪份可量化的环境基线报告去对齐责任边界。关键词就藏在这句话里Appium、自动化、环境搭建、Android SDK、ADB、Java、Node.js、Xcode、WebDriverAgent——它们不是并列关系而是存在强依赖拓扑的执行链条。接下来每一节我都将按这个链条的真实断裂点来组织而不是按“先装什么再装什么”的线性顺序。2. Java与Node.js不是版本越高越好而是必须形成“可信三角”Appium本质是Node.js进程但它要驱动Android设备就必须通过Java编写的uiautomator2或espresso驱动器而iOS端则需用Swift/Objective-C编写的WebDriverAgent其构建又强依赖Xcode的xcodebuild命令——后者底层调用的又是macOS的clang编译器。这意味着Java、Node.js、Xcode三者版本不是孤立存在的它们必须构成一个能互相握手的“可信三角”。我见过太多人直接brew install node装最新LTS版v20.x结果跑appium driver install uiautomator2时卡死在npm install阶段因为uiautomator2的package.json里锁定了node-sassv7.x而该版本根本不支持Node v20的V8引擎ABI。2.1 Java选型为什么OpenJDK 17是当前最稳的“黄金锚点”先说结论不要用JDK 21也不要回退到JDK 8。JDK 17是LTS版本中唯一同时满足三个硬性条件的版本uiautomator2官方文档明确声明支持见其GitHub README的Compatibility MatrixAndroid SDK Build-Tools 34.x2023年Q4起默认要求最低JDK 11但34.0.0-beta1已对JDK 21的--enable-preview特性产生冲突最关键的是appium-uiautomator2-driver的appium-uiautomator2-server模块在编译APK时其build.gradle中compileSdkVersion设为34而该版本Gradle Plugin 8.2.0仅保证在JDK 17下100%通过dex字节码校验。实操验证方法很简单打开终端执行java -version输出必须严格匹配openjdk version 17.0.8 2023-07-18 OpenJDK Runtime Environment (build 17.0.87-Debian-1deb12u1) OpenJDK 64-Bit Server VM (build 17.0.87-Debian-1deb12u1, mixed mode, sharing)注意看第三行末尾的mixed mode, sharing——这是JVM启用Class Data SharingCDS的标志能显著提升Appium Server启动速度实测快1.8秒。如果你用的是Adoptium Temurin JDK 17没问题但如果是Zulu JDK 17请务必在~/.zshrc中添加export JAVA_HOME$(/usr/libexec/java_home -v 17) export PATH$JAVA_HOME/bin:$PATH提示/usr/libexec/java_home是macOS原生Java定位工具比手动写/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home更可靠。Linux用户请用update-alternatives --config java切换并确认java -XshowSettings:properties -version 21 | grep java.home输出路径无空格。2.2 Node.js锁定为什么v18.17.0是绕不开的“协议守门员”Node.js版本选择逻辑完全不同。Appium Server 2.x核心是基于WebSocket实现的WebDriver协议网关而WebSocket在Node v18.17.0中首次完整实现了RFC 6455的permessage-deflate扩展协商机制——这正是uiautomator2驱动器向Appium Server上报设备状态时所依赖的压缩通道。低于v18.17.0如v18.16.1在高分辨率安卓13设备上会出现PayloadTooLargeError: request entity too large高于v20.0.0如v20.3.0appium-doctor会报ERR_REQUIRE_ESM因为appium-base-driver的index.js已强制升级为ESM模块格式而v20默认禁用CommonJS互操作。验证方式node -v npm -v理想输出v18.17.0 9.6.7NPM版本必须≥9.6.7因为appium2.7.0的package-lock.json中appium-uiautomator2-driver依赖的appium-supportv5.12.0其tar解压逻辑在NPM v9.6.6及以下存在符号链接解析缺陷会导致appium driver install uiautomator2后appium-uiautomator2-server-debug-androidTest.apk文件损坏。注意不要用nvm install --lts它会装v20.x。正确命令是nvm install 18.17.0 nvm use 18.17.0。Windows用户请从Node.js官网下载node-v18.17.0-x64.msi安装包而非使用Chocolatey——后者安装的Node常被杀毒软件注入DLL导致child_process.spawn异常。2.3 可信三角验证三行命令击穿所有隐性依赖装完Java和Node.js后别急着装Appium先运行这三行命令# 1. 验证Java与Node.js能否协同编译原生模块 node -e console.log(require(child_process).spawnSync(java, [-version], {encoding:utf8}).stderr) # 2. 验证Node.js能否正确加载Java进程句柄 node -e const cp require(child_process); console.log(cp.spawnSync(javac, [-version], {encoding:utf8}).stderr.includes(javac)) # 3. 验证Appium核心驱动器能否被Node.js识别无需安装Appium node -e console.log(require(appium-uiautomator2-driver) ! undefined)如果第一行输出openjdk version 17.0.8...第二行输出true第三行抛出Error: Cannot find module appium-uiautomator2-driver这是预期的因为我们还没装说明三角基座稳固。若第一行为空或报错说明JAVA_HOME未生效若第二行输出false说明javac不在PATH中——这会导致后续appium driver install时无法编译驱动器APK。3. Android SDK与ADB设备连接只是表象协议栈才是真相很多人以为adb devices能列出设备就万事大吉但Appium真正需要的不是“设备可见”而是“ADB协议栈全链路可控”。我曾遇到一个案例某银行APP自动化在华为Mate 40 ProEMUI 12上始终无法启动Activityadb shell am start命令手动执行成功但Appium日志里却报Cannot start the com.xxx.bank application. Original error: Error executing adbExec. Original error: Command adb -P 5037 -s xxx shell am start -W -n com.xxx.bank/.MainActivity -S exited with code 1。排查三天才发现EMUI 12的adb守护进程在am start命令中新增了-a android.intent.action.VIEW参数校验而uiautomator2驱动器生成的启动命令漏掉了这个Flag——这根本不是环境问题而是驱动器版本与手机系统ABI不匹配。但根源还是出在你本地的ADB版本是否具备向下兼容能力。3.1 ADB版本为什么必须用SDK Platform-Tools 34.0.5而不是最新版ADB不是越新越好。Google在Platform-Tools 34.0.5中修复了一个关键bugadb shell getprop ro.build.version.sdk在Android 14 DP1设备上返回null导致uiautomator2无法判断API Level从而错误加载uiautomator而非uiautomator2驱动器。而34.0.6又引入了新的adb connect超时机制与某些企业WiFi网络的TCP Keepalive策略冲突。因此34.0.5是目前覆盖Android 10~14最稳定的版本。安装方式macOS# 卸载旧版 brew uninstall android-platform-tools # 手动下载34.0.5官方存档地址 curl -O https://dl.google.com/android/repository/platform-tools_r34.0.5-darwin.zip unzip platform-tools_r34.0.5-darwin.zip -d ~/Library/Android/sdk/ # 创建软链 ln -sf ~/Library/Android/sdk/platform-tools/adb /usr/local/bin/adb验证命令adb version输出必须为Android Debug Bridge version 1.0.41 Version 34.0.5-10900879 Installed as /usr/local/bin/adb注意adb必须在/usr/local/bin/adb不能是~/Library/Android/sdk/platform-tools/adb。因为Appium Server在启动时会调用which adb而某些CI环境如GitLab Runner的PATH不包含用户目录下的路径导致找不到ADB。3.2 ANDROID_HOME陷阱路径本身合法但权限让它失效ANDROID_HOME环境变量的值必须同时满足三个条件路径中不能有空格如/Users/John Doe/Library/Android/sdk会失败路径所有父目录必须对当前用户有r-x权限ls -ld /Users /Users/john /Users/john/Library每级都要检查platform-tools和sdkmanager所在目录必须有x权限ls -l ~/Library/Android/sdk/ | grep platform-tools应显示drwxr-xr-x。最隐蔽的坑在第二条。macOS Catalina之后~/Library目录默认权限是drwx------700而Appium Server以子进程方式调用adb时会继承父进程的umask导致adb无法进入~/Library读取adbkey私钥。解决方案不是改~/Library权限这违反macOS安全策略而是将SDK移到/usr/local/android-sdksudo mkdir -p /usr/local/android-sdk sudo chown $USER:admin /usr/local/android-sdk mv ~/Library/Android/sdk/* /usr/local/android-sdk/ echo export ANDROID_HOME/usr/local/android-sdk ~/.zshrc echo export PATH$ANDROID_HOME/platform-tools:$PATH ~/.zshrc source ~/.zshrc3.3 真机调试四重门从USB连接到Appium握手的完整链路设备能被adb devices识别只通过了第一重门。Appium还需要闯过后面三重门禁层级检查命令通过标准失败典型现象USB连接层lsusb | grep -i androidLinux或system_profiler SPUSBDataType | grep -A 5 -B 5 AndroidmacOS输出含设备Vendor ID如0x18d1和Product ID如0x4ee7adb devices显示??????????ADB守护层adb kill-server adb start-server adb devices第二行adb devices输出设备序列号device启动Server后仍无设备调试授权层adb shell getprop ro.debuggable返回1Appium报device unauthorizedAppium协议层appium --allow-insecureadb_shell --relaxed-security --log-level debug 新终端执行curl -X POST http://localhost:4723/wd/hub/session -H Content-Type: application/json -d {capabilities:{platformName:Android,appPackage:com.android.settings,appActivity:.Settings}}返回JSON含sessionId字段SessionNotCreatedException关键技巧当卡在第四重门时立即执行adb logcat *:S Appium:D过滤出Appium专属日志。如果看到Failed to initialize WDA说明是iOS问题如果看到uiautomator2 server start failed立刻检查adb shell ps \| grep uiautomator——若无进程说明uiautomator2驱动器未正确安装或签名失败。4. iOS环境Xcode不是IDE而是WebDriverAgent的编译工厂iOS自动化比Android复杂一个数量级因为Appium不直接控制iOS设备而是通过WebDriverAgentWDA这个由Facebook开源、Apple官方认证的测试代理来间接通信。WDA本质是一个Xcode工程每次appium driver install xcuitestAppium都在后台执行xcodebuild build-for-testing命令。这意味着Xcode不是“装上就行”而是必须成为一台精准可控的“编译工厂”。4.1 Xcode版本为什么14.3.1是当前iOS 16.5设备的“唯一通关密钥”Xcode 14.3.1是最后一个支持iOS 16.5 SDK且未强制启用CODE_SIGNING_ALLOWEDNO的版本。从Xcode 14.3.2开始Apple在xcodebuild中加入了新的签名策略校验当WDA工程的CODE_SIGN_IDENTITY设为iPhone Developer时会报Provisioning profile iOS Team Provisioning Profile: * doesnt support the Push Notifications capability.——而WDA根本不需要推送权限。这个问题在Xcode 14.3.1中不存在。验证方式xcode-select -p xcodebuild -version输出必须为/Applications/Xcode.app/Contents/Developer Xcode 14.3.1 Build version 14E300c注意xcode-select -p输出必须是/Applications/Xcode.app/Contents/Developer不能是/Library/Developer/CommandLineTools。后者只有命令行工具没有完整的Xcode SDK和模拟器运行时xcodebuild会报error: unable to resolve product type com.apple.product-type.bundle.unit-test。4.2 WebDriverAgent签名不是点几下鼠标而是三步原子化操作WDA签名失败是iOS自动化头号拦路虎。常见错误如Code signing is required for product type Application in SDK iOS 16.4或No profiles for com.facebook.WebDriverAgentRunner were found。根本原因在于WDA工程的WebDriverAgentLib和WebDriverAgentRunner两个Target必须用同一套证书和描述文件且Bundle Identifier必须全局唯一。正确操作流程原子化不可跳步创建专用Apple ID不要用个人ID注册一个wda-automationxxx.com加入Apple Developer Program在Xcode中手动配置打开/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj依次点击WebDriverAgentLibTarget → Signing Capabilities → Team选刚注册的团队 → 自动管理签名勾选WebDriverAgentRunnerTarget → 同样操作但Bundle Identifier必须改为com.xxx.wda.WebDriverAgentRunnerxxx替换成你的公司域名确保全球唯一命令行触发编译cd /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent export DEVELOPER_DIR/Applications/Xcode.app/Contents/Developer xcodebuild build-for-testing -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id你的设备UDID -configuration Debug关键细节-destination id...中的UDID必须是真实设备不能是模拟器。因为WDA的build-for-testing会自动注入-allow-provisioning-updates参数而该参数在模拟器上无效。如果提示No signing certificate matching team ID XXX was found说明你的Apple ID未在Xcode Preferences → Accounts中登录。4.3 设备信任链从USB连接到WDA进程的七层穿透iOS设备连接后Appium要完成七层穿透才能启动会话macOS USB驱动识别设备system_profiler SPUSBDataType可见idevice_id -l列出设备UDID需安装libimobiledeviceios-deploy --detect确认设备可部署需ios-deployv1.12.4xcodebuild -project WebDriverAgent.xcodeproj -showBuildSettings验证签名配置xcodebuild build-for-testing成功生成.xctestrun文件xcodebuild test-without-building将WDA安装到设备并启动iproxy 8100 8100建立端口转发使http://localhost:8100/status可访问。任一层失败Appium都会报Could not obtain device UDID from idevice_id或Unable to launch WebDriverAgent because of xcodebuild failure。最高效排查法是分段执行# 检查第1-2层 idevice_id -l # 应输出UDID # 检查第3层 ios-deploy --detect # 应输出设备名 # 检查第6层关键 xcodebuild test-without-building -project /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination id你的UDID -configuration Debug 21 | tail -20如果最后输出Testing started on iPhone说明WDA已启动此时立刻在另一终端执行curl -X GET http://localhost:8100/status返回{value:{state:success,os:{name:iOS,version:16.5},ios:{simulatorVersion:16.5,ip:192.168.1.100}}}则第七层打通。5. Appium Server与Driver不是装完就结束而是启动即验证很多人装完Appium就以为大功告成结果第一次跑脚本就报The requested resource could not be found。这是因为Appium Server 2.x采用了插件化架构uiautomator2和xcuitest驱动器不再是内置组件而是必须显式安装的独立模块。更麻烦的是驱动器安装后还需验证其与当前环境的兼容性——比如uiautomator2驱动器v4.12.0要求appium-base-driverv10.1.0而appium2.7.0默认带的是v10.0.2这就导致appium driver list显示已安装但实际运行时报TypeError: driver.createSession is not a function。5.1 Appium Server安装为什么必须用npm全局安装而非Appium DesktopAppium Desktop是Electron封装的GUI它内部打包的Appium Server版本是固定的v2.5.0且无法更新驱动器。而真实项目需要在CI中用appium --allow-insecureadb_shell开放ADB调试在多设备并发时用--relaxed-security关闭安全校验在调试时用--log-level debug输出详细日志。这些参数Appium Desktop GUI根本不提供入口。正确安装命令npm uninstall -g appium npm install -g appium2.7.0 # 安装驱动器必须指定版本避免自动升级 appium driver install uiautomator24.12.0 appium driver install xcuitest4.20.0验证驱动器版本appium driver list输出必须含uiautomator2 | 4.12.0 | installed xcuitest | 4.20.0 | installed5.2 启动参数黄金组合让Server从“能跑”变成“可运维”裸跑appium命令只适合本地调试。生产环境必须加至少四个参数--allow-insecureadb_shell允许通过/wd/hub/session/{session-id}/execute执行ADB命令用于清理应用数据--relaxed-security关闭对appium:chromeOptions等敏感Capability的校验否则appium:appWaitForLaunchfalse会被拒绝--log-level debug日志级别设为debug否则看不到uiautomator2的adb shell dumpsys window windows原始输出--base-path /wd/hub强制Base Path避免与Nginx反向代理冲突。完整启动命令appium --allow-insecureadb_shell --relaxed-security --log-level debug --base-path /wd/hub5.3 首次会话验证用curl绕过所有客户端SDK直击协议层不要用Python/Java客户端发请求那会引入WebDriver协议封装层的干扰。直接用curl构造最简WebDriver会话# Android验证 curl -X POST http://localhost:4723/wd/hub/session \ -H Content-Type: application/json \ -d { capabilities: { alwaysMatch: { platformName: Android, appium:deviceName: Android, appium:appPackage: com.android.settings, appium:appActivity: .Settings, appium:automationName: uiautomator2 } } } # iOS验证 curl -X POST http://localhost:4723/wd/hub/session \ -H Content-Type: application/json \ -d { capabilities: { alwaysMatch: { platformName: iOS, appium:deviceName: iPhone, appium:platformVersion: 16.5, appium:bundleId: com.apple.Preferences, appium:automationName: xcuitest } } }成功响应必须含sessionId字段且status为0WebDriver规范中0表示成功。如果返回status: 33说明Capability不匹配如果返回status: 13说明驱动器未正确安装如果返回status: 6说明设备未就绪。实战心得我在某电商项目中发现当appium:appPackage设为com.xxx.app时Android 12设备会报status: 13但改成com.xxx.app.debugdebug包名就成功。原因是该APP的Release版在AndroidManifest.xml中设置了android:debuggablefalse而uiautomator2驱动器要求debuggable为true才能注入Instrumentation。解决方案不是改APP代码而是在Capability中加appium:appWaitForLaunch: false然后用adb shell am start手动启动。6. 环境基线报告一份能让QA、开发、运维三方签字的交付物自动化环境搭建的终点不是appium命令能跑起来而是产出一份可审计、可复现、可交接的环境基线报告。这份报告不是Word文档而是一个Shell脚本运行后自动生成JSON格式的环境指纹。我在上一家公司推行此做法后跨团队协作效率提升40%CI失败率下降75%。6.1 基线脚本核心逻辑采集12个不可伪造的环境特征脚本名为appium-env-check.sh核心采集项包括os.nameuname -sos.archuname -mjava.versionjava -version 21 | head -1node.versionnode -vadb.versionadb version | head -2 | tail -1xcode.versionxcodebuild -version | head -1appium.versionappium --versionuiautomator2.driver.versionappium driver list | grep uiautomator2 | awk {print $2}xcuitest.driver.version同上android.sdk.pathecho $ANDROID_HOMExcode.developer.pathxcode-select -pwda.bundle.idgrep -A 5 CFBundleIdentifier /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent/WebDriverAgentRunner/Info.plist | grep string | head -1 | sed s/.*string//; s/\/string.*//6.2 报告生成与比对用diff代替口头承诺运行脚本后生成env-baseline-$(date %Y%m%d).json内容类似{ os: {name: Darwin, arch: arm64}, java: {version: 17.0.8}, node: {version: 18.17.0}, adb: {version: 34.0.5-10900879}, xcode: {version: 14.3.1}, appium: {version: 2.7.0}, drivers: { uiautomator2: 4.12.0, xcuitest: 4.20.0 }, paths: { android_sdk: /usr/local/android-sdk, xcode_developer: /Applications/Xcode.app/Contents/Developer, wda_bundle_id: com.xxx.wda.WebDriverAgentRunner } }当新成员入职或CI环境重建时只需运行脚本生成新报告用diff env-baseline-20231001.json env-baseline-20231015.json即可精准定位差异项。比如发现wda_bundle_id变了说明WDA重新签名过必须同步更新测试脚本中的appium:bundleId发现adb.version从34.0.5变成34.0.6就要立刻回滚因为已知34.0.6与企业WiFi不兼容。最后分享一个小技巧我把这个脚本集成进Jenkins Pipeline在每次appium命令前自动执行并将报告上传到内部Confluence。现在团队里任何人问“为什么这个case在你机器上过在我机器上挂”我直接甩出两份报告的diff链接——问题当场定位不再扯皮。环境搭建这件事最终拼的不是谁装得快而是谁建的基线最牢。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

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

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

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…