About this project
This repository is a documentation set rather than a runnable application. It records reverse-engineering findings for a decompiled Spotify Android APK and for a companion project called spotify-muter.
Scope and method
The analyzed build is Spotify 9.1.84.2205 (release r1), decompiled with JADX 1.5.6 using deobfuscation and bad-code recovery. The generated source tree is placed under decompiled/sources/. Where JADX cannot reconstruct a critical method, targeted APKTool/smali extraction is used, with bytecode targets stored under analysis/smali-targets/. The notes state this was needed to recover the MediaSession action builder and parts of the ad-skip UI mapping.
Documentation structure
The README acts as an index to numbered notes: reverse-engineering scope and limitations; application architecture; playback and player state; Android MediaSession integration; the advertising pipeline; ad reporting and tracking; skipping and playback restrictions; networking (Esperanto and Cosmos); a subsystem/package map; the Spotify Ad Muter architecture; a research index with open questions; an Android component inventory; the runtime and framework stack; a top-level package index; and a deep trace of ad milestones, skip delay, and Android skip-next behavior.
Mental model
The notes present a high-level flow from SpotifyApplication through SpotifyMainActivity and feature UIs, branching into player state and navigation/UI. Player state leads to ContextTrack plus Restrictions, which feed both MediaSession export (to Android system UI and external integrations) and player commands into the Spotify player core. Ads are described as inserted into the same playback model as ordinary tracks, but carrying ad-specific metadata such as is_advertisement, ad_id, ad_playback_id, ad.is_skippable, and ad.skippable_ad_delay.
A recurring observation is that Spotify exposes stable domain models such as PlayerState, ContextTrack, and protobuf request/response types, while much of the surrounding wiring is heavily obfuscated into the p204p package.
Confidence labeling
The documentation distinguishes three levels: Confirmed (directly visible in decompiled code, smali, resources, or manifest), Strong inference (multiple independent code paths support the same interpretation), and Uncertain (reconstruction/obfuscation or a native/backend boundary prevents a definitive conclusion). The notes explicitly avoid treating JADX-generated names as original source names.
What it is useful for
This material is aimed at readers studying Android app internals, media playback state handling, MediaSession integration, and advertising/skip logic in a large obfuscated application. It is a research and reference resource, not a tool for end users, and it does not claim to provide a working modified client.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.