Arsc Decompiler Guide

Game modders often modify resources.arsc to change:

At its core, an ARSC decompiler performs three fundamental operations:

Dump to JSON:

arsc dump resources.arsc --json > mod.json

Edit mod.json, change the value under "packages" -> "entries". Then rebuild: arsc decompiler

arsc build mod.json --output resources_new.arsc

resources.arsc does not contain layout XML source; it only holds IDs referencing compiled binary XML files (in res/layout/). Don’t expect to recover original XML formatting from ARSC alone.

Let’s write a toy decompiler to solidify concepts.

import struct

class ARSCParser: def init(self, data): self.data = data self.pos = 0 self.string_pool = [] Game modders often modify resources

def read_uint32(self):
    val = struct.unpack("<I", self.data[self.pos:self.pos+4])[0]
    self.pos += 4
    return val
def parse_string_pool(self):
    chunk_type = self.read_uint32()  # should be 0x0001
    chunk_size = self.read_uint32()
    string_count = self.read_uint32()
    # Simplified: skip style count, flags, etc.
    self.pos += 20
    offsets = []
    for _ in range(string_count):
        offsets.append(self.read_uint32())
    for off in offsets:
        # Strings are UTF-16, but we'll read until null
        str_pos = self.pos + off
        end = str_pos
        while self.data[end:end+2] != b'\x00\x00':
            end += 2
        raw = self.data[str_pos:end].decode('utf-16le')
        self.string_pool.append(raw)
def parse(self):
    # Top-level chunk
    self.read_uint32()  # type
    self.read_uint32()  # header size
    pkg_count = self.read_uint32()
    for _ in range(pkg_count):
        self.parse_package()
def parse_package(self):
    # Simplified: skip to string pool
    self.pos += 4 + 4 + 4 + 256  # skip id, name, type strings offset
    self.parse_string_pool()
    # Now you can parse entry values using string_pool indices
    print("Found strings:", self.string_pool[:5])
zip -u modified.apk resources_new.arsc

Sign and test.


If you have ever peeked inside an Android APK file (by renaming it to .zip and unzipping it), you have likely encountered a file named resources.arsc. While classes.dex contains the app’s code and AndroidManifest.xml declares its structure, the resources.arsc file is the silent backbone of every Android application.

In simple terms, resources.arsc is a binary lookup table. It maps resource IDs (like 0x7f080012) to actual resource paths, values, configurations (screen size, language, orientation), and styling information. Edit mod

An ARSC decompiler is a specialized tool designed to parse, decode, and reconstruct this binary file back into human-readable formats—usually strings.xml and R.xxx definitions.

This article will explore what ARSC decompilation is, why you need it, how it works, and the best tools available in 2024-2025.