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.