AutoJS强制关闭APP:Android自动化测试中的进程终止策略
1. 项目概述为什么需要强制关闭APP在移动端自动化测试、数据采集或者日常任务脚本中我们经常会遇到一个看似简单却颇为棘手的问题如何彻底、可靠地关闭一个目标应用程序尤其是在使用AutoJS这类基于Android无障碍服务的自动化工具时仅仅模拟按下“返回键”或“Home键”往往是不够的。这些操作可能只是将应用置于后台其进程依然在运行占用着内存甚至可能继续执行某些后台任务干扰后续的自动化流程。比如你需要反复测试一个金融APP的登录流程如果每次测试后应用没有完全退出残留的登录状态缓存可能会导致下一次测试直接从主页面开始无法验证完整的冷启动登录逻辑。这就是“强制关闭APP”成为AutoJS脚本中一个关键技巧的原因。它不仅仅是模拟一个点击动作而是需要理解Android应用的生命周期管理机制并找到一种能够稳定、跨版本地将应用进程终止的方法。对于需要批量处理、循环执行或者对应用状态有严格要求的自动化场景掌握可靠的强制关闭方法是保证脚本稳定性和结果准确性的基石。本文将深入探讨在AutoJS环境下实现这一目标的各种策略、背后的原理以及在实际操作中可能遇到的“坑”和应对技巧。2. 理解Android应用的生命周期与关闭层级在动手写代码之前我们必须先搞清楚我们要“关闭”的是什么。在Android系统中一个应用的“关闭”可以发生在多个层级理解这些层级是选择正确方法的前提。2.1 应用的活动Activity栈与任务Task当我们点击一个APP图标系统会启动该应用的一个主Activity并放入一个任务栈中。用户随后进行的页面跳转新的Activity会被压入同一个栈。按下“返回键”栈顶的Activity被销毁并出栈用户回到上一个页面。当栈中最后一个Activity被销毁这个任务在用户界面上就“消失”了。但是任务的前台消失不等于应用进程的终结。Android系统为了提升用户体验和启动速度采用了积极的进程缓存策略。一个没有前台Activity的应用进程可能会被系统保留在“后台进程”或“缓存进程”列表中等待下一次被快速唤醒。2.2 模拟用户操作的局限性AutoJS最常用的back()函数和home()函数就是在这个层级进行操作。back()模拟按下物理返回键。它的效果是关闭当前Activity。如果当前Activity是任务栈中的最后一个那么任务会退到后台应用进程可能依然存活。home()模拟按下Home键。它的效果是将当前任务整个应用切换到后台并显示桌面。应用的所有Activity都进入“已停止”状态但进程几乎肯定被保留。因此仅靠back()和home()我们无法保证目标应用被彻底关闭。我们需要寻找能够触及进程管理层面的方法。2.3 真正的“强制关闭”意味着什么我们所说的“强制关闭”在Android语境下通常指的是以下两种效果之一从最近任务列表中移除清除该应用在系统“最近任务”多任务视图中的预览卡片。这通常也会触发系统更积极地回收该进程。强制停止Force Stop这是一种更彻底的操作。它会立即终止与应用关联的所有进程取消所有挂起的闹钟Alarms停止所有服务Services并移除所有通知Notifications。应用会被置于一个“完全停止”的状态直到用户再次显式启动它。这相当于用户在系统设置中点击了“强制停止”按钮。我们的目标就是通过AutoJS脚本自动化地实现上述效果尤其是第二种。3. 基于无障碍服务AutoJS的常规关闭方法首先我们看看如何利用AutoJS本身提供的无障碍操作模拟用户手势来完成关闭。这是最直观、兼容性相对较好的方法。3.1 模拟多任务视图与上滑清除这是最接近普通用户操作的方法。思路是启动目标应用 - 模拟打开多任务视图最近任务列表 - 找到目标应用的卡片 - 执行上滑或点击关闭动作。// 假设我们要关闭包名为 com.example.targetapp 的应用 let targetPackageName “com.example.targetapp”; // 1. 启动应用确保它在最近任务列表中 launchApp(targetPackageName); sleep(2000); // 等待应用完全启动 // 2. 模拟打开最近任务列表方式因手机厂商而异 // 常见方式模拟按下“最近任务”键三横线或方形键 keyCode(187); // KEYCODE_APP_SWITCH 最近任务键 // 如果keyCode(187)无效可以尝试模拟手势例如从屏幕底部上滑停顿 // gestures([0, [device.height-50, device.height-10], [device.width/2, device.height/2]], 500); sleep(1000); // 等待最近任务列表动画完成 // 3. 在最近任务列表中寻找目标应用卡片 // 这里需要根据你的手机UI进行适配。核心是找到卡片的关闭按钮通常是“X”或上滑区域。 // 方法A通过文本或描述查找关闭按钮不稳定UI差异大 // let closeBtn text(“关闭”).findOne(1000); // if(closeBtn) closeBtn.click(); // 方法B通过坐标或手势模拟上滑更通用 // 首先我们需要定位到目标应用的卡片。一个取巧的方法是最近任务列表通常按时间倒序排列第一个卡片就是刚刚启动的应用。 // 我们可以尝试点击卡片区域将其置顶然后上滑。 // 假设卡片从屏幕中部开始显示 let cardCenterX device.width / 2; let cardCenterY device.height / 2.5; // 第一个卡片的大致中心Y坐标 click(cardCenterX, cardCenterY); // 点击卡片确保它被选中某些UI需要 sleep(300); // 模拟上滑手势来关闭卡片 // 起始点在卡片内部结束点在屏幕顶部或底部之外 let startY cardCenterY 200; // 起始点在卡片下半部分 let endY -100; // 结束点在屏幕顶部之外向上滑出屏幕 swipe(cardCenterX, startY, cardCenterX, endY, 500); // 快速上滑 // 4. 关闭最近任务列表回到桌面 keyCode(3); // KEYCODE_HOME 主页键注意这个方法的最大问题是极强的设备/系统UI依赖性。不同手机品牌小米、华为、OPPO、vivo、三星等甚至同一品牌的不同系统版本其最近任务列表的交互方式是上滑关闭还是点击“X”关闭、动画效果、控件布局都完全不同。上述代码只是一个概念示例在实际项目中你需要为你测试的特定设备编写特定的查找和操作逻辑甚至需要准备多套方案。这通常通过device.brand和device.releaseAndroid版本来做条件分支。3.2 利用应用信息页面的“强制停止”按钮这是一个相对更稳定的方法因为系统设置中的应用信息界面是Android标准组件不同厂商的定制相对较少。思路是跳转到目标应用的系统设置详情页 - 点击“强制停止” - 确认。我们可以使用Android的amActivity Manager命令通过AutoJS的shell函数来启动这个界面。let targetPackageName “com.example.targetapp”; // 方法使用am命令直接打开应用信息页面 // 通用Intent action: android.settings.APPLICATION_DETAILS_SETTINGS let command am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:${targetPackageName}; shell(command, true); // 第二个参数true表示等待命令完成 sleep(2000); // 等待设置页面加载 // 现在我们需要在应用信息页面找到“强制停止”按钮并点击 // 这个按钮的文本通常是“强制停止”、“强行停止”或英文“Force stop” let forceStopBtn null; // 尝试多种可能的文本 let possibleTexts [“强制停止”, “强行停止”, “Force stop”]; for (let text of possibleTexts) { forceStopBtn text(text).findOne(500); if (forceStopBtn) { break; } } if (forceStopBtn) { forceStopBtn.click(); sleep(1000); // 等待确认对话框弹出 // 处理确认对话框通常是“确定”或“OK”按钮 let confirmBtn text(“确定”).findOne(500) || text(“OK”).findOne(500) || className(“android.widget.Button”).depth(10).findOne(500); if (confirmBtn) { confirmBtn.click(); toast(“已强制停止 ” targetPackageName); } else { toast(“未找到确认按钮强制停止可能未成功”); } } else { toast(“在应用信息页面未找到‘强制停止’按钮”); // 可以尝试滚动查找 scrollDown(); // AutoJS的滚动函数 sleep(1000); // 再次查找... } // 最后返回桌面 keyCode(3); // HOME实操心得这种方法比操作最近任务列表稳定得多。但需要注意两点第一有些厂商的ROM可能会隐藏或移除“强制停止”按钮特别是对于系统核心应用。第二从Android 10API 29开始对后台活动启动有了更严格的限制直接从非系统应用通过am start跳转到系统设置页面的行为可能会被阻止或没有效果。不过AutoJS本身拥有较高的无障碍权限在多数设备上仍可执行。4. 使用ADB命令实现终极强制关闭如果无障碍UI操作因为碎片化问题而举步维艰那么使用ADBAndroid Debug Bridge命令就是更底层、更强大的终极方案。AutoJS可以通过shell()函数执行ADB命令前提是设备已开启USB调试或无线调试并且AutoJS被授予了相应的Shell权限。4.1 通过am force-stop命令这是最直接、最有效的强制停止命令它模拟了系统设置中“强制停止”按钮的效果。let targetPackageName “com.example.targetapp”; let command am force-stop ${targetPackageName}; let result shell(command, true); if (result.code 0) { toast(“命令执行成功应用已被强制停止”); } else { toast(“命令执行失败: ” result.error); }这条命令的强大之处在于无需界面交互直接在系统层面操作无视任何UI差异。立即生效命令执行后应用进程会被立刻终止。权限要求需要Shell权限。在已Root的设备上或者通过adb tcpip等方式授予了AutoJS相应权限的设备上可以完美运行。4.2 通过pm clear命令pm clear命令比am force-stop更加“暴力”。它不仅会强制停止应用还会清除该应用的所有数据包括用户设置、登录状态、数据库、缓存等将应用恢复到首次安装时的状态。let targetPackageName “com.example.targetapp”; // 警告此操作会清空应用所有数据请谨慎使用 // let command pm clear ${targetPackageName}; // shell(command, true);重要警告除非你的自动化测试场景明确需要每次都以纯净状态启动应用例如性能基准测试、安装后首次启动测试否则绝对不要在常规脚本中使用pm clear。它会摧毁所有用户数据可能导致无法挽回的损失。4.3 通过kill命令这是最底层的进程操作命令。你需要先找到目标应用进程的PID进程ID然后发送KILL信号。let targetPackageName “com.example.targetapp”; // 1. 通过ps命令查找进程PID let psCommand ps -A | grep ${targetPackageName}; let psResult shell(psCommand, true); let pid null; if (psResult.code 0 psResult.result) { let lines psResult.result.split(“\n”); for (let line of lines) { if (line.includes(targetPackageName)) { let parts line.trim().split(/\s/); pid parts[1]; // 通常PID在第二列 break; } } } // 2. 如果找到PID则kill掉 if (pid) { let killCommand kill -9 ${pid}; // -9 是SIGKILL信号强制立即终止 shell(killCommand, true); toast(“已终止进程PID: ” pid); } else { toast(“未找到运行中的进程”); }为什么kill不是首选因为am force-stop是Android框架提供的标准API它会按照Android的生命周期规范来妥善处理应用的停止过程停止服务、移除闹钟等。而kill -9是Linux层面的暴力清除可能绕过一些生命周期回调在某些极端情况下可能导致数据损坏或状态不一致。因此am force-stop是更推荐的方式。5. 实战中的策略组合与兼容性处理在实际编写健壮的AutoJS脚本时我们很少只依赖单一方法。一个良好的强制关闭策略应该是分层的、具有容错能力的。5.1 一个鲁棒的强制关闭函数实现下面是一个综合了多种方法的示例函数它按优先级尝试确保在大多数环境下都能成功。/** * 强制关闭指定包名的应用 * param {string} packageName - 目标应用的包名 * param {boolean} useAdbFirst - 是否优先尝试ADB命令需要相应权限 */ function forceCloseApp(packageName, useAdbFirst true) { toastLog(“开始强制关闭应用: ” packageName); // 策略1优先使用ADB命令如果允许且可用 if (useAdbFirst) { let result shell(am force-stop ${packageName}, true); if (result.code 0) { toastLog(“[ADB] am force-stop 命令执行成功”); sleep(1500); // 等待进程完全终止 return true; } else { toastLog(“[ADB] 命令失败尝试备用方案: ” result.error); } } // 策略2尝试通过系统设置界面强制停止 toastLog(“尝试通过应用信息界面操作…”); try { // 跳转到应用详情页 shell(am start -a android.settings.APPLICATION_DETAILS_SETTINGS -d package:${packageName}, true); sleep(2500); // 等待页面加载时间可适当延长 // 查找并点击“强制停止”按钮 let forceStopTexts [“强制停止”, “强行停止”, “Force stop”]; let btnFound false; for (let text of forceStopTexts) { let btn text(text).findOne(800); if (btn) { btn.click(); sleep(1200); // 等待确认弹窗 // 查找确认按钮 let confirm text(“确定”).findOne(500) || text(“OK”).findOne(500) || className(“android.widget.Button”).clickable(true).depth(12).findOne(500); if (confirm) { confirm.click(); toastLog(“[UI] 通过设置界面强制停止成功”); btnFound true; break; } } } if (!btnFound) { // 可能按钮在屏幕外尝试滚动 scrollDown(); sleep(1000); // 再次查找... } // 无论成功与否最后按Home键返回桌面 keyCode(3); sleep(1000); if (btnFound) return true; } catch (e) { toastLog(“[UI] 设置界面操作异常: ” e); } // 策略3终极方案尝试清除最近任务设备特异性强作为保底 toastLog(“尝试清除最近任务…”); keyCode(187); // 打开最近任务 sleep(1500); // 此处需要编写针对特定设备的清除逻辑例如上滑。 // 这是一个高度简化的示例实际需要适配。 let screenCenterX device.width / 2; let screenCenterY device.height / 3; swipe(screenCenterX, screenCenterY 300, screenCenterX, -100, 400); sleep(800); keyCode(3); // 返回桌面 // 策略4最后检查应用是否还在运行 sleep(2000); let checkResult shell(ps -A | grep ${packageName}, true); if (checkResult.code 0 checkResult.result.includes(packageName)) { toastLog(“警告应用可能仍未完全关闭”); return false; } else { toastLog(“应用已成功关闭”); return true; } } // 使用示例 let targetApp “com.zhihu.android”; // 以知乎为例 forceCloseApp(targetApp, true);5.2 设备与权限的兼容性考量ADB权限这是最核心的变量。如果脚本需要在未Root且未开启ADB调试的设备上运行例如普通用户的手机那么am force-stop命令将无法使用。在这种情况下你只能完全依赖UI自动化方案策略2和策略3。Android版本高版本Android对后台启动Activity的限制越来越严格。从设置界面强制停止的方法在Android 10及以上版本如果AutoJS应用本身不在前台可能会失败。此时可能需要先确保AutoJS脚本的UI如悬浮窗在前台或者尝试其他方法。厂商定制这是UI自动化最大的敌人。你必须为你需要支持的主流设备型号编写不同的选择器或手势逻辑。可以考虑在脚本初始化时检测device.brand和device.model然后加载对应的操作模块。6. 进阶话题关闭后的状态验证与脚本稳定性强制关闭不是最终目的而是为了确保后续自动化操作在一个干净、一致的状态下开始。因此关闭后的验证同样重要。6.1 如何验证应用已真正关闭检查进程列表如上文代码所示使用ps | grep命令检查目标包名的进程是否还存在。这是最可靠的验证方式。检查当前前台应用使用currentPackage()函数。在强制关闭操作并返回桌面后currentPackage()应该返回桌面启动器的包名如com.miui.home而不是目标包名。尝试重新启动并检查初始页面最彻底的验证是重新启动应用并检查是否出现了预期的初始页面如登录页、引导页。这可以确认应用不仅进程结束而且状态也被重置如果使用了force-stop。function verifyAppClosed(packageName) { // 方法1检查进程 let psCheck shell(ps -A | grep ${packageName}, true); if (psCheck.result psCheck.result.includes(packageName)) { return false; // 进程还在 } // 方法2检查当前包名需在桌面环境 if (currentPackage() packageName) { return false; // 应用仍在前台 } // 方法3冷启动检查初始页面可选 launchApp(packageName); sleep(3000); // 等待启动 // 这里添加检查初始页面元素的代码例如查找“登录”按钮 // let loginBtn text(“登录”).findOne(2000); // if (loginBtn) { // toast(“验证通过应用从初始状态启动”); // return true; // } // 为了演示我们简单返回true return true; }6.2 在自动化流程中的集成要点将强制关闭逻辑集成到你的主自动化脚本中时需要注意节奏控制关闭前等待在尝试关闭一个应用前确保它已经启动并处于稳定状态。使用sleep()或更智能的waitForActivity()来等待。关闭后等待强制关闭命令或操作发出后系统需要时间来处理。务必留出足够的休眠时间例如1500-3000毫秒让进程完全终止、内存被回收然后再进行下一步操作如再次启动。异常处理与重试网络波动、UI渲染延迟都可能导致单次操作失败。对于关键步骤如点击“强制停止”按钮可以将其包裹在try-catch中并设计重试机制例如最多重试3次。日志记录在脚本的关键节点使用toastLog()或console.log()输出状态信息。这对于调试在无人值守环境下运行的脚本至关重要。强制关闭APP是AutoJS脚本从“玩具”走向“工具”的关键技能之一。它背后涉及对Android系统机制的理解、对设备碎片化的应对以及编写健壮代码的工程思维。掌握从UI模拟到ADB命令的多层次方法并根据实际运行环境灵活组合才能打造出真正稳定可靠的自动化脚本。

相关新闻

抖音批量下载终极指南:5步实现无水印视频自由

抖音批量下载终极指南:5步实现无水印视频自由

抖音批量下载终极指南:5步实现无水印视频自由 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…

2026/8/3 11:04:48 阅读更多 →
洛谷官方题单刷题指南:从算法基础到实战精进的系统训练法

洛谷官方题单刷题指南:从算法基础到实战精进的系统训练法

1. 项目概述:为什么选择洛谷官方题单作为你的算法训练场?如果你正在学习编程,尤其是准备参加信息学竞赛(如CSP-J/S、NOIP、蓝桥杯)或者单纯想提升自己的算法与数据结构能力,那么“刷题”这个词对你来说一定…

2026/8/3 11:03:48 阅读更多 →
互联网时光机:你的个人网页记忆守护神

互联网时光机:你的个人网页记忆守护神

互联网时光机:你的个人网页记忆守护神 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 你是否曾经精心收藏…

2026/8/3 11:03:48 阅读更多 →

最新新闻

腾讯面试官必问:Java到底在哪一层操作数据库?80%求职者分层全搞错!

腾讯面试官必问:Java到底在哪一层操作数据库?80%求职者分层全搞错!

腾讯面试官必问:Java到底在哪一层操作数据库?80%求职者分层全搞错! 前言 Java后端面试基础必挂原题:Java代码在哪一层操作数据库? 很多初学者、应届生答题非常混乱: 有人说 Service 操作数据库、有人说 Con…

2026/8/3 14:16:57 阅读更多 →
鸿蒙物理 108 篇 第一百篇 八卦场域阵列总闭环

鸿蒙物理 108 篇 第一百篇 八卦场域阵列总闭环

100. 八卦场域阵列总闭环 一、核心总纲 第八阶八卦阵列场域篇共计八篇,以八卦本源阵列立底层场域单元根基,划定八方位气场定性标准,阐释阵列并行制衡稳态机制,建立场域叠加基础运算公理,推导气场生克量化矩阵算法,搭建局域自主调衡模型,规划寰宇全域周天巨型阵列排布,…

2026/8/3 14:16:57 阅读更多 →
鸿蒙物理 108 篇 第九十九篇 全域阵列周天排布

鸿蒙物理 108 篇 第九十九篇 全域阵列周天排布

99. 全域阵列周天排布 一、核心总纲 将八卦本源阵列依照六合六维坐标、七星周天轨道、黄道八方位分层铺展,构建覆盖整个星系寰宇的巨型八卦阵列网络,确立全域阵列周天排布规则,打通宏观星体引力波场与微观量子阵列的全域统一排布架构。 二、周天排布双层大架构 外层周天八…

2026/8/3 14:16:57 阅读更多 →
从斐波那契到高精度递推:洛谷P2437蜜蜂路线算法精解

从斐波那契到高精度递推:洛谷P2437蜜蜂路线算法精解

1. 项目概述:从“蜜蜂路线”到高精度递推的实战 最近在洛谷上刷题,又碰到了老朋友P2437——蜜蜂路线。这道题表面上看是个简单的路径计数问题,一只蜜蜂从蜂房a爬到蜂房b,每次只能向右(数字增大方向)爬行相邻…

2026/8/3 14:16:57 阅读更多 →
Aseprite像素动画导入Unity骨骼绑定全流程指南

Aseprite像素动画导入Unity骨骼绑定全流程指南

1. 从像素画到Unity动画:为什么Aseprite是独立开发者的首选 如果你正在做像素风游戏,或者对2D动画感兴趣,那么Aseprite这个名字你大概率不会陌生。它几乎是像素艺术和逐帧动画领域的“行业标准”工具。但很多朋友可能只是用它来画单张的像素画…

2026/8/3 14:16:57 阅读更多 →
华为VRP系统入门:从Console登录到SSH配置与基础命令详解

华为VRP系统入门:从Console登录到SSH配置与基础命令详解

1. 项目概述:从零上手华为VRP系统 刚接触华为交换机,看着黑底白字的命令行界面,是不是有点发怵?别担心,这几乎是每个网络工程师的必经之路。上一期我们聊了硬件和基础概念,这一期咱们就动真格的&#xff0c…

2026/8/3 14:15:57 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →