UE5 Android打包全流程实战:从环境配置到APK生成与问题排查
1. 项目概述为什么UE5 Android打包是个“技术活”作为一名在游戏开发一线摸爬滚打了十多年的老兵我见过太多团队在项目临近尾声时被“打包”这个看似简单的最后一步卡住。尤其是UE5项目要发布到Android平台从环境配置到最终生成一个能安装、能运行的APK文件这中间的路坑可不少。网上教程要么是官方文档的简单翻译语焉不详要么是某个特定版本下的“玄学”操作时过境迁就失效了。今天我就结合自己最近几个UE5移动端项目的实战经验把从零开始配置环境到成功生成APK的全流程掰开了、揉碎了讲清楚。无论你是独立开发者还是团队里的TA或客户端主程这篇文章都能帮你建立一个清晰、可靠且可复现的Android打包工作流。UE5的Android打包绝不仅仅是点一下“打包”按钮。它涉及JDK、Android SDK/NDK、Android Studio、UE5插件、项目设置等多套工具的协同任何一环的版本不匹配或路径错误都可能导致打包失败。更头疼的是错误信息往往晦涩难懂。所以我们不仅要会操作更要理解每个步骤背后的“为什么”这样才能在遇到问题时自己就能定位和解决。接下来我们就从最基础的环境搭建开始一步步拆解这个流程。2. 环境配置打好地基避免“踩坑”环境配置是打包的第一步也是最容易出问题的一步。很多人图省事直接安装Android Studio以为UE5会自动搞定一切结果往往在打包时报各种“找不到SDK”、“NDK版本不兼容”的错误。正确的做法是我们主动规划、手动配置确保环境干净、可控。2.1 核心组件安装与版本选择UE5对Android开发环境有明确的版本要求盲目使用最新版往往会引入兼容性问题。以UE5.2/5.3版本为例我推荐的配置如下Java开发工具包JDKUE5 Android工具链基于Java但强烈建议不要使用Oracle JDK而是使用OpenJDK。我长期使用Amazon Corretto 17LTS版本它稳定且免费。安装后需要设置JAVA_HOME系统环境变量指向JDK的安装根目录例如C:\Users\YourName\jdks\corretto-17.0.10并将%JAVA_HOME%\bin添加到PATH变量中。在命令行输入java -version验证是否安装成功。Android Studio与SDK/NDKAndroid Studio本身是一个IDE我们需要的是它管理的SDK软件开发工具包和NDK原生开发工具包。安装从官网下载安装Android Studio。安装向导中务必勾选“Android Virtual Device”虽然我们主要真机调试但AVD有时对验证环境有帮助。SDK配置安装完成后打开Android Studio进入“Settings” - “Appearance Behavior” - “System Settings” - “Android SDK”。在“SDK Platforms”标签页必须安装“Android SDK Platform”对应的API级别。UE5通常要求API Level 24Android 7.0或更高但为了兼容更多设备我一般选择API Level 28Android 9.0作为一个平衡点。同时勾选对应的“Google APIs ARM System Image”以备模拟器之需。NDK配置这是重中之重切换到“SDK Tools”标签页勾选“Show Package Details”。你需要安装特定版本的NDK。UE5.2/5.3官方推荐NDK (Side by side) 版本 r25b。请精确选择这个版本进行安装。绝对不要使用Android Studio默认安装的最新版NDK那几乎是100%会出兼容性问题。注意SDK和NDK的安装路径最好不要包含中文或空格。默认路径如C:\Users\YourName\AppData\Local\Android\Sdk是可以的。记下这个路径我们稍后要在UE5中配置。2.2 UE5引擎内的Android设置环境组件准备好后我们需要在UE5编辑器内进行配置建立连接。启用Android插件打开UE5编辑器进入“编辑” - “插件”。在插件窗口的搜索框输入“Android”确保以下插件已被启用“Android Platform Support”“Android SDK Configuration” (如果存在) 启用后重启编辑器。配置SDK路径重启后进入“编辑” - “项目设置”。在左侧找到“平台” - “Android SDK”。这里就是UE5寻找本地开发环境的地方。Android SDK目录填入你的Android SDK安装路径例如C:\Users\YourName\AppData\Local\Android\Sdk。NDK目录UE5通常能自动检测到已安装的NDK。如果未自动填充请手动指定到NDK的具体版本文件夹例如C:\Users\YourName\AppData\Local\Android\Sdk\ndk\25.1.8937393。JDK目录指定到你的JDK安装根目录例如C:\Users\YourName\jdks\corretto-17.0.10。填写后UE5会验证这些路径。如果路径正确右侧通常会显示绿色的对勾或版本号。如果报错请反复检查路径是否正确以及组件版本是否符合要求。接受Android SDK许可协议这是一个容易被忽略的步骤。在“项目设置” - “平台” - “Android”的“高级”Advanced部分找到“接受SDK许可”Accept SDK Licenses选项可能需要点击一个按钮来触发许可协议的接受过程。你也可以通过命令行进入SDK的tools/bin目录运行sdkmanager --licenses来一次性接受所有许可。3. 项目设置与打包配置详解环境配置妥当我们就可以针对具体的UE5项目进行设置了。项目设置决定了APK的包名、图标、权限、图形API等关键属性。3.1 基础项目设置在“项目设置” - “平台” - “Android”下我们需要关注以下几个核心区域打包Packaging包名Package Name遵循Android反向域名规则如com.YourCompany.YourProject。这是应用的唯一标识上架商店后不可更改务必提前规划好。应用版本Version与版本代码Version CodeVersion是给用户看的字符串如1.0.0Version Code是内部递增的整数用于应用商店判断更新。每次发布新APKVersion Code必须增加。目标SDK版本Target SDK Version与最小SDK版本Minimum SDK VersionTarget SDK建议设置为与安装的SDK Platform一致如28。Minimum SDK决定了应用能安装的最低Android版本需权衡用户覆盖面和可用的API特性一般设为24或26。高级Advanced打包配置Packaging Configuration默认为“打包所有”Pack Everything。如果你的项目资源很大需要考虑使用OBB扩展文件。这里我们先保持默认。纹理压缩格式Texture Compression Format这是影响包体大小和兼容性的关键。UE5提供了多种格式ETC2OpenGL ES 3.0及以上设备支持支持Alpha通道压缩。这是目前兼容性最广、最推荐的选择尤其对于新项目。ASTC更现代的格式压缩比和质量控制更灵活但需要设备硬件支持主流中高端设备基本都支持。如果以高端设备为目标可以选择ASTC。DXT/PVRTC分别是NVIDIA Tegra和PowerVR GPU的专用格式除非你的目标设备非常明确否则不建议使用。支持架构Supported Architectures通常勾选arm64-v8a64位即可覆盖绝大多数现代设备。如果为了极致兼容可以同时勾选armeabi-v7a32位但这会增加包体大小。3.2 图形与渲染设置优化对于移动端图形设置必须做针对性优化否则即使打包成功也可能在真机上卡顿或崩溃。项目设置 - 引擎 - 渲染Rendering移动端多重采样抗锯齿Mobile MSAA建议设为“2X”或“4X”在性能和画质间取得平衡。关闭抗锯齿None在移动端锯齿感会很明显。后处理材质Post Process Materials谨慎使用移动端性能开销大。虚拟纹理Virtual Textures对于开放世界或大量高精度纹理的场景开启虚拟纹理可以显著降低内存占用强烈建议在移动项目上启用并测试。项目设置 - 平台 - Android 图形Graphics默认RHIDefault RHI选择“Mobile Hardware”。这是必须的。帧率Frame Rate建议锁定一个合理的帧率如“60 FPS”或“30 FPS”避免帧率波动和过热。禁用 Vulkan除非你明确需要Vulkan特性并进行过充分测试否则在“Android 高级”设置中可以考虑暂时取消勾选“Enable Vulkan Support”。虽然Vulkan是趋势但OpenGL ES的驱动兼容性目前仍然更稳定可以作为一个排查问题的选项。4. 打包流程实操与APK生成所有设置检查无误后我们就可以开始打包了。UE5提供了几种打包方式。4.1 使用编辑器界面打包开发测试用这是最直观的方式适合快速生成测试包。在UE5编辑器中点击菜单栏的“文件File” - “打包项目Package Project” - “AndroidAndroid”。此时会弹出二级菜单让你选择纹理格式。这里的选择应该与之前在项目设置里选择的“纹理压缩格式”一致。例如项目设置选了ETC2这里就选“AndroidETC2”。如果项目设置选了ASTC这里会有对应的ASTC选项。接下来系统会要求你选择一个输出目录。强烈建议在项目目录外新建一个专门的文件夹例如D:\ProjectBuilds\Android。这有利于管理不同版本和配置的构建。点击“选择文件夹”后UE5会启动打包进程。你可以在编辑器右下角的状态栏看到打包进度。这个过程耗时较长取决于项目大小和电脑性能从十几分钟到数小时不等。打包成功后输出目录下会生成一个以纹理格式命名的文件夹如Android_ETC2里面包含了YourProject_Development-arm64.apk主APK文件。Install_YourProject_Development-arm64.batWindows或.commandMac或.shLinux安装脚本。Uninstall_YourProject_Development-arm64.bat等卸载脚本。4.2 使用命令行打包自动化与持续集成对于需要频繁打包或集成到CI/CD流水线的情况命令行打包是更专业的选择。打开命令行终端如PowerShell或CMD。导航到你的UE5引擎的Engine\Build\BatchFiles目录下。运行以下格式的命令RunUAT.bat BuildCookRun -projectD:\YourProject\YourProject.uproject -platformAndroid -clientconfigDevelopment -serverconfigDevelopment -cook -allmaps -stage -package -archive -archivedirectoryD:\ProjectBuilds\Android-project指定你的.uproject文件完整路径。-platform目标平台这里是Android。-clientconfig构建配置Development开发可调试、Shipping发布性能最优但不可调试、Debug调试含最多调试信息。-cook烹饪内容。-allmaps包含所有地图。-stage将文件暂存到输出目录。-package执行打包。-archive与-archivedirectory将输出打包成归档并指定目录。这个命令会执行完整的烹饪、构建、打包流程最终在指定目录生成APK。4.3 生成Android App BundleAAB用于商店发布如果你计划将应用上传到Google Play商店那么应该生成.aabAndroid App Bundle文件而不是.apk。AAB是一种发布格式Google Play会根据用户设备的具体情况CPU架构、语言、屏幕密度动态生成最优的APK从而减小用户下载的包体。在“项目设置” - “平台” - “Android” - “打包Packaging”中找到“生成BundleAAB”Generate Bundle (AAB)选项将其勾选。同时你可以配置AAB的拆分选项以进一步优化大小启用ABI拆分为不同CPU架构生成独立资源用户只下载其设备需要的部分。启用语言拆分为不同语言生成独立资源。启用密度拆分为不同屏幕密度生成独立资源。勾选“从Bundle生成通用APK”Generate Universal APK from Bundle这样在打包AAB的同时也会生成一个通用的APK方便你本地测试。执行打包操作通过编辑器或命令行。完成后在输出目录中你除了看到常规的APK文件夹还会找到一个.aab文件这就是需要上传到Google Play的应用包。5. 真机部署、调试与常见问题排查生成APK/AAB后工作还没完安装到真机测试是验证打包成果的关键一步。5.1 使用ADB部署与安装连接设备用USB线将Android手机连接至电脑。在手机上开启“开发者选项”通常需要连续点击“设置”-“关于手机”-“版本号”7次并在其中开启“USB调试”USB Debugging。验证连接打开命令行输入adb devices。如果看到设备列表中出现你的设备序列号且状态为device则表示连接成功。如果显示unauthorized需要在手机上弹出的“允许USB调试”对话框中点击确认。安装APK你可以直接使用UE5生成的安装脚本.bat或.sh它内部其实就是调用了adb install命令。你也可以手动安装导航到APK所在目录执行adb install -r YourProject_Development-arm64.apk-r参数表示替换已安装的版本。5.2 常见打包失败问题与解决方案打包过程不可能一帆风顺以下是几个我踩过无数次的坑及其解决办法问题现象可能原因解决方案打包开始时提示“SDK/NDK/JDK not found”或路径错误1. UE5项目设置中的路径配置错误。2. 环境变量JAVA_HOME未设置或设置错误。3. 安装了不兼容的NDK版本。1. 仔细检查“项目设置-Android SDK”中的每一个路径确保指向正确的文件夹。2. 在命令行输入echo %JAVA_HOME%Windows或echo $JAVA_HOMEMac/Linux验证。3. 确保安装的是UE5推荐版本的NDK如r25b并在UE5中正确指向它。打包过程中崩溃错误日志提到“Out of Memory”或“GC Overhead”烹饪或打包时Java虚拟机内存不足。增加Gradle的堆内存。找到引擎目录下的Engine\Build\Android\Java\gradle.properties文件修改org.gradle.jvmargs行例如-Xmx8g -XX:MaxMetaspaceSize1g。将8g根据你电脑内存调整如16g内存可设为-Xmx12g。打包成功但APK安装到手机后闪退1. 项目设置中“最小SDK版本”高于手机系统版本。2. 使用了目标设备不支持的纹理压缩格式如在不支持ASTC的老设备上运行ASTC包。3. 项目内容如蓝图、材质存在移动端不兼容的特性。4. 缺少必要的运行库或权限。1. 检查手机Android版本并降低项目“最小SDK版本”。2. 打包时选择ETC2格式以获取最佳兼容性。3. 使用“移动预览”模式在编辑器中测试排查问题。4. 检查“项目设置-Android-高级”中的“额外权限”确保所需权限如读写存储、网络访问已添加。在AndroidManifest中检查是否缺少必要组件声明。打包出的APK文件异常巨大远超预期1. 打包了所有开发资源包括编辑器专用内容。2. 未使用纹理压缩或使用了低效的压缩格式。3. 包含了所有地图和所有语言包。1. 确保打包配置为“Development”或“Shipping”而非“Debug”。使用“项目设置-打包”中的列表排除不需要的目录。2. 使用ETC2或ASTC纹理压缩。在“项目设置-渲染”中启用虚拟纹理。3. 在打包命令中不使用-allmaps或通过“项目设置-地图和模式”指定仅打包游戏用到的地图。无法生成AAB文件或生成失败1. 未在项目设置中勾选“生成BundleAAB”。2. Java版本或Gradle版本不兼容。3. 签名配置问题。1. 确认已勾选“生成BundleAAB”。2. 尝试使用UE5引擎自带的Java和Gradle。在“项目设置-Android-高级”中可以指定使用“嵌入式”JDK和Gradle。3. 为AAB生成配置正式的签名密钥Keystore而不仅仅是调试密钥。5.3 调试与日志抓取当应用在真机上运行异常时获取日志是定位问题的生命线。使用adb logcat在命令行中输入adb logcat -s UE4或adb logcat -s Unreal可以过滤出UE引擎输出的日志。这是最常用的调试手段。使用UE5内置的远程日志在打包配置为“Development”时你可以在UE5编辑器的“输出日志”Output Log窗口中选择“Android”设备直接查看运行时日志。使用Android Studio的Profiler对于性能问题CPU、内存、GPU可以将APK导入Android Studio使用其强大的性能分析工具进行深度剖析。检查设备兼容性在“项目设置-平台-Android-高级”中启用“启用GPU调试”Enable GPU Debugging并在打包后通过adb shell dumpsys gfxinfo package_name命令可以获取应用的帧耗时信息帮助分析渲染性能瓶颈。整个UE5 Android打包的流程就像组装一台精密仪器每个零件环境、设置、配置都必须严丝合缝。我个人的经验是建立一个标准化的检查清单Checklist每次打包前都核对一遍关键项比如SDK路径、NDK版本、包名、签名等能极大减少低级错误。另外为你的团队维护一份稳定的、经过验证的环境配置文档记录所有软件的具体版本号比任何临时搜索的教程都管用。当打包失败时不要慌张耐心查看错误日志从最底层的环境配置开始逐级排查问题总能解决。最后记住“迭代”和“备份”在做出任何重大设置更改前备份你的项目尤其是Config文件夹下的.ini文件它们记录了所有的项目设置。

相关新闻

曼彻斯特编码:原理、实现与在嵌入式通信中的关键应用

曼彻斯特编码:原理、实现与在嵌入式通信中的关键应用

1. 曼彻斯特编码:一个被低估的“老派”技术如果你从事过工业自动化、物联网设备开发,或者捣鼓过一些老旧的通信协议,大概率会听说过“曼彻斯特编码”这个名字。它不像TCP/IP、HTTP那样家喻户晓,也不像5G、Wi-Fi 6那样充满未来感。…

2026/10/17 4:11:41 阅读更多 →
Unity AssetBundle打包后材质丢失:YooAsset资源管理深度排查指南

Unity AssetBundle打包后材质丢失:YooAsset资源管理深度排查指南

1. 项目概述:当材质在打包后“神秘失踪”在Unity项目开发中,尤其是使用YooAsset这类强大的资源管理框架进行AssetBundle打包后,最令人头疼的问题之一,莫过于在编辑器里运行一切正常,但打包发布到真机或特定平台后&…

2026/10/21 0:07:10 阅读更多 →
开关电容电路:从等效电阻到ADC/滤波器设计的核心原理与实践

开关电容电路:从等效电阻到ADC/滤波器设计的核心原理与实践

1. 项目概述:开关电容电路,模拟世界的“数字”魔术师 如果你玩过水桶接力游戏——用一个空桶从A池舀水,跑到B池倒掉,再跑回来——虽然过程断断续续,但只要跑得够快,最终效果就像有一条连续的水管在从A向B输…

2026/10/18 6:46:10 阅读更多 →

最新新闻

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

欧拉20 SP8上GaussDB 100部署实战:从环境准备到避坑指南

简介:这是面向 GaussDB 100 数据库管理员与运维工程师的部署资源,基于 EulerOS 20 SP8 64 位环境,用于快速完成分布式数据库的安装、升级或版本验证,可减少手动配置带来的时间消耗。压缩包体积约 7.39MB,共 6 个文件&a…

2026/10/21 3:10:09 阅读更多 →
OpenCV实战:多方向箭头识别与模板匹配优化

OpenCV实战:多方向箭头识别与模板匹配优化

“OpenCV 项目实战:多方向箭头识别与模板匹配优化”这个标题里的每一个词,都是我踩过坑之后才真正理解的。接到需求时,我原以为多方向箭头识别只是模板匹配的入门级应用,做起来才发现,光是把“多方向”三个字落地&…

2026/10/21 3:10:09 阅读更多 →
VXLAN分布式网关实验详解:从原理到配置排错

VXLAN分布式网关实验详解:从原理到配置排错

1. 为什么全网都在聊VXLAN,以及分布式网关到底解决了什么先聊点实际的。如果你最近在搞数据中心网络、虚拟化迁移或者跨机房容器网络,一定绕不开VXLAN这个词。我去年的某个项目里,客户要求把两个物理机房的虚拟机网络打通,业务侧要…

2026/10/21 3:10:09 阅读更多 →
OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

OpenCV模板匹配实战:多方向箭头识别与旋转尺度优化指南

最近在做一个视觉定位相关的项目,有一块需求是要从摄像头画面里识别出多方向箭头,并且输出箭头的具体朝向。最开始我觉得这个事不难,OpenCV 的模板匹配跑一版不就完了吗?结果一上手就发现,箭头只要转个方向&#xff0c…

2026/10/21 3:10:09 阅读更多 →
PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

PWM调光LED从原理到实战:频率、占空比、驱动电路与避坑指南

简介:一份以STC12C2052单片机为控制核心、利用脉宽调制(PWM)技术实现LED灯亮度无级调节的完整工程包,面向电子技术爱好者、嵌入式开发初学者及单片机课程实践者。包内涵盖LED显示、自动控制、键盘输入等多个独立功能模块&#xff…

2026/10/21 3:10:09 阅读更多 →
51单片机DS18B20温度采集与NRF905无线传输实战

51单片机DS18B20温度采集与NRF905无线传输实战

简介:这是一套面向单片机爱好者、电子类专业学生与DIY玩家的温度采集与无线传输实践方案,基于51单片机搭配NRF905无线模块,解决短距离温度数据采集与无线收发的问题,适合具备一定电子技术基础、能看懂基础电路图并了解C语言设计原…

2026/10/21 3:09:09 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →