Unity APK Decompiler

Unity APK Decompiler Online

Pull the game out of an Android build — assets, C# scripts and IL2CPP metadata — not just the Java wrapper.

.apk Mono IL2CPP
Drop your Unity APK here
Choose file

⚠ Drag-and-drop upload could not load — an ad blocker is most likely blocking it. Please disable your ad blocker and reload the page to upload a file.

How It Works

1

Upload

Drop the APK. Unity content is detected from the archive itself, not the file name.

2

Extract & Decompile

Assets are exported and scripts are handled per backend — C# for Mono, a metadata dump for IL2CPP.

3

Browse

Read the results in your browser, or download the whole tree as a ZIP.

A Unity APK Is Two Applications in One

An ordinary APK decompiler reads Dalvik bytecode and Android resources. In a Unity game that gets you the launcher activity, the ad and analytics SDKs, and a class called UnityPlayerActivity — and nothing whatsoever of the game. The game lives in a second payload the Android toolchain never touches: serialized Unity assets under assets/bin/Data/, and script code in either managed .NET assemblies or a native IL2CPP binary.

Upload an APK here and both halves are handled. You still get the usual sources/, resources/ and smali/ folders; a detected Unity build adds a unity/ folder next to them.

What Ends Up in the unity/ Folder

Mono vs. IL2CPP: What You Can Actually Recover

This is the single question that decides how much of a Unity game you get back, and it was settled by whoever built the game, years before you downloaded it.

Mono builds ship C# compiled to .NET IL in Assembly-CSharp.dll. IL keeps the full type system and the instruction stream maps cleanly back to C#, so decompilation returns method bodies, control flow, string constants and usually field and parameter names. This is the good case: the output reads like source. Mono was Unity's original backend and is still used by plenty of Android games, especially smaller ones and older builds.

IL2CPP builds converted that same IL to C++ and then to native ARM machine code, shipped as libil2cpp.so. The C# method bodies do not exist in the APK in any form a decompiler can read — they are compiled machine instructions. What does survive is global-metadata.dat, the file the runtime uses to reflect over its own types, and it is remarkably informative: class and struct declarations, inheritance, field types, method signatures, attributes, every string literal in the program, and the native address of each method body. Il2CppDumper turns that into dump.cs and a set of dummy assemblies, which ILSpy then renders as browsable C# stubs.

So on an IL2CPP game you can see the entire architecture of the code — every class, every method name, every constant string, and where each method lives in the binary — but not the statements inside the methods. Recovering those means reading the native code at the addresses in the dump with a disassembler.

Why Unity Assets Need a Different Extractor

Unity does not ship PNG or WAV files. At build time everything is packed into serialized files — data.unity3d, globalgamemanagers, level* and asset bundles — where each object is a binary record laid out according to a type tree that is itself embedded in the file, and textures are stored in GPU-native compressed formats such as ETC2, ASTC or DXT rather than any format an image viewer knows. Reading them means implementing Unity's serialization format and its texture codecs. That is what runs here, per object, so that one unreadable asset costs you that asset and nothing else.

Objects that cannot be parsed are still written out as raw bytes under assets/unparsed/, and MonoBehaviour records are always saved as raw .bin alongside a JSON type tree when one can be read — IL2CPP builds frequently lack the type information needed to deserialize custom behaviour fields, and the raw bytes remain useful.

Limits

What It Is Used For

Recovering your own game's content after losing the project, auditing an SDK a game embeds, checking whether a shipped build leaks API keys in its string literals, investigating asset theft, modding and translation work, and studying how a technique was implemented. Decompiling software you do not own may be restricted by its licence and by local law; that is your call to make before you upload.

Frequently Asked Questions

Can you get the C# source code out of a Unity game?

With a Mono build, yes — Assembly-CSharp.dll is .NET IL and decompiles back to C# with method bodies intact. With IL2CPP, no: the C# was compiled to native code, and only declarations, signatures, string literals and native addresses can be recovered.

What is IL2CPP?

Unity's ahead-of-time pipeline. It converts compiled C# IL to C++ and then to native machine code, shipped as libil2cpp.so. The type system survives separately in global-metadata.dat, which is what makes any recovery possible.

How do I know whether a game is Mono or IL2CPP?

Upload it and read unity/README.txt. By hand: lib/*/libil2cpp.so plus assets/bin/Data/Managed/Metadata/global-metadata.dat means IL2CPP; DLLs under assets/bin/Data/Managed/ mean Mono.

What about XAPK, APKS and AAB bundles?

Upload them as usual — see the bundle decompiler. The Unity payload lives in the base APK inside the bundle, so open that inner APK from the file listing to get its unity/ folder.

Does this recover the original Unity project?

No. Unity builds are one-way. You get exported assets in ordinary formats plus serialized behaviour data and script metadata — not .unity scenes, prefabs or an openable project.

Does Unity analysis run the uploaded game?

No. The APK is read as an archive and parsed. No code from it is executed, and every analysis stage runs in an isolated, time-limited worker process.

Can I decompile a standalone Assembly-CSharp.dll?

Yes — upload it to the DLL decompiler, which decompiles .NET assemblies to C# on their own.