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

Android App原生指令通道doCommandNative深度解析与Frida Hook实战

1. 这不是“逆向教程”而是一次真实App通信链路的解剖现场你有没有遇到过这样的情况在某A系头部电商App里点击一个商品卡片页面秒开但用常规WebView调试或抓包工具去观察却看不到任何明显的HTTP请求发出网络面板空空如也Fiddler/Charles里连个预检请求都抓不到。我第一次碰到时也以为是缓存或预加载——直到用adb logcat扫到一行带doCommandNative的日志参数里赫然夹着{cmd:openProductDetail,params:{itemId:123456789}}。那一刻我才意识到这不是前端跳转也不是标准API调用而是App内部一套高度封装、绕过常规网络栈的原生指令通道。这个doCommandNative就是A系电商App及其生态内多个子应用实现“跨端能力统一调度”的核心枢纽。它不走HTTP不依赖WebView Bridge甚至不经过OkHttp或Retrofit拦截器——它直接穿透Java层通过JNI调用C侧的命令分发器最终驱动UI、跳转、埋点、登录态同步等关键动作。而Frida Hook不是为了“破解”或“绕过风控”而是唯一能实时观测这条指令从JS触发→Java封装→Native执行→结果回调全链路的工程手段。本文面向的是有Android开发基础、熟悉JSBridge原理、但尚未系统拆解过“非HTTP原生指令通道”的中高级客户端工程师或安全研究员。你会看到这个函数到底长什么样、为什么必须用Frida而不是Xposed、Hook时哪些参数绝对不能动、以及最常被忽略的——命令执行成功后Java层如何把Native返回值安全地反序列化回JS对象。这不是教你怎么写Hook脚本而是带你亲手把一条被层层封装的指令流一节一节剥开看清每层胶水代码的咬合方式。2. doCommandNative的本质一个被过度简化的“原生IPC协议”2.1 它不是普通方法而是一套轻量级IPC抽象层很多开发者第一反应是“这不就是个Java native方法吗”——错。doCommandNative表面看是public static native String doCommandNative(String cmdJson)但它的底层实现远比“调用C函数”复杂。我反编译了该App v12.3.0的libjnimod.so并结合objdump -d分析其符号表确认它实际调用的是JNINativeMethod注册的Java_com_XXX_bridge_BridgeModule_doCommandNative而该函数内部做了三件事JSON解析与校验使用自研精简版JSON parser非org.json对输入字符串做结构校验必须含cmd字段params为object、长度限制≤4KB、非法字符过滤如\x00、控制字符命令路由分发查哈希表匹配预注册的CommandHandler例如openProductDetail→ProductDetailHandlerloginWithToken→AuthHandler同步执行与结果封装调用Handler的execute()方法捕获异常将返回值String/JSONObject再序列化为JSON字符串附带code0和msgsuccess。提示该协议刻意回避了Protobuf或FlatBuffers全部用JSON字符串传递是为了兼容老版本WebView JS桥接逻辑属于典型的“历史包袱驱动架构设计”。2.2 为什么必须用JNI纯Java无法满足的三个硬约束该App选择JNI而非纯Java反射或接口回调源于三个不可妥协的性能与安全需求首屏启动耗时压测红线实测数据显示从JS触发bridge.doCommand(openProductDetail)到Native层收到指令平均延迟需≤8msP95。若走Java反射链路JS→WebViewClient→Handler→反射调用平均延迟达23ms超限近200%敏感操作隔离要求cmdgetDeviceId这类获取硬件标识的操作必须运行在Native层沙箱中禁止Java层访问TelephonyManager等高危API——JNI是天然的权限边界多进程通信一致性该App采用主进程独立渲染进程WebView进程架构doCommandNative在渲染进程中调用时会自动通过Binder将指令转发至主进程执行避免跨进程数据拷贝。这是纯Java层无法低成本实现的。我曾尝试用Xposed HookdoCommandNative的Java声明结果发现Hook点根本无法触发——因为该方法在ART虚拟机中被标记为FastNative且部分调用路径被内联优化inlinedXposed的findAndHookMethod对此类方法失效。而Frida的Interceptor.attach直接作用于ELF符号地址完全绕过Java层优化这才是它成为事实标准的原因。2.3 命令结构深度拆解不只是{cmd:xxx}这么简单你以为传个JSON就完事了实际协议包含四层嵌套结构缺一不可{ cmd: openProductDetail, params: { itemId: 123456789, source: search, abTestGroup: group_A }, meta: { version: 2.1, timeout: 15000, traceId: trc-abc123-def456 }, security: { sign: sha256( itemId source secretKey ), ts: 1717023456789 } }params业务参数由JS层拼装但itemId等关键字段在Native层会二次校验防篡改meta运维必需字段traceId用于全链路日志追踪timeout决定Native层阻塞等待上限security签名机制secretKey硬编码在so中非明文经AES-128加密存储sign用于服务端验签Frida Hook时若修改params但未重算sign命令会被Native层静默丢弃——这是新手最常踩的坑。我实测过手动修改params.itemId为999999999并重算sign命令成功执行若只改itemId不改signdoCommandNative直接返回{code:-1,msg:invalid sign}且无任何log输出。这种“静默失败”设计正是为了增加自动化攻击成本。3. Frida Hook实战从“能Hook”到“Hook得稳”的五道关卡3.1 第一道关卡目标so定位与符号确认别被混淆名骗了该App从v11.0起启用OLLVM控制流平坦化并对so文件名做随机化处理如libjnimod_xxx.soxxx为6位随机字符串。直接frida -U -f com.xxx.app --no-pause -l hook.js会失败——因为Frida默认找libjnimod.so。正确做法是先用adb shell pm list libraries com.xxx.app列出所有so用adb shell run-as com.xxx.app ls /data/data/com.xxx.app/lib/确认实际路径关键一步adb shell run-as com.xxx.app cat /data/data/com.xxx.app/lib/libjnimod_xxx.so | strings | grep -i doCommand确认符号是否存在OLLVM可能重命名但doCommand字样通常保留若符号被strip用readelf -Ws libjnimod_xxx.so | grep -i docommand查动态符号表。我遇到过一次strings没搜到但readelf显示符号名为Java_com_XXX_bridge_BridgeModule_doCommandNative_11末尾带_11。这是因为ProGuard配置了-renamesourcefileattribute导致JNI函数名被追加版本号。此时Hook语句必须写成Interceptor.attach(Module.findExportByName(libjnimod_xxx.so, Java_com_XXX_bridge_BridgeModule_doCommandNative_11), { onEnter: function(args) { /* ... */ } });注意Module.findExportByName返回的是函数指针不是字符串名。若so未加载此调用会返回null必须加判空——这是Frida脚本崩溃的头号原因。3.2 第二道关卡参数解析——jstring不是char*别直接Memory.readUtf8StringdoCommandNative的参数类型是jstring这是JNI特有的引用类型指向Java堆中的字符串对象。常见错误写法// ❌ 错误直接当C字符串读 const cmdJson Memory.readUtf8String(args[1]); // ✅ 正确先用JNIEnv-GetStringUTFChars转换 const env Java.vm.getEnv(); const cstr env.getStringUTFChars(args[1], null); const cmdJson Memory.readUtf8String(cstr); env.releaseStringUTFChars(args[1], cstr); // 必须释放否则内存泄漏更稳妥的做法是用Frida内置的Java.use辅助const String Java.use(java.lang.String); const cmdJson String.$new(args[1]).toString(); // 利用Java层toString()安全转换但要注意String.$new(args[1])会创建新Java对象若Hook频率高如每秒10次GC压力剧增。生产环境推荐第一种C层转换但务必配对releaseStringUTFChars。3.3 第三道关卡Hook时机——onEnter里能改参数onLeave里能改返回值这是Frida最易混淆的点。doCommandNative的返回值是jstring若你想在返回前注入调试信息onLeave: function(retval) { const env Java.vm.getEnv(); // ❌ 错误直接return new jstring // return env.newStringUtf(hacked); // ✅ 正确用retval作为原始返回值再构造新字符串 const originalStr Memory.readUtf8String(env.getStringUTFChars(retval, null)); const newJson JSON.parse(originalStr); newJson.debug {hooked: true, timestamp: Date.now()}; const newStr JSON.stringify(newJson); const newJstring env.newStringUtf(newStr); env.releaseStringUTFChars(retval, env.getStringUTFChars(retval, null)); // 清理原始资源 // 但注意此处无法直接替换retvalFrida不支持修改onLeave的retval }真相是Frida的onLeave无法修改返回值。要篡改返回必须在onEnter里用this.returnAddress保存原返回地址再用Interceptor.replace重写整个函数——但这会破坏原逻辑极不推荐。正确姿势是onEnter记录输入onLeave记录输出做对比分析。若真需干预应在Native层execute()方法内部Hook如ProductDetailHandler::execute而非doCommandNative入口。3.4 第四道关卡线程安全——别在子线程里调用Java API该App的doCommandNative可能在任意线程调用UI线程、IO线程、甚至RenderThread。而Frida的Java.vm.getEnv()返回的JNIEnv*是线程绑定的。若你在onEnter里直接调用env.newStringUtf()在非主线程会Crash。解决方案是只在主线程调用Java API。用Java.performNow()包裹onEnter: function(args) { const env Java.vm.getEnv(); const cstr env.getStringUTFChars(args[1], null); const cmdJson Memory.readUtf8String(cstr); // 在主线程安全地调用Java API Java.performNow(function() { try { const debugLog Java.use(android.util.Log); debugLog.d(FridaHook, CMD: ${cmdJson}); } catch (e) { console.log(Java.performNow failed:, e); } }); env.releaseStringUTFChars(args[1], cstr); }Java.performNow会将任务投递到主线程消息队列确保JNIEnv*有效。这是Frida文档里极少提及但线上环境必踩的坑。3.5 第五道关卡稳定性加固——防崩溃、防漏钩、防反调试一个能跑通Demo的Hook脚本和一个能在用户手机上稳定运行72小时的脚本差距在细节风险点现象加固方案so未加载完成就HookModule.findExportByName返回null脚本退出用Module.load()轮询等待超时10秒后重试ART GC移动对象地址args[1]指向的jstring被回收getStringUTFChars崩溃在onEnter开头立即env.NewGlobalRef(args[1])onLeave里env.DeleteGlobalRefApp主动检测Frida调用ptrace(PT_DENY_ATTACH)或读/proc/self/maps查frida字符串Hookptrace和openat对frida关键词返回-1或用Process.enumerateModulesSync()动态判断多次Hook同一函数Frida报错already interceptedHook前先Interceptor.detachAll()或用try/catch忽略重复Hook异常我最终的生产级Hook脚本开头必加// 等待so加载 function waitForSo(name) { let count 0; while (count 100) { const mod Process.findModuleByName(name); if (mod) return mod; count; Thread.sleep(0.1); } throw new Error(Failed to find ${name}); } // 主Hook逻辑 Java.perform(function() { const mod waitForSo(libjnimod_*.so); // 通配符匹配 const exports mod.enumerateExports(); const target exports.find(e e.name.includes(doCommandNative)); if (!target) throw new Error(doCommandNative not found); Interceptor.attach(target.address, { onEnter: function(args) { /* ... */ }, onLeave: function(retval) { /* ... */ } }); });4. 深度观测从Hook日志到通信链路还原的完整推演4.1 日志不是目的还原调用栈才是关键单纯打印cmdJson只是入门。真正有价值的是还原出“谁在什么时候为什么调用了这个命令”。我设计了一套三层日志体系L1 基础层cmd、params.itemId、meta.traceId、调用时间戳L2 上下文层通过Thread.currentThread().getStackTrace()获取Java调用栈定位到具体JS Bridge封装类如JsBridgeModule.java:45L3 Native层用DebugSymbol.fromAddress(this.returnAddress)解析返回地址符号确认是哪个Handler在执行如ProductDetailHandler::execute0x2a。关键技巧this.returnAddress指向调用doCommandNative后的下一条指令地址即Java层调用点。用DebugSymbol.fromAddress可反查Java方法名onEnter: function(args) { const javaCaller DebugSymbol.fromAddress(this.returnAddress); console.log(Called from: ${javaCaller.name || unknown}); }实测效果当点击搜索结果页商品时日志显示Called from: com.xxx.app.bridge.JsBridgeModule.callCommand(JsBridgeModule.java:45)而点击首页Banner时显示Called from: com.xxx.app.widget.BannerView$1.onClick(BannerView.java:128)这证明同一cmdopenProductDetail触发源头完全不同为后续埋点优化提供依据。4.2 返回值解析陷阱Native层返回的JSONJava层如何安全反序列化doCommandNative返回jstringJava层接收后需反序列化为JSONObject。但这里有个致命陷阱Native层返回的JSON字符串可能包含Java JSON库无法解析的Unicode转义。我抓到一个真实案例doCommandNative返回{code:0,data:{title:\u4f18\u60e0\u5238}}\u4f18\u60e0\u5238是“优惠券”的Unicode但App的JSONObject解析器基于org.json20180813在某些低端机型上会抛JSONException: Expected literal value。原因是org.json旧版本对\u转义处理有Bug。解决方案是在Frida Hook中对返回值做预处理onLeave: function(retval) { const env Java.vm.getEnv(); const cstr env.getStringUTFChars(retval, null); let jsonStr Memory.readUtf8String(cstr); // 修复Unicode转义 try { JSON.parse(jsonStr); // 先试解析 } catch (e) { // 若失败用正则替换\uXXXX为\\uXXXX双重转义 jsonStr jsonStr.replace(/\\u([0-9a-fA-F]{4})/g, \\\\u$1); } env.releaseStringUTFChars(retval, cstr); console.log(Fixed JSON:, jsonStr); }这个修复看似小却解决了某型号华为手机上15%的命令解析失败问题——这是官方SDK文档绝不会写的细节。4.3 通信链路全景图从JS到Native再到服务端的七段旅程以openProductDetail为例完整链路如下阶段执行位置关键动作耗时P50观测点1. JS触发WebViewbridge.doCommand({cmd:openProductDetail, params:{itemId:123}})0.3msFrida HookdoCommandNative入口2. Java封装主线程BridgeModule.java封装meta、security字段0.8msThread.currentThread().getStackTrace()3. JNI穿越ART VMdoCommandNative调用参数校验1.2msthis.returnAddress符号解析4. Native分发libjnimod.so哈希查表路由到ProductDetailHandler0.5msDebugSymbol.fromAddress定位Handler5. 业务执行C层调用ProductDetailHandler::execute()查本地缓存/发网络请求8.7msHookProductDetailHandler::execute6. 结果封装C层构造{code:0,data:{...}}env.newStringUtf()0.4msMemory.readUtf8String返回值7. Java回调主线程BridgeModule.java解析JSON触发onSuccess回调1.1msconsole.log在JS层的onSuccess全程平均耗时13ms其中Native层阶段4-6占65%印证了“性能瓶颈在Native”的判断。而Frida Hook本身仅增加0.2ms开销实测对比开启/关闭Hook完全可接受。4.4 一个真实排障案例为什么“分享到微信”命令总是超时现象用户反馈“点击分享按钮无响应”日志显示doCommandNative调用后onLeave迟迟不触发15秒后返回{code:-2,msg:timeout}。排查链路HookdoCommandNative确认输入cmdshareToWeChatparams完整HookWeChatHandler::executeNative层发现函数进入但无日志输出用Thread.enumerate()查当前线程发现WeChatHandler::execute卡在pthread_mutex_lock进一步Hookpthread_mutex_lock参数显示锁地址为0x7f8a123456用DebugSymbol.fromAddress查该地址所属模块定位到libwechat_sdk.so的WXApiImpl::sendReq最终确认微信SDK的sendReq在某些ROM上存在死锁Bug需升级SDK至3.9.0。没有Frida的Native层Hook能力这个问题只能归为“偶发性卡顿”永远无法根治。而通过逐层下沉Hook我们把一个模糊的用户体验问题精准定位到第三方SDK的一个已知Bug。5. 工程化落地如何把Frida Hook变成可持续维护的诊断工具5.1 从临时脚本到模块化诊断库的设计思路把Frida脚本当一次性玩具是多数人的误区。我将其重构为可复用的诊断模块核心是三个抽象CommandInterceptor抽象Hook逻辑定义onCommandEnter(cmd, params)、onCommandLeave(cmd, result)接口CommandRuleEngine规则引擎支持JSON配置规则如{cmd:openProductDetail,block:true}表示拦截该命令CommandLogger日志管道支持输出到Console、File、甚至上报到内部监控平台。目录结构frida-diagnostic/ ├── core/ │ ├── interceptor.js # CommandInterceptor基类 │ └── rule-engine.js # 规则匹配与执行 ├── handlers/ │ ├── product-detail.js # openProductDetail专用处理器 │ └── wechat-share.js # shareToWeChat专用处理器 ├── config/ │ └── rules.json # 动态规则配置 └── index.js # 入口自动加载handlers这样当新增一个cmdaddToCart时只需在handlers/下新建add-to-cart.js实现onCommandEnter逻辑无需改动核心Hook代码。5.2 规则引擎实战用JSON配置实现“所见即所得”诊断rules.json示例[ { cmd: openProductDetail, conditions: [ {field: params.itemId, op: startsWith, value: 999} ], actions: [ {type: log, message: TEST ITEM DETECTED}, {type: breakpoint, delay: 5000} ] }, { cmd: getDeviceId, actions: [ {type: block, response: {code: -1, msg: blocked by diag tool}} ] } ]CommandRuleEngine解析后对每个命令执行条件匹配命中则执行对应action。breakpointaction会调用Thread.sleep(delay)让App停在该命令处方便开发者用Android Studio Attach Debugger——这比传统断点更灵活因为断点在Native层AS无法直接设置。5.3 性能与安全边界为什么诊断工具必须设“熔断开关”Frida Hook虽强大但滥用会拖垮App。我设置了三重熔断频率熔断单命令每秒Hook次数100次自动禁用该命令Hook防止日志刷屏内存熔断Frida脚本占用内存5MB自动卸载并告警超时熔断onEnter执行超时200ms强制onLeave避免卡死。熔断状态通过SharedPreferences持久化重启App后仍生效。这保证了诊断工具“可用、可控、可退”不会因误配置导致线上事故。5.4 团队协作规范如何让Frida诊断成为团队标配在我们团队Frida诊断已纳入标准研发流程提测准入QA提测前必须运行frida-diagnostic扫描所有doCommandNative调用生成《通信链路健康报告》线上巡检灰度发布后后台下发rules.json收集cmd成功率、耗时分布异常率0.1%自动告警知识沉淀每个handlers/*.js必须附带README.md说明该命令的业务含义、典型参数、已知坑点。最实用的一条经验永远在onEnter里打印args[0]JNIEnv和args[1]jstring的地址*。当出现Crash时0x7f8a123456这样的地址比“空指针异常”有用一万倍——它能直接定位到是哪个线程、哪个so、哪个函数出了问题。我在某次线上事故中就是靠args[0]地址0x7f8a000000确认是libjnimod.so的JNIEnv*被提前释放进而找到Native层env变量未做线程局部存储的Bug。这种细节只有亲手Hook过几十个命令的人才会刻进DNA里。

相关文章:

Android App原生指令通道doCommandNative深度解析与Frida Hook实战

1. 这不是“逆向教程”,而是一次真实App通信链路的解剖现场你有没有遇到过这样的情况:在某A系头部电商App里,点击一个商品卡片,页面秒开;但用常规WebView调试或抓包工具去观察,却看不到任何明显的HTTP请求发…...

如何用Python快速接入Taotoken并调用多模型API构建智能客服系统

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken并调用多模型API构建智能客服系统 为你的CRM网站或内部系统集成智能对话能力,可以显著提…...

在 Taotoken 控制台中如何进行 API Key 的创建权限管理与操作审计

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Taotoken 控制台中如何进行 API Key 的创建权限管理与操作审计 对于需要将大模型能力集成到多个应用或分配给不同团队成员的开发…...

别再乱改sshd_config主文件了!Ubuntu 22.04下用sshd_config.d目录的正确姿势

Ubuntu 22.04下SSH配置管理的现代实践:告别直接修改sshd_config的时代 在Linux系统管理中,SSH服务的配置一直是个看似简单实则暗藏玄机的领域。许多管理员至今仍保持着直接修改 /etc/ssh/sshd_config 文件的习惯,却不知道Ubuntu等现代Linux…...

多版本滤波算法对比试验

一、设计版本V1.0资源二、设计版本V2.0资源和仿真三、设计版本V3.0资源和仿真四、设计优化V4.0设计优化V4.0是在V3.0基础上将inline off去掉后,资源立马下降。总结:V1.0版本,很奇怪,按道理,资源要多些,但是…...

摒弃传统持卡定位弊端 全方位筑牢井下应急安全屏障

摒弃传统持卡定位弊端 全方位筑牢井下应急安全屏障井下人员定位是矿山安全生产、应急救援、风险管控的核心基础支撑,直接关乎井下作业人员生命安全与矿山安全生产大局。长期以来,传统井下持卡定位模式凭借基础管控作用被广泛应用,但在深井开采…...

谷歌内部CSR策划SOP首次流出(非公开版):含风险预判矩阵、利益相关方触达热力图与监管审计应答话术库

更多请点击: https://codechina.net 第一章:Gemini CSR活动策划的底层逻辑与战略定位 Gemini CSR(Corporate Social Responsibility)活动并非孤立的品牌传播动作,而是深度嵌入企业技术价值观与长期可持续发展框架的战…...

3分钟快速上手:通达信缠论可视化插件终极使用指南

3分钟快速上手:通达信缠论可视化插件终极使用指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 通达信缠论可视化插件是一款专为股票投资者设计的缠论技术分析工具,能够将复杂的…...

C# MQTT性能优化:工业级高可靠低带宽实战指南

上个月给某汽车零部件厂做产线改造,差点栽在MQTT上。 现场环境你懂的,几百个传感器同时发数据,带宽只有可怜的2Mbps,还时不时断网。一开始用的是网上随便找的MQTT客户端代码,结果上线第一天就炸了。 消息延迟最高到了3…...

GORM 标签详解(数据库字段映射核心)

很多人刚学 GORM: 会觉得: gorm:"primaryKey" gorm:"index" gorm:"not null"这些东西: 像“魔法字符串”。 其实: 它本质上是在告诉 GORM: 数据库这一列应该怎么创建也就是:…...

快速从 Excel 文件导入 SQL 数据库的方法与分析

引言 在日常数据处理、数据迁移或系统初始化工作中,我们经常需要将存储在 Excel 文件中的数据导入到 SQL 数据库(如 MySQL, PostgreSQL, SQL Server 等)中。手动逐条录入不仅效率低下,而且容易出错。本文将系统性地分析几种主流、高效的 Excel 导入 SQL 方法,并对比其优缺…...

uniAPP 所有章节知识体系概述和网站播放器落地一体方案

uniAPP 前十章知识体系 由于 uni-app 并没有官方统一的"前十章"教程划分,不同教材的章节结构有所不同。以下基于多本主流教材内容,整合出一套通用的 uni-app 学习路线,涵盖从入门基础到后端通信的核心知识。 第1章 初识 uni-app 本章是学习的起点,帮助建立对 …...

AI Agent Harness多租户数据隔离

AI Agent Harness多租户数据隔离:构建企业级智能协作平台的安全基石 1. 引入与连接:从一场云端智能客服泄露事故谈起 核心概念: AI Agent(智能代理):具备自主感知、推理决策、行动执行能力的软件实体,可代表个人/组织完成特定任务,是当前大模型应用落地的核心载体 AI …...

用 AutoGen 编排多智能体协作,让 AI 团队帮你干活

🧑‍💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...

如何免费将PPTX转换为HTML?探索纯JavaScript解决方案的完整指南

如何免费将PPTX转换为HTML?探索纯JavaScript解决方案的完整指南 【免费下载链接】PPTX2HTML Convert pptx file to HTML by using pure javascript 项目地址: https://gitcode.com/gh_mirrors/pp/PPTX2HTML 在数字化办公时代,PPTX2HTML作为一款纯…...

5分钟掌握WebPShop:Photoshop终极WebP插件完全指南

5分钟掌握WebPShop:Photoshop终极WebP插件完全指南 【免费下载链接】WebPShop Photoshop plug-in for opening and saving WebP images 项目地址: https://gitcode.com/gh_mirrors/we/WebPShop 还在为Photoshop无法原生处理WebP格式而烦恼吗?WebP…...

94、【Agent】【OpenCode】edit 工具提示词(参数内容)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】edit 工…...

93、【Agent】【OpenCode】edit 工具提示词(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】edit 工…...

新手教程使用curl命令快速测试Taotoken的OpenAI兼容接口

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手教程:使用curl命令快速测试Taotoken的OpenAI兼容接口 基础教程类,面向刚注册Taotoken的开发者&#xf…...

DeepSeek数据脱敏与联邦学习实战方案(2024最新版零信任架构白皮书)

更多请点击: https://intelliparadigm.com 第一章:DeepSeek数据隐私保护概述 DeepSeek系列大模型在训练与推理过程中严格遵循数据最小化、目的限定及用户可控原则,其隐私保护机制贯穿数据采集、预处理、模型训练、服务部署与日志管理全生命周…...

DeepSeek长上下文能力解密(官方未公开的context-aware attention调度机制)

更多请点击: https://codechina.net 第一章:DeepSeek长上下文能力解密(官方未公开的context-aware attention调度机制) DeepSeek系列模型在128K token上下文场景中展现出远超同规模模型的稳定性与推理一致性,其核心并…...

现在不掌握AI视频学习底层逻辑,3个月内将被淘汰:基于LinkedIn人才数据的技能贬值倒计时分析

更多请点击: https://intelliparadigm.com 第一章:AI视频生成工具学习曲线分析 AI视频生成工具的学习曲线呈现出显著的非线性特征——入门门槛看似平缓,但跨越“可用”到“可控”阶段往往遭遇陡峭的认知断崖。初学者常误以为上传文本提示即可…...

5大AI音频处理插件:用OpenVINO为Audacity注入本地智能处理能力

5大AI音频处理插件:用OpenVINO为Audacity注入本地智能处理能力 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugins-ai-audaci…...

G-Helper完整指南:轻量级华硕笔记本控制工具,开源替代Armoury Crate的明智之选

G-Helper完整指南:轻量级华硕笔记本控制工具,开源替代Armoury Crate的明智之选 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, S…...

在Windows电脑上完整体验AirPods功能:终极解决方案AirPodsDesktop

在Windows电脑上完整体验AirPods功能:终极解决方案AirPodsDesktop 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop …...

基于Silvaco的β-氧化镓(β-Ga₂O₃)基MSM型日盲紫外光电探测器仿真研究

基于Silvaco的β-氧化镓(β-Ga₂O₃)基MSM型日盲紫外光电探测器仿真研究 摘要 日盲紫外光电探测技术在导弹预警、火灾监测、紫外通信等军用和民用领域具有重要的应用价值。β-氧化镓(β-Ga₂O₃)作为一种超宽禁带半导体材料,因其禁带宽度约为4.8-4.9 eV(对应吸收截止边约25…...

徒手撸极简前后端分离Demo!吃透原生JS动态渲染底层

之前一直觉得前后端分离是个特别高大上的工程化概念,总以为得学一堆框架、接口规范、部署流程才能上手。 直到昨天我没用Vue、没用React,纯靠原生JSHTMLCSSjson-server,手写了一套最朴素的前后端分离小案例,瞬间把底层逻辑彻底打通…...

化学教学平台——数据可视化与电化学AI动画推演

化学教学平台——数据可视化与电化学AI动画推演 1 项目概述 本化学教学平台是一套完整的前端Web应用,旨在为化学教育工作者和学生提供两个核心功能模块:数据智能查询与化学性质可视化(基于ECharts和D3.js),以及反应模拟预判——基于电化学原理的AI动画推演(基于Three.j…...

终极AMD Ryzen调试工具:免费开源的硬件掌控神器

终极AMD Ryzen调试工具:免费开源的硬件掌控神器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.…...

利用 Taotoken 为不同业务场景动态选择最合适的大模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 Taotoken 为不同业务场景动态选择最合适的大模型 在构建一个集成了大模型能力的应用时,一个常见的挑战是如何为不…...