Android输入法APK签名验证机制分析与逆向研究思路
前阵子有位朋友问我逆向一个输入法App想研究它的签名校验逻辑该从哪里下手我没急着甩工具给他而是先问了一句你搞清楚Android签名到底在验证什么了吗这篇文章就以一个输入法APK的签名验证机制为分析对象聊聊我在做安全研究时的一些实操思路。不管你是刚接触Android逆向的初学者还是已经写过几个小工具的开发者认真看完这篇对APK签名、校验位置、检测方法这几个核心问题应该都能建立起一个比较完整的认知框架。先说清楚边界我只讲安全研究视角下的分析与防护思路不会手把手教改包绕验证。“绕过签名验证”这个说法在网上传得很玄乎但以我的经验真正值钱的能力是先把验证机制本身吃透——它校验了什么、在哪个环节生效、有什么薄弱点。这些搞明白了你既知道怎么分析一个问题也知道怎么设计防护方案。视角对了后面才走得远。1. 先搞清楚研究对象为什么输入法App适合做签名验证分析1.1 输入法App的代码结构与签名校验逻辑输入法App是一个很典型的研究样本。它的核心功能是键盘渲染、词库管理、联想算法这些代码量不小但边界清晰不像短视频App那样动辄几十个Module、几百个第三方SDK混在一起。更关键的是输入法这种工具类应用通常会对安全性比较在意因为系统输入法拥有较高的权限一旦被篡改风险是实打实的。所以输入法App普遍会做签名校验。常见做法是先检查自身APK的签名信息再决定要不要继续跑核心逻辑。这其实是一个很好的保护思路如果APK被二次打包签名必然变化校验不通过就直接拒绝服务。我分析目标的时候第一步不是急着看smali代码而是先把它当作一个“黑盒”来摸清脾气——安装、运行、观察日志看看它在什么情况下会触发异常。比如把原始APK的签名信息提取出来再把一个改动过的APK装进模拟器对比行为基本就能判断这个App有没有内置签名验证。1.2 安全研究的正确打开方式这里我要多说一句。很多人一上来就想找“怎么跳过校验”的攻略但我建议你把思路换一下研究的目的是搞清楚“验证机制为什么能生效”“怎么设计才能更结实”而不是“怎么把它拆掉”。我在分析中会准备测试环境用专门用于研究的测试APK在隔离的模拟器里跑不会碰真实的生产环境和用户数据。行业里有明确的合规边界做安全分析必须守住这条线。逆向分析本身是个中性技能就跟解剖学一样——医学院的学生解剖是为了救人不是为了害人。同样一套技能用在漏洞挖掘和加固设计上价值完全不同。2. Android签名机制分析之前必须补上的基础知识2.1 签名到底在验证什么很多人以为APK签名只是“证明作者是谁”这个理解太浅了。Android签名其实承担了两件事第一保证APK的内容没有被篡改过第二确认安装包的来源可信。它相当于给APK做了一次数字封印任何一个字节发生变化签名校验都会失败。这个设计是有实际意义的。你在正规应用市场下载一个输入法App系统会检查它的签名是否与开发者注册时提交的一致如果某天你收到一个“更新包”签名和原来对不上系统会直接拒绝安装。这就像你的身份证照片和个人信息对不上一样银行不会给你办业务。具体到实现层面APK在打包时会对文件内容做摘要计算然后用开发者的私钥对这些摘要签名。验证的时候系统用公钥解开签名再把APK实际内容的摘要和签名里的摘要逐位比对。不一致就是篡改这就是最底层的原理。2.2 v1、v2、v3三代签名方案的差异Android的签名方案一直在演进。分析老APK和新APK你得先分清它用的是哪一代方案因为校验的位置、范围、强度都不一样。签名版本校验范围实现位置特点与缺陷v1JAR签名逐个校验APK内每个文件META-INF目录下的CERT.RSA、MANIFEST.MF兼容性好但不保护APK整体可以删改未被签名的文件v2全文件签名校验整个APK文件内容APK Signing Block区段校验强度高一次校验整个文件速度快v3支持密钥轮换同v2增加密钥轮换支持APK Signing Block区段允许开发者更换签名密钥同时保留旧签名信任关系早期很多App用v1因为兼容老系统。但现在新开发的App基本都是v2以上。这里有个细节很多人不知道v2的校验是“全量”的哪怕你只改了APK里的一个图标资源签名就会失效。而v1的校验是“逐文件”的理论上如果篡改者只修改某个未被校验的文件在v1体系下是有可能蒙混过关的。这也是为什么Google后来强力推广v2、v3的原因。2.3 系统校验与应用自校验的区别研究签名验证你还会遇到两条截然不同的路径系统帮你校验还是应用自己校验。系统校验发生在安装阶段由PackageManagerService负责。它检查签名是否合法、是否有对应的签名权限、更新时签名是否一致。这部分你是绕不过去的因为系统在装载APK的时候就要读取签名信息。应用自校验则是开发者自己写的逻辑运行到某个时机主动检查自身签名。输入法App基本都是自校验因为它的运行环境允许它在启动后做额外检查。自校验的写法很多有直接用PackageManager拿签名比对的也有用NDK在native层写的。从分析角度说系统校验是“死逻辑”行为固定应用自校验才是真正需要花心思去定位和分析的。3. 实操环节从APK中提取签名信息并定位校验点3.1 准备工具链工欲善其事必先利其器。我分析签名验证问题常用的工具不多但每一个都有明确用途。第一是apktool负责解包和重新打包也能看看APK的清单文件和资源结构。第二是jadx负责把dex反编译成Java代码方便阅读核心逻辑。第三是apksigner来自Android SDK build-tools用来验证和查看APK签名信息。第四是keytoolJDK自带也能查看签名证书的信息。这四个工具配合起来基本覆盖了从“拿包”到“定位代码”的全流程。我一般把工作目录分成两个区域一个放原始APK一个放解包后的工程文件避免混淆。命名要带日期和版本号这个习惯帮我省了很多冤枉时间——分析到一半发现拿错包是最让人崩溃的事。3.2 查看APK签名详情拿到APK后第一步是确认它用的是哪一代签名方案、证书指纹是什么。用apksigner一行命令就能看到apksigner verify --print-certs ./某输入法App_v2.3.0.apk执行后输出里有SHA-256指纹、签名算法、证书有效期这些信息。指纹是唯一的App后续更新包只要指纹变了就能确定签名发生了变化。这一步看似简单但对后面的对比分析很重要——你总要有一个“标准答案”作为参照系。如果APK是老版本apksigner也能识别但建议再用keytool交叉确认一下keytool -printcert -jarfile ./某输入法App_v2.3.0.apkkeytool输出的是JAR签名相关的证书信息对v1签名尤其有用。两个工具配合能确认APK同时存在几代签名。我遇到过一些Appv1和v2签名并存只看任何一种都会漏掉关键信息。3.3 在反编译代码中定位签名验证逻辑签名信息搞清楚了接下来进入正题找到代码里的校验逻辑。我用jadx把APK反编译出来jadx -d ./out ./某输入法App_v2.3.0.apk反编译完成后在代码里搜索跟签名相关的关键字。常用的关键词有signature、getPackageInfo、GET_SIGNATURES、GET_SIGNING_CERTIFICATES、signingInfo。输入法App的逻辑一般比较集中搜到结果后先看调用栈找到谁在调用、在哪一行调用就能顺藤摸瓜找到校验入口。这里有个容易踩的坑新版本Android API里GET_SIGNATURES已经被标记为废弃取而代之的是GET_SIGNING_CERTIFICATES配合SigningInfo使用。如果你拿到的是一个适配了Android 14的输入法App代码里很可能用的是后者。搜索的时候两个关键词都要覆盖只搜signature可能漏掉关键位置。3.4 触发场景与异常路径分析找到校验入口不等于分析结束。我还会往下追两层校验失败后会走什么分支是直接退出还是降级功能又或者是收集到日志后上报输入法App的校验失败路径花样很多。有的会直接弹窗提示并退出进程有的会假装正常运行但词库联想功能全部失效还有更隐蔽的会把校验结果发到服务端由服务端决定是否下发核心资源。这种“延迟处罚”设计很难在本地看出端倪必须结合网络请求分析才能确认。从分析角度来说异常路径本身就是线索。失败分支的处理逻辑越复杂说明开发者越在意这个问题反之如果失败后只是Toast一下继续跑说明这个校验更多是“形式主义”。在安全研究报告中我会把触发条件和失败路径写清楚这部分信息对评估一个App的防护强度非常有参考价值。4. 输入法App常见的签名校验写法盘点4.1 基于PackageManager的常规签名比对最常见的写法是调用PackageManager获取当前APK的签名然后和一个硬编码在代码里的“正确签名”比对。代码思路大致是这样拿到PackageInfo读取签名或SigningInfo再和期望值做字符串比较。这种写法优点是实现简单、思路直接缺点也很明显签名值本质上是存放在系统读出来的API里只要你能执行代码就能拿到同样的数据对比出来。我在分析中就遇到过把正确签名字符串直接明文写在Java代码里的App这一看就是方便了自己也方便了别人。真正合格的写法至少要把期望签名字符串做一层变换拆成几段再拼接别让分析者一眼看穿。4.2 NDK层校验与本地加固很多输入法App会把核心校验下沉到native层。这一层的逻辑用C/C编写编译成so文件从Java层通过JNI调用。对分析者来说Java层看到的只是一个简单的boolean返回值真正的判断逻辑被藏在了so里。在native层做校验有个天然优势它不是直接的Java代码分析难度瞬间提升一个量级。你得先拿IDA或者Ghidra去逆向so还要面对各种混淆和反调试手段。有一些App还会做双重校验——Java层校验一次native层再校验一次两次的结果必须一致才算通过。但native层也不是万能保险。我看到过不少实现虽然写在了native层但本质还是把标准签名的哈希拿来比对只要在内存里找到了比对的基准值照样能分析清楚其工作流程。真正难缠的是那些不直接比对、而是把签名作为解密密钥一部分的方案——校验失败时解密出来的完全是另一套逻辑这种设计思路就比单纯比对高明多了。4.3 服务端校验与动态下发输入法App因为业务特性天然有网络模块所以服务端校验也常见。App启动后把自身签名指纹上传到服务端服务端返回一个token或者配置数据本地再用这个数据解锁完整功能。服务端校验的强度取决于一个关键问题服务端除了校验签名还做了什么。如果只是返回“允许/拒绝”分析者只要模拟返回“允许”即可但如果服务端下发的数据每次都动态变化、并且和签名绑定本地拿不到合法的数据就完全无法继续这种方案才是真正难处理的。当然服务端校验也有个大前提App必须联网。输入法这种在线功能强的应用适合这么干但如果是单机工具类应用没有网络环境怎么办所以大多数App不会单纯依赖服务端而是“本地校验服务端下发”组合互为补充。4.4 常见写法的薄弱点防护角度从防护角度看上面几种写法都存在各自的薄弱点。明文字符串比对是最弱的因为分析者用搜索就能找到关键位置。NDK方案强不少但如果so里的逻辑过于简单只是把Java层的比对搬了个家那也只是增加了时间成本。服务端校验看着最强却要处理网络被切断、服务端被模拟回复的场景平台兼容性也有限。我在评估一个App的签名验证强度时会看三个维度校验位置的数量只有一处还是多处叠加、校验失败后的行为打断还是静默失效、期望值的存储方式明文还是加密。这三个维度都能做到比较好的App防护水平就已经超过市面上绝大多数同类产品了。这也是我写分析报告时重点内容。5. 实际排查记录那些年踩过的反编译与签名坑5.1 反编译出来的代码对不上先确认加固情况我遇到过一种情况jadx反编译出来的代码和实际运行表现完全对不上。查了半天才发现APK被加固过运行时的真实代码是启动后才从服务端解出来的静态反编译看到的只是一个壳。输入法App用加固的不少尤其是那些有商业化诉求的。遇到加壳的APK静态反编译这条路基本走不通得先脱壳。这个环节有很多成熟的流程可以处理但对新手来说会卡很久。我的建议是别一开始就死磕壳先确认一下这个APK是否加壳方法很简单看dex文件的大小和代码量是否匹配。正常输入法App至少几万个方法如果你反编译出来的代码只有几百个方法那大概率是被抽干了。5.2 搜索关键词选不对关键的代码就躺在你眼前反编译完成后最重要的环节就是搜索。我见过不少人在这一步卡住搜signature搜出来的全是第三方SDK的代码根本找不到App自己的逻辑。技巧在于换组合词。你试试搜getPackageInfo、signingInfo、checkSign、verifySign、isModified这些。还有一招是搜Security相关的类名很多开发者会把自己的校验工具类命名为类似SecurityChecker这样的名字。输入法App的包名结构一般有规律比如以输入法自身业务命名的包路径下搜相关类比全局搜索定位更精准。5.3 apksigner与keytool输出对不上的原因有一次我对比分析两个工具的输出发现SHA-256指纹不一样一度怀疑APK有问题。后来才明白apksigner看到的最新可用的签名keytool读的是v1 JAR签名如果APK同时包含v1和v2签名两个工具的指纹就可能不同。这不是工具出错而是它们关注的签名方案不同。建议以apksigner的--print-certs输出为准因为v2以上方案的优先级更高。如果分析中涉及老APK的兼容性问题再看keytool的输出作为补充参考。两个指纹都记录到分析报告里不要嫌麻烦。5.4 一张速查表现象可能原因排查思路反编译代码量极少APK加壳/抽取加固先脱壳再反编译确认运行时逻辑搜索signature结果全是SDK代码关键词过泛换组合词定位自身业务包名apksigner和keytool指纹不一致v1与v2签名并存以apksigner输出为主记录两种指纹校验失败后App无明显异常延迟处罚型校验抓网络请求检查服务端行为代码中找不到任何校验逻辑校验在native层分析so文件关注JNI调用点这张表是我实际分析中最常遇到的情况。每次卡壳了都先对照一遍能节省不少排查时间。6. 从分析到防护签名验证的加固升级路径6.1 为什么“绕过”不是终点理解才是我在分析里投入了大量精力去理解签名验证机制目的从来不是为了“绕过”而是为了给评估防护强度提供依据。你只有知道一个验证机制是怎么设计的、薄弱点在哪里才能回答两个问题这个App靠不靠得住如果要加固该在哪一层下功夫说白了绕过一个校验点只需要看到那个点而设计一个可靠的校验体系需要看到整个面。从“点”到“面”的跨越只能靠系统性理解来达成靠几个复制粘贴的绕过技巧走不远的。6.2 多层校验设计的一种可参考思路如果一个开发者找到我问输入法App的签名验证怎么设计比较合理我通常会给出这样一套组合方案第一层Java层做基础的签名比对期望值不存明文而是从本地加密配置里读取。这一层的作用是拦截大量低水平的二次打包让那些只会用工具改包的“脚本小子”在门口就被拦下。第二层native层做一次独立的完整性校验不只查签名还抽查关键DEX文件的哈希和so文件的哈希。这一层增加了逆向分析的时间成本因为分析者需要同时跟踪Java层和native层两条线调试难度明显提升。第三层对网络型应用才用服务端校验签名与设备信息做绑定下发的数据与签名关联。这一层设计的前提是业务允许依赖网络输入法这种在线功能强的应用完全适用。这三层之间还要加入一个关键设计每一层校验失败时的行为不能一样。有人喜欢全部闪退我反而建议部分校验失败时让App“带病运行”——功能缺失但界面正常这样分析者很难确认自己到底有没有成功。这种主动干扰的思路很实用。6.3 对想入门逆向分析的人说几句我接触过的很多初学者都有同一个困惑教程看了一堆工具都会装自己一动手就抓瞎。这个太正常了。逆向分析本质上是一门实践学科就像游泳和骑车光看别人游、看别人骑永远学不会。我的建议是先找一个结构简单的APK不一定要输入法一个工具类或者计算器类的小应用就够。按照本文介绍的流程完整跑一遍——查看签名、反编译、定位逻辑、梳理调用链。不要追求“破解了什么东西”先追求“把分析流程跑通”。当你熟悉了整套流程再回过头来看输入法这种复杂样本会发现思路完全不一样——你不是在找“怎么绕过”而是在理解“它为什么要这么设计”。这种视角转换才是逆向分析最核心的能力。我个人在这条路上最大的体会是真正吃透一个机制比略知十个表面技巧更值钱。签名验证这块知识往小了说能帮你分析一个APK的防护水平往大了说它能帮你建立对Android安全体系的整体感知。后面我再拿到新的App样本或者遇到更复杂的加固方案时我会把分析思路继续写成新的实例把一些这次篇幅里没展开的细节比如v3密钥轮换的触发链路、native层校验的跟踪方法放到后续的文章里慢慢聊。

相关新闻

会议排期利器:Welsh-Powell图着色算法实战解析

会议排期利器:Welsh-Powell图着色算法实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 5:52:31 阅读更多 →
信息组织实战指南:从分类到元数据的设计方法论

信息组织实战指南:从分类到元数据的设计方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 5:51:30 阅读更多 →
双节锂电均衡系统设计:MP2642GR-Z与STM32F439ZG协同实现高精度被动均衡

双节锂电均衡系统设计:MP2642GR-Z与STM32F439ZG协同实现高精度被动均衡

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 5:51:30 阅读更多 →

最新新闻

TDA7050 双通道音频功率放大器

TDA7050 双通道音频功率放大器

一、产品概述TDA7050 是一款双通道低电压音频功率放大器集成电路,专为电池供电的便携式音频设备设计。该芯片采用高度集成化架构,内部集成偏置电路、前置放大器、双通道功率输出级及保护电路,无需任何外部元件即可构成完整的音频放大系统。产…

2026/10/17 6:29:56 阅读更多 →
CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

CKEditor 4 Table Selection 插件右键点击清除单元格选择的修复原理与测试详解

前端UI组件 【免费下载链接】ckeditor4 The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins. 项目地址: https://gitcode.com/gh_mirrors/ck/ckeditor4 点击查看 免费下载 本篇文章围绕 CKEditor 4 中 tableselec…

2026/10/17 6:29:56 阅读更多 →
EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

EXPLAIN执行计划深度解析:慢SQL排查与索引优化实战指南

一条SQL从300毫秒变成3秒,这种事我遇到过不止一次。遇到这种慢性查询,绝大多数人第一反应都是EXPLAIN一把梭,但真正把EXPLAIN每个字段都看明白的人却不多。绝大多数情况下,我们只看有没有出现ALL、有没有Using filesort&#xff0…

2026/10/17 6:29:56 阅读更多 →
AI大豆病虫害精准防治机器人 QT信创完整项目

AI大豆病虫害精准防治机器人 QT信创完整项目

# AI大豆病虫害精准防治机器人 QT信创完整项目 ## 项目概述 ### 1、信创适配 Qt5.15/Qt6,适配**麒麟、统信UOS、龙芯、飞腾、鲲鹏**全系列国产CPU;依赖OpenCV大豆病斑虫害视觉识别、libmodbus植保机PLC精准喷雾设备通信、SQLite轻量化自主数据库,无闭源商业SDK,完全满足智…

2026/10/17 6:29:56 阅读更多 →
MCreator 基岩版方块 Tint Method 完全指南:让方块像草与树叶一样随生物群系自动着色

MCreator 基岩版方块 Tint Method 完全指南:让方块像草与树叶一样随生物群系自动着色

低代码代码生成桌面应用游戏开发 【免费下载链接】MCreator MCreator is an open-source software used to make Minecraft Java Edition mods, Minecraft Bedrock Edition Add-Ons, resource packs, and data packs using an intuitive easy-to-learn interface or with an in…

2026/10/17 6:29:56 阅读更多 →
claude-code-templates:让AI编码协作更稳定的模板体系

claude-code-templates:让AI编码协作更稳定的模板体系

1. claude-code-templates 这类仓库,解决的其实是“AI 编码协作的出厂设置”如果你已经在终端里用 Claude Code 写过几天代码,一定会有这种感觉:它很强,但“性格”有点飘。今天你让它做代码审查,它给你列二十条小问题&…

2026/10/17 6:28:56 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →