Frida与安卓模拟器兼容性全解析:从原理到实战的逆向环境搭建指南
1. 逆向工程环境搭建的“玄学”与“科学”搞逆向分析的朋友尤其是刚入坑的新手估计都听过“Frida模拟器”这个黄金组合。它听起来很美一个动态插桩神器加上一个可以随意快照、重置的安卓虚拟机简直是调试、脱壳、分析的不二之选。但实际操作过的人十个里有八个都踩过坑而且很多坑都莫名其妙网上搜到的解决方案要么语焉不详要么根本不对症。我自己在带团队和做项目时无数次被这个组合折腾得够呛最头疼的就是版本兼容性问题。你照着某个“完美教程”一步步来结果Frida-server死活起不来或者一注入就崩溃又或者模拟器直接卡死时间全花在折腾环境上了。问题的核心就在于“Frida”、“夜神模拟器”或其他如雷电模拟器以及“安卓系统版本”这三者构成了一个动态的、不稳定的“兼容性三角”。任何一个环节的版本不匹配都可能导致整个工作流瘫痪。网上很多教程只告诉你“用这个版本组合”却很少说清楚背后的原理为什么这个版本的Frida只能搭配那个特定内核的安卓为什么夜神模拟器7.1和9.0的架构差异会导致Frida行为不同今天我就结合自己踩过的无数坑以及给团队内部整理的文档把这个“兼容性玄学”彻底讲清楚并给出从安卓4.4到安卓12的、经过实测的适配方案。目标只有一个让你拿到一个标题就能配出一套能稳定跑起来的逆向分析环境把时间花在真正的逆向分析上而不是无穷尽的环境调试。2. 核心兼容性问题深度拆解不只是版本号那么简单很多人遇到问题第一反应是换版本Frida从15.0降到14.0模拟器从9.0换到7.1。这有时能解决问题但更多时候是碰运气。要系统性地避坑必须理解兼容性问题的三个层次。2.1 第一层安卓系统ABI与内核版本这是最基础也最致命的一层。Frida-server是一个需要运行在目标系统即安卓模拟器或真机上的原生程序通常是frida-server-xx-android-xx。它需要匹配两个关键属性处理器架构ABI模拟器提供的安卓系统是x86/x86_64还是ARM/ARM64夜神模拟器为了在PC上获得高性能其安卓系统镜像默认通常是x86或x86_64架构。而Frida官方提供的预编译server主要针对ARM和ARM64架构的手机。如果你直接下载android-arm或android-arm64的server放到x86的模拟器里肯定会报“Exec format error”或根本无法执行。内核版本与系统调用Frida的核心原理是通过ptrace或inject等方式注入代码这深度依赖Linux内核的特定接口和内存管理机制。不同安卓版本尤其是大版本升级如4.4到5.07.0到8.0所对应的Linux内核版本可能有较大差异系统调用、安全模块如SELinux策略也会变化。一个为安卓5.1内核3.x编译的Frida-server在安卓9.0内核4.x上运行时可能会因为某个内核接口变更而崩溃。实操心得不要只看安卓的“用户版本号”如7.1.2更要关注其底层Linux内核版本。在夜神模拟器的安卓系统设置-关于手机里通常可以查到内核版本。选择Frida-server时优先选择发布时注明支持该内核区间的版本。2.2 第二层夜神模拟器虚拟化引擎的“魔改”夜神、雷电这类模拟器并非纯正的Android Open Source Project (AOSP) 实现。它们为了在Windows/macOS上实现更好的性能、兼容性和功能比如一键多开、宏录制对底层的QEMU虚拟化引擎和安卓系统镜像进行了大量修改和优化。这就引入了不确定性系统库差异模拟器厂商可能替换或修改了某些系统原生库如libc,libdl而Frida的动态链接和注入过程依赖于这些库的特定行为。修改可能导致Frida的注入器frida-inject或gadget加载失败。ROOT环境与权限虽然模拟器通常自带ROOT权限但这个ROOT的实现方式是标准的su二进制文件还是模拟器自己的一套权限管理可能影响Frida-server以root身份运行和访问进程内存的稳定性。有时你需要手动切换模拟器的ROOT开关或者使用特定的adb root命令。网络与端口映射Frida默认通过TCP端口通常是27042与server通信。模拟器的网络是NAT模式需要确保adb forward tcp:27042 tcp:27042这个端口转发在模拟器的复杂网络拓扑中能正确工作。有时在多开模拟器时端口冲突会导致连接失败。2.3 第三层Frida自身版本与Python绑定的迭代Frida是一个活跃开发的项目版本迭代很快。新版本会加入对新版安卓特性的支持如新的ART运行时内部结构但同时也可能因为重构而暂时破坏对旧版本安卓的兼容。此外你本地PC上安装的frida-toolsPython包版本需要与运行在模拟器中的frida-server版本严格匹配。大版本号如15.x必须一致小版本号最好也一致否则可能出现协议不兼容导致frida-ps -U都列不出进程。避坑技巧建立一个固定的版本组合档案。不要总是追求最新版。对于稳定的逆向分析工作找到一个经过验证的“Frida-server 夜神安卓版本 frida-tools”组合并记录下来比什么都重要。新版本可以用于测试但主力环境要保持稳定。3. 各安卓版本实测适配方案与操作实录下面是我根据长期实践整理出的从安卓4.4到安卓11/12的推荐适配方案。每个方案都包含了具体的版本号和关键操作步骤。3.1 安卓4.4 (KitKat) - 怀旧服的特供方案场景分析一些非常老旧的App它们可能只兼容低版本系统或者你想研究早期的Dalvik虚拟机机制。核心挑战安卓4.4内核较老3.xGLIBC等系统库版本低且夜神对这类老版本模拟器的维护更新少兼容性问题多。推荐组合夜神模拟器版本寻找历史版本如夜神模拟器6.x版本中提供的安卓4.4镜像。注意新版夜神安装器可能已不包含此选项需要寻找旧版安装包。Frida-server版本Frida 12.x 系列例如12.11.0。这是经过验证对低版本安卓兼容性较好的一个分支。避免使用14.0以上的版本。Frida-tools版本与server对应安装pip install frida-tools12.11.0。实操步骤实录环境准备安装旧版夜神模拟器创建安卓4.4实例。启动后通过adb shell getprop ro.product.cpu.abi确认架构大概率是x86。Server部署从Frida GitHub的Release页面下载frida-server-12.11.0-android-x86.xz。解压后得到二进制文件frida-server-12.11.0-android-x86。推送与授权adb push frida-server-12.11.0-android-x86 /data/local/tmp/ adb shell cd /data/local/tmp chmod 755 frida-server-12.11.0-android-x86运行与测试在adb shell中以后台方式启动server./frida-server-12.11.0-android-x86 。然后另开一个本地终端执行frida-ps -U如果能看到模拟器中的进程列表则成功。注意事项安卓4.4的SELinux可能处于宽容模式如果遇到权限问题可以先执行adb shell setenforce 0临时关闭SELinux。此外这个版本的Frida可能不支持一些较新的API但对于基础的Java层Hook和Native层简单Hook足够了。3.2 安卓5.1/7.1 (Lollipop/Nougat) - 最稳定的主力选择场景绝大多数逆向分析工作。这两个版本的安卓系统成熟稳定市场存量App兼容性好且对Frida的支持最为广泛。推荐组合夜神模拟器版本直接使用夜神模拟器当前稳定版如9.x版本在多开管理器中新建Android 5.1或7.1的实例。这是官方持续维护的镜像兼容性最好。Frida-server版本Frida 14.2.18 或 15.2.2。这两个版本是经过大量实践验证的“钉子户”版本在安卓5.1/7.1上极其稳定。架构选择优先下载android-x86版本。如果遇到某些App特别是游戏因x86兼容层运行有问题可以尝试在夜神设置中开启“兼容模式”这可能会让模拟器使用ARM翻译层并换用android-arm或android-arm64的server但性能会有损耗。实操步骤实录以7.1为例创建实例在夜神多开器中选择“安卓7.1 32位”或“64位”新建。建议32位兼容性更广。确认架构启动实例adb shell getprop ro.product.cpu.abi。32位通常是x8664位是x86_64。部署Server下载对应的frida-server-14.2.18-android-x86或x86_64。推送到/data/local/tmp/重命名为fs方便输入赋权。端口转发与连接adb forward tcp:27042 tcp:27042 # 端口转发 adb shell /data/local/tmp/fs # 启动server frida-ps -U # 测试连接脚本测试写一个简单的脚本测试注入是否正常。// test.js Java.perform(function() { console.log([*] Frida Java Hook 环境测试成功); });使用frida -U -f com.example.app -l test.js --no-pause进行注入测试。实操心得对于安卓7.1强烈建议在模拟器设置中将“性能设置”的“手机型号”改为与你的测试App兼容的型号如Samsung Galaxy S8这能避免一些App因设备检测导致的闪退。同时记得开启模拟器的ROOT权限。3.3 安卓9.0/10 (Pie/Q) - 应对新App的进阶挑战场景分析目标App要求的最低安卓版本较高或者使用了大量Android 9的新特性如强化后的SELinux、私有API限制、网络安全性配置等。核心挑战系统安全性增强尤其是SELinux默认策略更严格以及App可能启用了“非SDK接口限制”。推荐组合夜神模拟器版本使用夜神模拟器新建Android 9 (Pie) 实例。安卓10的镜像可能也需要从多开管理器中选择。Frida-server版本Frida 16.0.8 或更新版本如16.1.x。新版本对高版本安卓的内核和运行时适配更好。架构通常选择android-x86_64。关键操作与避坑SELinux问题这是高版本安卓最常见的拦路虎。即使以root身份运行frida-server也可能因为SELinux策略禁止而失败。方案A推荐在推送server后进入adb shell执行setenforce 0将SELinux切换到宽容模式。这是一个临时修改重启失效。方案B如果setenforce 0无效提示权限不足说明模拟器的root实现可能受限。可以尝试修改启动脚本。将frida-server重命名为fs然后创建一个包含以下内容的shell脚本start_fs.sh#!/system/bin/sh setenforce 0 /data/local/tmp/fs 给脚本赋权chmod 755 start_fs.sh然后运行这个脚本。非SDK接口限制如果Hook的目标是Android框架层的隐藏API非SDK接口在安卓9上可能会失败。这通常需要在Hook脚本中使用更底层的Java.vm.getEnv()等方式来绕过或者使用Xposed等更底层的框架。Frida本身不解决这个问题它只是注入工具。网络抓包兼容在高版本安卓上配合frida进行SSL Pinning绕过时要注意系统证书的安装位置用户证书和系统证书。在模拟器上可以将BurpSuite等工具的CA证书直接推送到系统证书目录/system/etc/security/cacerts/但这需要挂载系统分区为可写mount -o rw,remount /system操作有一定风险可能导致模拟器无法启动。更安全的方法是使用JustTrustMe模块需配合Xposed或LSPosed或使用Frida脚本直接Hook证书验证逻辑。3.4 安卓11/12 (R/S) - 前沿探索与更多限制场景研究最新App的安全机制或应对强制要求新版本安卓的App。核心挑战分区存储、更严格的权限模型、不断增强的SELinux、以及可能引入的新的反调试和反Hook机制。推荐组合与策略模拟器选择夜神模拟器可能尚未提供稳定的安卓11/12官方镜像。此时可以考虑雷电模拟器9基于Android 9但部分特性模拟了更高版本或转向Google官方Android Studio内置的模拟器AVD。AVD的AOSP镜像更纯净兼容性问题可能更少但性能开销大且没有夜神/雷电的便捷操作功能。Frida-server版本必须使用最新稳定版如16.x的后期版本或17.x。密切关注Frida的Release Notes看是否有针对Android 11/12的特定修复。架构选择android-x86_64或根据AVD的镜像选择android-arm64。前沿问题应对分区存储Scoped Storage这主要影响你对App数据目录的访问。即使有root权限访问/data/data/package_name也可能受限。Frida的FileAPI可能无法直接读写。解决方案通常是通过run-as命令如果App是debuggable或使用magisk模块提供的更高权限访问。Frida自身被检测一些加固和反调试方案会主动检测Frida。常见检测点包括检测27042等默认端口、检测frida-server进程名、检测libfrida-gadget.so等库文件。应对策略重命名将frida-server二进制文件和frida-gadget.so库文件重命名为一个常见的系统库名。改端口启动server时使用-l 0.0.0.0:8080指定一个非默认端口并在客户端连接时指定-H 127.0.0.1:8080。使用定制化构建从源码编译Frida修改其中的特征字符串如“LIBFRIDA”。考虑替代或辅助工具在极端环境下可以结合使用House一个Frida的Web可视化工具能提供更友好的界面但其底层仍是Frida或者r0capture基于Frida的抓包工具封装了一些反反调试技巧等工具它们有时能绕过一些简单的检测。4. 通用排错流程与急救手册无论选择哪个版本组合一套清晰的排错流程都能帮你快速定位问题。请按以下顺序检查4.1 连接层排查Frida与Server通信了吗检查ADB连接adb devices确保设备已列出且状态为device。检查Server进程adb shell ps | grep frida或adb shell top查看frida-server是否在运行。如果没有检查执行权限和SELinux状态。检查端口转发adb forward --list查看27042端口是否已正确转发。可以尝试杀掉所有转发adb kill-server然后重启adb start-server和adb forward tcp:27042 tcp:27042。防火墙与网络确保本地PC的防火墙没有阻止ADB或Frida的通信。4.2 版本兼容层排查版本匹配吗强制版本匹配在PC端使用frida --version查看frida-tools版本。在模拟器端运行./frida-server --version查看server版本。两者主版本号必须一致。架构匹配这是最常被忽略的一点。再次用getprop ro.product.cpu.abi确认模拟器架构并与你下载的Frida-server文件名中的架构进行比对。x86模拟器必须用android-x86的server。4.3 系统环境层排查模拟器本身健康吗模拟器状态有时模拟器会卡死或处于一种不稳定的“僵尸状态”。尝试完全关闭模拟器从多开管理器里停止而不是点窗口关闭然后重新启动。多开冲突如果你开了多个模拟器实例确保adb连接的是正确的那个通过adb -s emulator-5554指定序列号。端口转发也可能冲突。磁盘空间与内存模拟器磁盘空间不足或内存耗尽会导致各种诡异问题。检查模拟器设置分配足够的资源。4.4 常见错误代码与速查表错误现象可能原因排查步骤Failed to enumerate processes: unable to connect to remote frida-server1. Server未运行2. 端口转发失败3. 版本不匹配1.adb shell检查进程2.adb forward --list3. 核对PC与Server版本Error: unable to connect to remote frida-server: closedServer进程已崩溃退出1. 检查SELinux (getenforce)2. 查看adb logcat是否有崩溃日志3. 尝试更低版本Frida-serverExec format error(在adb shell中运行server时)架构不匹配使用file命令检查二进制文件类型与getprop ro.product.cpu.abi对比Permission denied1. 文件没有执行权限 (chmod 755)2. SELinux拒绝执行1. 赋权2.setenforce 0(临时)注入后目标App闪退1. Frida版本与安卓版本不兼容2. Hook的代码有误导致崩溃3. App有反调试/反Hook1. 换用更稳定的Frida版本组合2. 注释掉Hook脚本逐步排查3. 尝试反反调试技巧重命名、改端口frida-ps -U能列出进程但无法附加特定进程1. 该进程为系统关键进程权限不足2. App为64位但使用了32位的Frida-gadget1. 确保以root运行server2. 确认App的ABI使用对应架构的Frida最后我的个人体会是逆向分析环境的搭建没有一劳永逸的“银弹”。最好的策略是建立你自己的“版本组合知识库”为不同的安卓版本准备2-3套经过验证的夜神/Frida版本组合并做好笔记。当遇到一个新目标时根据其目标SDK版本快速选择一套接近的环境进行尝试如果不行再根据错误日志按上述排查流程一步步分析。把环境问题标准化、流程化才能把宝贵的精力集中在真正的逆向逻辑分析上。

相关新闻

港口EDI加密与数据库透明加密:一条集装箱数据的完整加密链路

港口EDI加密与数据库透明加密:一条集装箱数据的完整加密链路

报错现场:很多港口TOS上线后发现,EDI报文在局域网里明文跑了一年,监控数据直接落盘明文——等要过等保检查时,才发现加密要从头补。 港口的信息化系统(TOS码头操作系统、EDI电子数据交换)里有三类数据最敏感…

2026/10/15 23:35:28 阅读更多 →
深度解析:浙江网站建设推广公司十大排行背后的真相与避坑指南

深度解析:浙江网站建设推广公司十大排行背后的真相与避坑指南

在当今这个互联网深度渗透每一个角落的时代,对于浙江乃至全国的企业来说,拥有一个高品质的官方网站不仅仅是展示形象的窗口,更是获取流量、转化客户以及提升品牌信任度的核心战场。然而,面对市场上层出不穷的服务商和眼花缭乱的技术名词,很多企业主感到困惑甚至焦虑:究竟…

2026/10/17 4:22:47 阅读更多 →
终极指南:如何快速上手开源无人机地面站Mission Planner

终极指南:如何快速上手开源无人机地面站Mission Planner

终极指南:如何快速上手开源无人机地面站Mission Planner 【免费下载链接】MissionPlanner Mission Planner Ground Control Station for ArduPilot (c# .net) 项目地址: https://gitcode.com/gh_mirrors/mi/MissionPlanner 你是否曾梦想拥有一个功能强大且完…

2026/10/15 23:31:43 阅读更多 →

最新新闻

C++竞赛常用算法模板合集:图论、动态规划、计算几何实战

C++竞赛常用算法模板合集:图论、动态规划、计算几何实战

简介:面向ACM/ICPC等程序设计竞赛的C实用模板库,按七大主题分类组织,涵盖头文件模板、数学、字符串、数据结构、图论、计算几何与动态规划,既适合赛前速刷,也可用于日常训练和教学参考。压缩包共83个文件,以…

2026/10/17 21:03:09 阅读更多 →
约瑟夫死亡游戏:循环链表指针操作与内存管理避坑指南

约瑟夫死亡游戏:循环链表指针操作与内存管理避坑指南

简介:这份资源围绕经典的约瑟夫死亡游戏展开,面向正在学习C语言数据结构与算法的初学者及课程设计者,帮助理解循环链表在实际问题中的建模与求解过程。压缩包内仅含1个docx文档,约18KB,以文字形式完整呈现设计思路、算…

2026/10/17 21:03:09 阅读更多 →
SAP生产预留操作全解析:从OMC2配置到MBVR批量清理

SAP生产预留操作全解析:从OMC2配置到MBVR批量清理

简介:这份《SAP-生产预留-操作》文档面向SAP MM与PP模块的顾问、生产计划员及仓储管理人员,聚焦生产预留这一日常高频操作,帮助读者理清从预留创建到查询、批量处理的完整流程。内容覆盖预留背景、OMC2预留编码、工厂级缺省值配置、预留可用性…

2026/10/17 21:03:09 阅读更多 →
PreparedStatement批量插入性能优化:从慢如蜗牛到秒级导入的实战指南

PreparedStatement批量插入性能优化:从慢如蜗牛到秒级导入的实战指南

先把话说在前头:如果你现在还在用for循环一条一条执行INSERT,数据量一旦过万,等待你的基本就是分钟级甚至小时级的耗时。我之前接过一个流水数据迁移任务,40 万条记录要写入一张分表,最初就是用 PreparedStatement 做单…

2026/10/17 21:03:09 阅读更多 →
OpenResearch:Claude Code、Codex、OpenCode、Cursor 四款 AI 编程助手横向对比与协同实践

OpenResearch:Claude Code、Codex、OpenCode、Cursor 四款 AI 编程助手横向对比与协同实践

1. 从“OpenResearch”这个标题说起:它到底想解决什么问题第一次看到“OpenResearch”这个标题,加上旁边一串热搜词——Claude Code、Codex、OpenCode、Cursor——我大概能猜到这背后想聊的是什么。这不是一个单纯的工具介绍,而是一个把当下几…

2026/10/17 21:03:09 阅读更多 →
2026年AI编程工具全解析:33款主流助手与IDE选型指南

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2024年大家还在争论“AI能不能写代码”,到2026年这个问题基本不需要讨论了。我今年在好几个项目里把AI编程工具从“偶尔试用”变成了“日常主力”,从代码补全到自动化测试再到完整功能模块的实现,工具链已经成熟得超出预期。但问题也变成了另…

2026/10/17 21:02:08 阅读更多 →

日新闻

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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →