Unity iOS Framework体积优化:从诊断到压缩的完整方案
1. 项目概述当Unity遇上iOSFramework为何“膨胀”如果你是一名Unity开发者并且你的项目需要发布到iOS平台那么你很可能遇到过这个令人头疼的问题在Xcode中构建项目时生成的.framework文件尤其是UnityFramework.framework体积异常庞大动辄几百MB甚至上GB。这不仅仅是一个“看着不爽”的问题它直接关系到App Store的下载包大小、用户的下载意愿以及最终的转化率。在移动网络环境复杂、用户存储空间宝贵的今天一个臃肿的安装包无疑是产品成功的巨大障碍。这个问题的根源远比“代码没优化”要复杂。它本质上是Unity的跨平台编译机制、iOS的二进制格式要求以及我们项目资源管理方式三者交织产生的结果。简单来说Unity在构建iOS项目时会将大量的托管代码C#、引擎运行时库、项目依赖的Native插件以及序列化后的资源数据打包进一个或多个Framework中。这个过程就像打包一个“生存工具箱”为了确保应用在目标设备上能运行Unity倾向于把可能用到的“工具”都塞进去其中就包含了大量未使用的代码和资源。我接手过不少从其他平台移植过来或历经多个版本迭代的Unity项目几乎每一个在首次尝试iOS打包时都会面临Framework过大的挑战。优化这个过程不是一个可有可无的步骤而是产品上线前必须攻克的性能与体验关卡。接下来我将结合多年的踩坑经验为你系统性地拆解这个问题并提供一套从原理到实操的完整优化方案。2. 核心问题诊断Framework里到底装了些什么在动手优化之前我们必须先搞清楚这个庞大的Framework文件究竟由哪些部分构成。盲目地删除文件或调整设置很可能导致应用在真机上崩溃。我们可以通过几个步骤来“解剖”这个Framework。2.1 使用命令行工具分析构成最直接的方法是进入Xcode的构建产物目录。通常Unity生成的Xcode工程在构建后会在DerivedData文件夹下生成对应的.app和.framework文件。我们可以使用lipo和otool这两个macOS自带的强大工具进行分析。首先找到你的UnityFramework.framework文件其核心是一个同名的二进制可执行文件。我们可以用lipo命令查看它包含了哪些架构的切片lipo -info UnityFramework.framework/UnityFramework对于发布到App Store的版本你很可能看到arm64架构。如果是开发阶段可能还包含x86_64模拟器架构。架构数量直接影响二进制文件的大小。接下来使用otool来查看这个二进制文件链接了哪些动态库这能帮助我们了解引擎和插件依赖otool -L UnityFramework.framework/UnityFramework这个命令会列出一长串.dylib文件路径例如/System/Library/Frameworks/...和rpath/...。过多的外部动态库依赖尤其是第三方插件引入的非系统库会增加包体积和启动复杂度。但更关键的是分析二进制文件本身的段Segment和节Section。我们可以使用size命令来粗略估算size -m -l -x UnityFramework.framework/UnityFramework不过对于Unity项目更重量级的部分往往不是代码而是资源。2.2 定位资源与代码的“体积罪犯”Unity在构建时会将场景、预制体、材质、纹理、音频等资源序列化并打包进Data文件夹在Framework内或作为独立资源包。我们可以通过以下方法定位大头检查构建日志在Unity Editor中执行Build时仔细观察Console输出。Unity会列出被打包的资源。特别关注那些尺寸巨大的纹理、音频文件。使用Asset Bundle Analyzer如果你使用了AssetBundleUnity官方提供的Asset Bundle Browser工具可以详细分析每个Bundle的内容和大小。手动检查Framework内容将.framework文件视为一个文件夹在Finder中右键选择“显示包内容”浏览其内部结构。重点关注Resources文件夹、Data文件夹以及可能存在的Plugins/iOS目录下的静态库.a文件和头文件。根据我的经验体积问题的“元凶”通常集中在以下几个部分按常见影响程度排序纹理资源未压缩的纹理、分辨率过高的UI图集、重复导入的纹理。音频文件未压缩的.wav文件、过长的背景音乐。第三方SDK与插件某些广告、分析、社交插件会引入庞大的静态库和资源文件。托管代码DLL虽然经过IL2CPP转换后是C代码但项目引用的所有.NET程序集包括未使用的都会被分析并包含在内。引擎剥离不彻底Unity引擎本身有很多模块如果项目设置不当未使用的模块如旧的动画系统、某些渲染路径组件可能未被剥离。注意在诊断阶段切忌直接删除Framework内的文件。这些文件之间存在复杂的依赖关系删除可能导致符号Symbol丢失引发运行时崩溃。我们的优化必须在Unity的构建流程和Xcode的编译设置中完成。3. 构建前优化在Unity Editor中“瘦身”优化工作的主战场在Unity Editor的构建设置和项目资产配置中。在这里进行的优化效果最显著也最安全。3.1 纹理压缩与Max Size设置纹理通常是占用空间最多的资源类型。优化纹理是“性价比”最高的手段。平台特定覆盖在Project窗口选中纹理在Inspector中务必为iOS平台设置覆盖格式。推荐使用ASTC压缩格式它在保持较好视觉质量的同时能大幅减少内存占用和包体大小。根据纹理用途选择块大小UI纹理ASTC 4x4 或 5x5 block。3D模型贴图ASTC 6x6 或 8x8 block。合理设置Max Size不要盲目使用2048x2048或4096x4096的纹理。仔细评估纹理在屏幕上的实际显示尺寸。一个在全屏手机上只占四分之一面积的UI元素其纹理分辨率超过1024很可能就是浪费。在Inspector中为每张纹理设置合适的最大尺寸。禁用不必要的Read/Write如果纹理不需要在运行时被CPU修改例如动态生成纹理务必取消勾选“Read/Write Enabled”。这个选项会使纹理在内存中保留一份未压缩的副本增加内存和包体负担。使用Sprite Atlas对于UI精灵使用Sprite Atlas进行打包。这不仅能减少Draw Call还能通过Atlas的纹理设置统一进行压缩和优化避免零散小纹理造成的空间浪费。3.2 音频压缩格式选择音频文件尤其是背景音乐和长音效体积不容小觑。首选MP3或Vorbis.ogg对于背景音乐等长音频绝对不要使用未压缩的WAV格式。在Audio Import Settings中为iOS选择MP3或Vorbis压缩格式。MP3兼容性最好Vorbis在同等文件大小下音质可能略优。设置合适的比特率Bitrate96 kbps或128 kbps对于大多数移动游戏背景音乐已经足够。音效可以使用更高的压缩比。强制为单声道Mono对于非立体声要求的音效如按钮点击、武器声强制导入为单声道文件大小几乎能减半。3.3 代码剥离与托管代码优化这是减少Framework中可执行文件大小的核心环节。启用Managed Stripping Level在Player Settings - Other Settings - Optimization下找到Managed Stripping Level。对于发布版本务必设置为High或Medium。Unity会使用Unity Linker以前叫IL2CPP Stripper来分析你的代码移除未被使用的类、方法、属性等。这是减少IL2CPP生成代码量的最有效手段。处理链接器警告Link.xml设置为High剥离等级时有时会过度剥离一些通过反射Reflection调用的代码导致运行时错误。此时需要创建一个名为link.xml的XML文件放在Assets根目录或任何Resources文件夹下用于告诉链接器保留特定的程序集或命名空间。例如linker assembly fullnameMyGame namespace fullnameMyGame.Serialization preserveall/ /assembly assembly fullnameThirdPartyPlugin preserveall/ /linker使用preserve要谨慎只保留真正必要的部分。审查项目依赖在Player Settings - Other Settings - Configuration中检查Scripting Backend是否为IL2CPP。IL2CPP相比Mono能生成更优化的C代码并且支持64位App Store强制要求。同时检查Api Compatibility Level如果不是必须使用.NET 4.x的新特性使用.NET Standard 2.0或.NET 2.0 Subset通常能引用更小的基础类库。3.4 引擎模块裁剪Unity引擎由许多模块组成你的项目可能只用到了其中一部分。使用Player Settings Modules在Player Settings - Publishing Settings或对应平台设置中你可以看到一系列引擎模块的复选框如“DirectX 11”、“OpenGL ES 3.0”、“Video”等。仔细检查你的项目如果你的游戏是2D或简单3D可能不需要“Progressive Lightmapper”。如果不播放视频可以移除“Video”模块。确保只勾选目标iOS设备支持的图形API如Metal。注意模块裁剪需要充分测试。移除某些模块可能导致依赖它的资源或代码无法工作。建议在移除前后对游戏的所有功能进行回归测试。4. 构建与后处理优化在Xcode环节“精修”当Unity导出Xcode工程后优化工作并未结束。Xcode的编译和链接设置同样能带来显著的体积缩减。4.1 编译器优化等级设置在Xcode中找到你的UnityFrameworktarget进入Build Settings选项卡。Optimization Level (Swift Compiler - Code Generation)对于Release或Distribution配置将其设置为Optimize for Size [-Os]。这个选项会指示编译器在保证性能不明显下降的前提下优先优化生成代码的大小。相比Optimize for Speed [-O]通常能减少5%-15%的二进制体积。Strip Linked Product (Deployment)确保设置为YES。这会在链接完成后剥离调试符号和未使用的代码。Strip Style (Deployment)对于发布版本设置为All Symbols。这将剥离所有非全局符号进一步减小体积。但请注意如果之后需要符号化崩溃日志如使用Crashlytics你需要保留一份.dSYM文件。这个设置不影响.dSYM文件的生成它只影响最终发布到设备上的二进制文件。4.2 启用Bitcode与App ThinningBitcode在Xcode的Build Settings中可以找到Enable Bitcode选项。将其设为YES。Bitcode是苹果的一种中间代码格式。上传包含Bitcode的包到App Store后苹果的服务器可以针对不同的设备进行最终的编译和优化实现App Thinning。重要提示启用Bitcode要求你项目中的所有第三方静态库.a文件也必须支持Bitcode。如果某个插件不支持会导致链接失败。你需要联系插件提供商获取支持Bitcode的版本或者不得已将该插件以动态库.framework形式集成如果它支持的话。App Thinning这是苹果服务器端自动进行的过程无需开发者额外设置。当你上传了支持Bitcode的包后用户从App Store下载时只会下载与其设备如iPhone 13 Pro相关的可执行架构切片和资源从而显著减少下载大小。在Unity构建时确保Target SDK设置为Device SDK并且构建的架构只包含ARM64在Player Settings - Other Settings - Target Architectures中只勾选ARM64这能为App Thinning打好基础。4.3 资源与AssetBundle策略对于资源除了压缩还可以通过动态加载来优化初始包大小。将非必需资源移出初始包分析你的游戏哪些资源是首场景立即需要的哪些是后续关卡、角色、活动才用到的。将后者放入AssetBundle。使用AssetBundle进行动态下载在游戏启动后通过热更新或按需下载的方式从服务器加载AssetBundle。这能极大减少IPA文件的初始体积。Unity的Addressable Assets系统是管理AssetBundle的现代化方案它提供了更优雅的异步加载和依赖管理机制。压缩AssetBundle构建AssetBundle时选择LZ4或LZMA压缩格式。LZ4压缩和解压速度快适合运行时加载LZMA压缩率高但解压慢适合作为初始包内资源的压缩或下载包的压缩。5. 第三方插件与SDK管理第三方插件是Framework体积激增的常见“黑盒”。审计插件定期检查Assets/Plugins/iOS和Assets/Plugins目录。有些插件可能为多个平台提供了库文件确保只保留了iOS所需的.a、.framework和头文件。删除安卓的.jar、.so或Windows的.dll文件。评估必要性问自己这个插件提供的功能是否必不可少是否有更轻量级的替代方案例如一个功能庞大的全功能广告SDK也许你只用到了横幅广告那么可以考虑更换为更精简的SDK或使用其最小化集成包。联系供应商向插件开发者咨询是否有针对包体积的优化建议或“Lite”版本。有些SDK提供了不包含模拟器架构x86_64, i386的库文件或者可以移除不需要的功能模块。合并符号谨慎操作如果多个插件引入了相同的系统库或公共符号理论上可以通过链接器设置去重但这非常复杂且容易出错除非万不得已不建议新手尝试。6. 高级分析与持续优化完成上述步骤后你的Framework体积应该已经有了显著下降。为了追求极致或者诊断一些疑难杂症可以采用更高级的工具。使用Xcode的App Thinning Size Report在Xcode中选择Window - Organizer选中你上传的归档版本点击Distribute App选择Development或App Store Connect在最后一步勾选Include app thinning size report。Xcode会生成一个详细的报告展示在不同设备上应用的预估下载大小和安装大小并列出各个组件如二进制文件、资源、框架的贡献度。这是最权威的官方分析工具。分析LinkMap文件在Xcode的Build Settings中将Write Link Map File设置为YES然后重新构建。构建成功后在构建产物目录通常位于~/Library/Developer/Xcode/DerivedData/.../Build/Intermediates.noindex/.../可以找到.txt格式的LinkMap文件。这个文件详细列出了最终可执行文件中每个目标文件.o和每个符号函数、全局变量所占用的空间。通过编写脚本或使用第三方工具如 LinkMap 分析可以精确找到哪些代码文件或第三方库占用了最多的空间从而进行针对性优化例如寻找某个庞大库的替代品。7. 常见问题排查与实战心得在优化过程中你肯定会遇到各种奇怪的问题。这里记录几个我踩过的坑和解决方案。问题一启用High代码剥离后游戏在启动时或某个功能点崩溃。排查查看Xcode的设备日志Console寻找类似“MissingMethodException”或“DllNotFoundException”的错误。这通常是因为反射、序列化或通过字符串动态创建类型时链接器无法静态分析到这些代码被使用从而将其剥离。解决这就是需要配置link.xml文件的典型场景。仔细分析崩溃堆栈找到涉及的程序集和命名空间将其添加到link.xml中予以保留。如果使用了第三方插件查阅其文档看是否有特殊的链接器配置要求。问题二构建时提示“Undefined symbol”错误尤其是在启用Bitcode或修改剥离设置后。排查错误信息会明确指出缺失的符号名。这通常是因为某个静态库.a文件不支持当前的构建配置如Bitcode或者链接顺序有问题。解决确认所有.a文件都支持Bitcode可以用otool -l library.a | grep __bitcode命令检查。在Xcode的Build Phases - Link Binary With Libraries中尝试调整库的链接顺序将可能有依赖关系的库放在后面。检查Build Settings - Other Linker Flags确保没有错误或冲突的-l链接库或-framework标志。问题三优化后包体积下降不明显但LinkMap显示某个系统框架如CoreGraphics占用巨大。排查这不一定是你直接引用的。很可能是某个第三方插件强制链接了整个庞大的框架但只用了其中一两个函数。解决联系插件开发者反馈。作为临时方案可以尝试在Xcode的Build Phases - Link Binary With Libraries中将该框架的Status从Required改为Optional但这有风险可能导致插件功能失效需要充分测试。个人心得建立基线迭代优化优化不是一蹴而就的。我建议在项目初期就建立一个“包体积基线”。每次引入大的新功能、资产或插件后都重新构建并记录Framework和最终IPA的大小。这样你能清晰看到每次改动对体积的影响便于快速定位“元凶”。将资源压缩、代码剥离等检查项纳入团队的开发规范或CI持续集成流程中可以有效地防止包体积在不知不觉中“膨胀复发”。最后记住一个核心原则优化是一场权衡。在追求最小体积的同时必须保证功能的完整性和运行的稳定性。每一次裁剪和压缩都需要在真机上进行全面、充分的测试。从最重要的纹理和音频压缩开始逐步深入到代码剥离和引擎模块裁剪步步为营你就能将一个臃肿的Unity iOS Framework打磨成精干、高效的应用核心。

相关新闻

从矢量场变成强度以后,还能再变回来吗?光学仿真中最容易被忽视的信息不可逆性

从矢量场变成强度以后,还能再变回来吗?光学仿真中最容易被忽视的信息不可逆性

在光学仿真中,我们经常对数据进行简化。完整电磁场可能被转换为:强度分布;总功率;衍射效率;模态功率;远场角分布;平均偏振参数。这样做非常常见,也往往是必要的。因为完整矢量电磁场…

2026/7/29 1:26:08阅读更多 →
算法稳定性与数据分布的内在联系研究

算法稳定性与数据分布的内在联系研究

这里写自定义目录标题算法稳定性与数据分布的内在联系研究引言算法稳定性的定义与分类数据分布的特性与影响算法稳定性与数据分布的理论联系实验验证与案例分析提升稳定性的方法未来研究方向结论参考文献基础算法选择与优化数据结构优化并行化与分布式设计硬件加速技术性能调优…

2026/7/29 1:26:08阅读更多 →
2026 安卓文件/照片备份最全教程

2026 安卓文件/照片备份最全教程

一、前言 安卓备份的核心痛点相较于 iOS 统一的 iCloud 备份体系,安卓生态机型繁杂、备份规则碎片化,绝大多数用户都会遇到四类常见问题:备份不完整:仅同步相册照片,遗漏办公文档、压缩包、聊天缓存等自定义文件画质被…

2026/7/29 1:26:08阅读更多 →
60、80、90、120法兰伺服电机如何匹配行星减速机框号?附计算与接口核对方法

60、80、90、120法兰伺服电机如何匹配行星减速机框号?附计算与接口核对方法

60、80、90、120法兰伺服电机如何匹配行星减速机框号?附计算与接口核对方法 “60法兰电机配060减速机,90法兰电机配090减速机”,是自动化行业中常见的快速匹配方法。 这套方法适合前期筛选,却不能作为最终订货依据。原因在于&…

2026/7/29 2:32:20阅读更多 →
PLF060-10-S2-P2型号含义详解:减速比、精度等级与电机接口怎么确认

PLF060-10-S2-P2型号含义详解:减速比、精度等级与电机接口怎么确认

PLF060-10-S2-P2型号含义详解:减速比、精度等级与电机接口怎么确认 PLF060-10-S2-P2是一类常见的伺服行星减速机型号。 从型号本身可以识别产品系列、减速机框号、减速比、输入配置和精度等级,但不能仅凭这串字符判断电机一定能够安装,也不能…

2026/7/29 2:32:20阅读更多 →
从广西洪涝看城市生命线的深层脆弱性

从广西洪涝看城市生命线的深层脆弱性

2026年7月,台风"美莎克"给广西带来了一场50年一遇的特大洪涝。59条河流超警、多座水库出险、5.5万人受灾——但这些数字背后,真正值得深究的,不是雨有多大,而是雨打在了一座什么样的城市上。本文以广西洪涝为剖面&#…

2026/7/29 2:32:20阅读更多 →
网络爬虫开发框架与反爬虫对抗技术全解析

网络爬虫开发框架与反爬虫对抗技术全解析

网络爬虫开发框架与反爬虫对抗技术全解析在当今信息爆炸的时代,网络数据已成为宝贵的资源。网络爬虫作为自动化获取网络信息的关键工具,其开发与反爬虫技术的对抗,构成了一场持续演进的技术博弈。这场博弈不仅关乎数据获取的效率与成本&#…

2026/7/29 2:32:20阅读更多 →
桌面级智能装置实战:绘图机、陀螺钟与太阳能追踪器设计全解析

桌面级智能装置实战:绘图机、陀螺钟与太阳能追踪器设计全解析

1. 项目概述:当创客精神遇上桌面级小玩意儿看到“迷你绘图机、创意旋转陀螺钟、微型太阳能追踪器”这个标题,很多老创客会心一笑,而刚入门的朋友可能会觉得眼花缭乱。这其实不是一个单一项目,而是一类项目的典型代表:桌…

2026/7/29 2:32:20阅读更多 →
OpenSmith:本地LLM Pipeline追踪与调试实战指南

OpenSmith:本地LLM Pipeline追踪与调试实战指南

在本地开发和调试 LLM 应用时,你是否遇到过这样的困境:想要追踪每个组件的输入输出、查看中间结果、分析性能瓶颈,却发现现有的工具要么需要接入云端服务,要么配置复杂、难以集成?特别是在涉及敏感数据或需要离线工作的…

2026/7/29 2:30:19阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“!

28. Agent 执行到一半想暂停?用 interrupt 给它设个“关卡“! 在构建复杂的 Agent 系统时,我们经常会遇到这样的场景:Agent 正在执行一个多步骤的任务,比如“下单购买商品”,但执行到一半时,我们…

2026/7/29 0:01:46阅读更多 →
自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

自律同行,突破无界!NANK南卡正式官宣曾舜晞成为品牌代言人

近日,国际专注开放式技术研发的声学品牌Nank南卡,正式官宣实力艺人曾舜晞担任品牌代言人。消息一经发出便轰动全网。为什么耳机品牌不选择流量明星、老牌歌手?而且是选择曾舜晞?让我们一起来探索一下!比起短期的流量&a…

2026/7/29 0:01:46阅读更多 →
【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

【RT-DETR多模态创新改进】CVPR 2025 | 独家特征融合创新改进篇 | 引入RLAB残差线性注意力模块,有效融合并强调多尺度特征,多种改进点,适合红外与可见光融合目标检测任务,有效涨点

一、本文介绍 🔥本文在RT-DETR多模态融合目标检测中引入RLAB残差线性注意力模块,可在不同模态特征交互阶段进行多次残差细化,使可见光、红外等特征在尺度、语义和空间位置上更好对齐;随后将细化特征与解码器输出拼接并生成Q、K、V,通过线性注意力自适应强化关键通道、目…

2026/7/29 0:01:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →