
简介AssetStudio是一款面向游戏开发与资源调试人员的AB包解析工具可帮助用户解压并查看游戏或应用中打包的资源内容解决资源提取、分析与转换的实际需求。资源包共87个文件以70个dll动态链接库为核心辅以json配置、exe可执行程序、config配置文件及lib、dylib等类型压缩包约13.68MB解压即可运行无需复杂配置。工具同时提供CLI命令行与GUI图形界面两种操作方式并集成OpenTK图形库、SixLabors图像与字体处理库、Newtonsoft.Json解析库及ZstdSharp压缩算法支持可完成图形资源查看、图像字体转换、JSON数据处理与Zstandard压缩解压等任务。目前已有595人学习下载适合需要批量解析AB包、提取素材或研究资源打包机制的中高级开发者参考使用。1. AssetStudio 到底解决什么问题从一堆 .ab 文件到能看的贴图手里拿到一个游戏的安装目录Android/data/xxx/files下面躺着几百个.ab文件双击打不开改后缀也没用这时候 AssetStudio 就是那把能撬开它的螺丝刀。它做的事情很具体读取 Unity 打包出来的 AssetBundle俗称 AB 包把里面的 Texture2D、Mesh、AudioClip、TextAsset、AnimationClip 这些对象还原成 PNG、OBJ、WAV、TXT 等能直接查看和二次处理的格式。做游戏逆向、美术资源复用、本地化文本提取、模型二次创作的人基本都会经过这个工具。它不依赖 Unity 编辑器也不需要你懂 C# 反射图形界面点几下就能导出命令行版本还能塞进批处理里跑。这一章先把「它是什么、能干什么、谁该用」讲清楚后面几章再拆怎么装、怎么导、参数怎么调、哪里会翻车。2. 环境准备与最小可跑通流程把 AssetStudio 跑起来并导出第一张贴图2.1 选哪个版本原版、开源分支与移植版的区别AssetStudio 最早是 Perfare 用 C# 写的 Windows 桌面工具后来作者归档社区里出现了几个活跃分支。常见的有基于 .NET Framework 的原版、迁移到 .NET 6/8 的跨平台分支以及一些针对特定 Unity 版本做过兼容补丁的移植版。选版本的核心判断依据是你的目标 AB 包是用哪个 Unity 版本打的以及你本机是什么系统。版本类型运行环境适合场景注意点原版 .NET FrameworkWindows .NET 4.7.2老游戏、Unity 5.x~2019新 Unity 版本可能报错.NET 6/8 跨平台分支Win/Linux/macOS新游戏、批量脚本需要装对应运行时社区移植版视分支而定特定加密或压缩变体来源杂先看 issue我一般会先拿目标游戏里最小的一个.ab文件做试探能正常列出对象再上批量。如果一打开就抛EndOfStreamException大概率是 Unity 版本不匹配或者包被加密了换分支比死磕参数更快。2.2 最小跑通流程加载文件夹、筛选类型、导出贴图图形界面的操作路径很短但每一步都有坑。下面按顺序走一遍。第一步启动 AssetStudio菜单File → Load Folder选中包含.ab文件的目录。它会递归扫描扫描期间状态栏会显示读到了多少个文件。如果目录里混了非 AB 文件它会跳过不用手动清理。第二步左侧Asset List里会出现所有解析出来的对象按类型分组。想只看贴图点Filter Type → Texture2D。这时候列表里就是所有能导出的图片对象。第三步选中要导出的条目右键Export → Selected Assets或者直接Export → All Assets导全部。导出目录里会按类型分文件夹贴图默认存成 PNG。如果只想快速验证工具能不能用可以只导一张贴图看 PNG 能不能正常打开、尺寸对不对。这一步过了说明解析链路是通的。2.3 命令行批量导出把重复劳动交给脚本图形界面适合试探批量就得靠命令行。AssetStudio 的 CLI 版本参数不多但组合起来够用。下面是一个典型的批量导出命令。# AssetStudioCLI 批量导出示例 # -i 输入目录-o 输出目录--types 指定导出类型 AssetStudioCLI \ -i /data/game/ab_packs \ -o /data/export/output \ --types Texture2D,Mesh,TextAsset \ --image-format png \ --mesh-format obj \ --log-file /data/export/run.log逻辑说明-i指向 AB 包所在目录工具会递归扫描-o是导出根目录内部会按类型自动建子目录--types控制只导哪几类对象不写就全导全导在包多的时候非常慢--image-format和--mesh-format决定贴图和模型的输出格式--log-file把解析过程中的警告和错误落盘批量跑的时候不看日志等于闭眼开车。参数怎么改如果只想提取本地化文本把--types改成TextAsset导出后是.txt或.bytes再用脚本扫一遍关键词就行。如果贴图有透明通道但导出后背景变黑检查--image-format是不是被设成了 jpgjpg 不支持透明。提示命令行版本对路径里的空格和中文比较敏感输入输出目录尽量用纯英文短路径能省掉一类玄学报错。3. 解析参数与导出设置贴图、模型、文本各自怎么调3.1 贴图导出格式、尺寸与 mipmap 的处理贴图是 AssetStudio 用得最多的功能但导出结果和原始资源不一定完全一致。Unity 里的 Texture2D 可能带 mipmap、可能被压缩成 ASTC/ETC2/DXTAssetStudio 在导出时会做一次解码和重编码。关键设置有几个。Image Format选 PNG 还是 JPGPNG 无损但体积大JPG 有损但小做素材复用建议 PNG。Export Mipmaps如果勾上会额外导出每一级 mipmap一般不需要除非你在做渲染管线分析。Flip Vertical控制是否上下翻转Unity 的纹理坐标和常见图像格式的 Y 轴方向相反导出后如果发现图是倒的把这个勾上。还有一个容易忽略的点部分贴图在 AB 包里是Texture2D但实际是 RenderTexture 或者 Sprite 的图集。Sprite 图集导出后是一张大图需要配合.meta里的 rect 信息才能切回小图。AssetStudio 能导出 Sprite 对象但切图信息不一定完整做 UI 还原的时候要留意。3.2 模型导出Mesh、材质与骨骼的对应关系导出 Mesh 比导出贴图复杂因为一个模型通常由 Mesh、Material、Texture、Animation 多个对象组成它们之间靠 PathID 关联。AssetStudio 导出 OBJ 或 FBX 时会尽量把材质和贴图一起带上但关联断了就会丢材质。操作上先在Asset List里筛选Mesh选中目标模型导出。如果导出后 OBJ 是灰模说明材质没关联上。这时候回到列表里找对应的Material和Texture2D手动导出后按同名规则放一起再用建模软件重新指定。骨骼和动画是另一个坑。AssetStudio 能导出AnimationClip但导出的动画数据是原始关键帧需要配合 Avatar 才能正确重定向。如果只是看模型形状忽略动画就行要做动画复用建议导出 FBX 而不是 OBJFBX 能保留层级和骨骼信息。3.3 文本与配置提取TextAsset 和 MonoBehaviour 的区别游戏里的本地化文本、配置表、脚本数据通常以TextAsset或MonoBehaviour两种形式存在。TextAsset是纯文本或二进制导出后直接能读。MonoBehaviour是序列化对象导出后是二进制或 JSON需要根据游戏的序列化结构再解析。常见做法是先把所有TextAsset导出来用grep或脚本扫一遍看有没有可读的 JSON、CSV、XML。如果没有再去看MonoBehaviour这时候往往需要配合Assembly-CSharp.dll里的类定义才能反序列化。AssetStudio 本身不做反序列化它只负责把对象 dump 出来后续解析要靠自己写脚本。注意部分游戏的文本被加密或压缩过导出的TextAsset打开是乱码。这时候先看文件头如果是UnityFS开头说明还是包如果是其他魔数可能需要先解密再解析。4. 避坑与排查AB 包解析里最常见的 5 个翻车现场4.1 打开就报 EndOfStreamException现象加载文件夹后状态栏卡住日志里刷EndOfStreamException或Invalid header。原因AB 包的 Unity 版本和 AssetStudio 支持的版本不匹配或者包被自定义加密/压缩过。Unity 的 AB 包格式在 5.x、2017、2018、2019、2020 之间有过几次变化老工具读新包就会在头部解析失败。解决先确认游戏的 Unity 版本方法是在游戏目录里找globalgamemanagers或data.unity3d用十六进制编辑器看版本字符串。然后换对应版本的 AssetStudio 分支。如果是加密包需要先找到解密逻辑常见的是对头部做 XOR 或对整包做 AES这部分没有通用方案得针对具体游戏分析。4.2 贴图导出后是纯黑或纯白现象PNG 能打开但内容全黑、全白或者花屏。原因贴图的压缩格式 AssetStudio 不支持或者解码时用了错误的格式。Unity 常用的压缩格式有 DXT1/5、ETC1/2、ASTC、PVRTC不同平台用的不一样。AssetStudio 对 DXT 和 ETC 支持较好ASTC 在部分分支里支持不完整。解决换一个支持 ASTC 的分支或者在导出设置里把Image Format改成Raw先导出原始数据再用其他工具解码。如果是花屏检查是不是把法线贴图当普通贴图导了法线贴图的 RGB 通道含义不同看起来就是花的。4.3 模型导出后没有材质和贴图现象OBJ 或 FBX 能打开但模型是灰的材质球是空的。原因Mesh 和 Material 的关联信息在导出时丢了或者 Material 引用的 Texture 没有被一起导出。AssetStudio 导出模型时如果只选了 Mesh 没选 Material关联就会断。解决导出时把 Mesh、Material、Texture2D 一起选中再导或者导出后手动把同名贴图放到模型目录下在建模软件里重新指定。更稳的做法是先用 AssetStudio 的Export → All Assets全导一次再从导出结果里挑需要的文件。4.4 批量导出跑到一半内存爆了现象命令行跑了几百个包之后进程被系统杀掉日志停在某个文件。原因AssetStudio 在解析大包时会占用较多内存尤其是包含大量贴图或高面数模型的包。CLI 版本默认不会主动释放已解析对象的缓存包一多就累积。解决分批跑每个批次控制在几十个包跑完一批重启一次进程。或者用--types限制只导需要的类型减少内存占用。如果必须一次跑完给机器加内存比调参数更直接。4.5 导出的文本是乱码或二进制现象TextAsset导出后打开是乱码或者是一堆不可读的二进制。原因文本被加密、压缩或者本身就是二进制格式比如 protobuf、MessagePack。Unity 的TextAsset不保证是纯文本很多游戏会把配置表序列化成二进制再塞进去。解决先看文件头如果是PK开头可能是 zip如果是1F 8B是 gzip先解压。如果是 protobuf需要找到.proto定义或者从Assembly-CSharp.dll里反推结构。这一步没有捷径属于逆向的深水区工具只能帮你到 dump 这一层。5. 进阶技巧用脚本把 AssetStudio 接进自动化流水线5.1 批量导出后的资源分类与重命名AssetStudio 导出的文件名默认是对象名加 PathID比如Texture2D_123456.png可读性差。做资源复用的时候我一般会写一个 Python 脚本根据导出目录结构和文件头做二次分类。import os import shutil from pathlib import Path # 按文件头把导出资源分到 image/mesh/text 三类 EXPORT_ROOT Path(/data/export/output) TARGET_ROOT Path(/data/export/sorted) def classify_by_header(filepath): with open(filepath, rb) as f: header f.read(4) if header.startswith(b\x89PNG) or header.startswith(b\xff\xd8): return image if header.startswith(b# ) or header.startswith(bv ): return mesh return text for sub in EXPORT_ROOT.iterdir(): if not sub.is_dir(): continue for f in sub.iterdir(): if not f.is_file(): continue category classify_by_header(f) dest TARGET_ROOT / category / f.name dest.parent.mkdir(parentsTrue, exist_okTrue) shutil.copy2(f, dest)逻辑说明遍历导出目录读每个文件的前 4 个字节PNG 和 JPG 归到 imageOBJ 的#或v开头归到 mesh其余归到 text。参数上EXPORT_ROOT改成你的实际导出目录TARGET_ROOT是分类后的目标目录。这个脚本只做粗分类实际用的时候可以按项目需要加更多规则比如按尺寸过滤贴图、按面数过滤模型。5.2 用导出结果做资源差异对比做版本更新分析的时候需要知道新版本 AB 包里多了哪些资源、少了哪些、改了哪些。做法是分别导出两个版本然后用文件哈希做对比。# 对两个导出目录做哈希清单并对比 find /data/export/v1 -type f -exec md5sum {} \; | sort -k2 /tmp/v1.md5 find /data/export/v2 -type f -exec md5sum {} \; | sort -k2 /tmp/v2.md5 # 只看新增和删除的文件名 diff (awk {print $2} /tmp/v1.md5) (awk {print $2} /tmp/v2.md5) # 看内容有变化的文件 join -j 2 /tmp/v1.md5 /tmp/v2.md5 | awk $2 ! $3 {print $1}逻辑说明第一条命令生成 v1 的文件名和哈希清单第二条生成 v2 的。diff对比文件名列表能看出新增和删除。join按文件名合并两份清单比较哈希值输出内容有变化的文件。参数上路径换成你的实际导出目录哈希算法用 md5 够快要更稳可以换 sha256。这套流程跑顺之后每次游戏更新只需要重新导出、跑一遍脚本就能拿到资源变更清单比人工翻目录快得多。5.3 我踩过的那些坑最后说几个血泪经验。第一不要在原版 AssetStudio 上死磕新游戏社区分支更新更快遇到解析失败先换分支。第二批量导出一定要写日志不然跑到一半崩了你不知道是哪个包的问题。第三导出的资源不要直接覆盖上一版按版本号建目录后悔药没地方买。第四遇到加密包先判断加密层级是头部加密还是整包加密头部加密好处理整包加密往往要动调试器。第五工具只是入口真正的活是导出之后的资源整理和二次处理那部分没有现成工具得自己写脚本。希望帮到你。本文还有配套的精品资源点击获取