# FULL APK AUDIT — Netfly TV + Streamflix

Audit date: 2026-06-13
Source: jadx decompilation (Netfly TV v3.0.3) + GitHub source (Streamflix v1.7.224)

---

# 1. NETFLY TV

## 1.1 Identity

- **Package name:** `org.drive_hunter` (manifest root) — app classes under `xyz.netfly.*`
- **Framework/library layer:** `xyz.stream.*` (shared streaming SDK)
- **Version:** 3.0.3 (versionCode 12)
- **Min SDK / Target:** 24 / 28 (compileSdk 36)
- **Developer:** Anywhere Soluções em Tecnologia (Brazil)
- **Original brand:** Olé TV (IPTV operator, licensed as SEAC Nº 2018/2016)
- **Real app name (from strings):** Netfly TV

## 1.2 Architecture

- **Hybrid:** Native Android (Java) + Flutter module
- **Base class:** `MultiDexApplication` via `xyz.netfly.MyApplication`
- **DI:** Service-locator pattern (static singletons throughout)
- **Event bus:** GreenRobot EventBus
- **View binding:** Custom base (`v3.a / BaseActivity`) — not standard ViewBinding
- **State management:** ViewModel + LiveData (androidx)
- **Image loading:** Glide via `UnsafeOkHttpGlideModule` (custom OkHttp integration)
- **UI:** XML layouts, custom TV RecyclerView, auto-size screen adaptation
- **Security:** Native library `libsecurecheck.so` loaded via `NativeSecurity` — root/tamper detection. Uses SHA256 `F9CC3604AAFE1BA0D45021229AE56845F4C45EC10339FF75ECD1D2FBBCC64B38`

## 1.3 Backend API

- **CMS-driven config:** Loads `cms_config.json` from server to `getFilesDir()`
- **API helper:** `xyz.stream.api.o` (RemoteApiHelper)
- **HTTP client:** Custom — uses `clientgosdk` (Go-based client library?) with GZip compression
- **All API routes mapped with `psk_app_nf_*` keys** (signed request keys):

```
app/check → psk_app_nf_check
app/code → psk_app_nf_code
app/active → psk_app_nf_active
app/device/token → psk_app_nf_token
app/info → psk_app_nf_info
app/latest → psk_app_nf_latest

user/device/login → psk_app_nf_login
user/login/sn → psk_app_nf_sn
email/login → psk_app_nf_e_login
email/reg → psk_app_nf_reg
email/send → psk_app_nf_e_send
email/reset_password → psk_app_nf_rstpw
user/password/lost → psk_app_nf_lost
user/order/status → psk_app_nf_u_status
user/lock → psk_app_nf_u_lock
user/lock/set → psk_app_nf_u_lock_set
user/watchers → psk_app_nf_watchers
user/play/history → psk_app_nf_p_history
user/favorite → psk_app_nf_favorite
user/dislike → psk_app_nf_dislike

video/search → psk_app_nf_v_search
video/list → psk_app_nf_v_list
video/info → psk_app_nf_v_info
video/random → psk_app_nf_v_random
video/top → psk_app_nf_v_top
video/tags → psk_app_nf_v_tags
video/episodes → psk_app_nf_v_episodes
video/episodes/sources → psk_app_nf_ve_sources

live/channels/play → psk_app_nf_c_play
live/channels/list → psk_app_nf_c_list
live/channels/epgs → psk_app_nf_c_epgs
live/categories/list → psk_app_nf_list
live/category → psk_app_nf_live_category
live/channels → psk_app_nf_live_channels
live/channels/adult → psk_app_nf_live_c_adult
live/channels/hot → psk_app_nf_c_hot

sports/football/leagues → psk_app_nf_fo_leagues
sports/football/leagues/matchs → psk_app_nf_fo_leagues_matchs

support/config → psk_app_nf_s_config
config/key → psk_app_nf_v_key
translation/subtitle → psk_app_nf_subtitle
```

- **Auth:** Device-based login (`user/device/login`), email login (`email/login`), code activation (`app/code` + `app/active`)
- **Registration:** Email + password with OTP (`email/reg`, `email/send`)

## 1.4 Player

- **Primary: IJKPlayer** (`tv.danmaku.ijk.media.player`) — Bilibili's FFmpeg-based player
  - Uses `IjkPlayerRuntime.builder()` for initialization
  - Supports HLS, RTSP, RTMP, M3U8, progressive MP4
  - Custom `IjkVideoView` + video gesture controls
  - PreloadManager for channel pre-buffering
  - CacheManager for on-device caching
- **Secondary:** Media3 ExoPlayer (referenced in imports)
- **Custom overlay:** `VideoGestureFrameLayout` for brightness/volume/seek gestures
- **Core player activities:**
  - `PlaybackActivity` — Main playback with full controls
  - `PlayerActivity` — VOD player wrapper
  - `LivePlayActivity` — Live TV player
  - `IptvLiveActivity` — IPTV stream player
- Subtitle loader: `xyz.stream.api.SubtitleLoader`
- Audio/subtitle picker: `AudioAndSubtitleActivity`

## 1.5 Screens (34 activities)

| Activity | Purpose |
|---|---|
| SplashActivity | Launcher, activation/license check, init |
| LoginActivity | Email/password + OTP + register |
| RoleActivity | Role/package selection |
| HomeActivity | Main home (landscape TV) |
| DashboardActivity | Dashboard screen |
| MainTvActivity | TV-optimized main screen |
| MobileMainActivity | **Flutter** mobile interface |
| VodLibraryActivity | Movie/show library |
| VodInfoActivity | Movie/show detail |
| VodPlayerActivity | VOD playback |
| PlaybackActivity | Full playback controls |
| LiveActivity | Live TV guide |
| LivePlayActivity | Live channel playback |
| SelectChannelActivity | Live channel picker (dialog) |
| ChannelListActivity | Channel list |
| CategorySettingActivity | Category filter settings |
| IptvLiveActivity | IPTV stream playback |
| IptvSelectChannelActivity | IPTV channel selector |
| SearchTvActivity | TV search |
| SearchTabletActivity | Tablet search |
| PersonActivity | Cast/crew detail |
| MatchActivity | Sports match viewer |
| LeagueSortActivity | Sports league browser |
| DownloadItemActivity | Download manager |
| SubscriptionActivity | Subscription/payment page |
| AdultLibraryActivity | Adult content section |
| ParentalLockActivity | PIN/parental lock |
| VideoDetailActivity | Mobile video detail (Flutter-aware) |
| EpisodesActivity | Episode selector (dialog) |
| SelectTagActivity | Category/tag filter (dialog) |
| AudioAndSubtitleActivity | Audio track/subtitle picker |
| AirplayGuideActivity | AirPlay instructions |
| CastAndCrewDetailActivity | Cast/crew details |
| FeedbackPopActivity | Feedback dialog |

## 1.6 Monetization

- **AdMob:** AdMob app ID `ca-app-pub-8852922660664051~9258636436`
- **Pangle (ByteDance):** v8.1.0.3 — full-screen, reward, banner, interstitial ads
- **Subscriptions:** `SubscriptionActivity` with `user/order/status` endpoint
- **Activation codes:** `app/code` + `app/active` for user validation
- **Pay config:** `pay_website_config` from CMS, with Netfly-specific `link_url`
- Google Ad Manager mode enabled

## 1.7 Storage & Downloads

- **DownloadService:** Foreground service with notification channel `download_channel`
- **SQLite-based:** Download database via `DbHolder`, tracks `FileInfo` + `DownloadInfo`
- **Background pool:** Single-thread executor, LinkedBlockingDeque
- External storage permission (legacy) for up to SDK 32
- Media3-style download management

## 1.8 Analytics & Messaging

- Firebase Analytics (`google_analytics_*` meta flags all `true`)
- Firebase Cloud Messaging (custom `MyFirebaseMessagingService` + default service)
- Google Analytics (via `AppMeasurementReceiver/Service/JobService`)
- Performance monitoring: `firebase_performance_logcat_enabled`
- Crash reporting via Firebase Crashlytics (implied by Firebase deps)

## 1.9 Key Dependencies (from decompiled APK)

| Layer | Library |
|---|---|
| Player | IJKPlayer (`tv.danmaku.ijk.media.player`), Media3 ExoPlayer |
| Image loading | Glide + OkHttp integration |
| HTTP | OkHttp (custom), clientgosdk |
| Database | Room |
| State | LiveData + ViewModel |
| Events | GreenRobot EventBus |
| Ads | AdMob + Pangle v8.1.0.3 |
| Analytics | Firebase + Google Analytics |
| Push | Firebase Cloud Messaging |
| WebView | Flutter InAppWebView |
| Screen adapt | `xyz.stream.view.autosize` |
| Security | Native `libsecurecheck.so` |
| QR/Barcode | ZXing |
| Crypto | AndroidX Security (MasterKey) |
| Work | AndroidX WorkManager |
| Flutter | Flutter engine + Impeller (disabled) |

---

# 2. STREAMFLIX

## 2.1 Identity

- **Package name:** `com.streamflixreborn.streamflix`
- **Full source:** https://github.com/streamflix-reborn/streamflix
- **Version:** 1.7.224 (source) / user has 1.7.117
- **Min SDK / Target:** 21 / 35
- **Language:** Kotlin 99.8%
- **License:** Apache 2.0
- **Stars:** 558 on GitHub
- **Note:** Community continuation of original Streamflix by Lory-Stan TANASI (DMCA'd from GitHub)

## 2.2 Architecture

- **Pure Kotlin** — single-activity with Navigation Component
- **MVVM** — Fragments + ViewModels + StateFlow
- **ViewBinding** enabled
- **DI:** Manual (static `object` providers, singleton pattern)
- **Image loading:** Glide 5.0.0-rc01 + KSP annotation processing
- **Networking:** OkHttp 4.12.0 + Retrofit 2.11.0
  - Custom JsoupConverterFactory (parse HTML into models)
  - Gson / Scalars converters
  - Logging interceptor (debug only)
- **DNS:** Cloudflare DoH (`https://cloudflare-dns.com/dns-query`) plus system DNS fallback
- **SSL:** Conscrypt for modern TLS on old Android + manual ISRG Root X1 cert injection

## 2.3 Provider System (45+ scrapers)

**Interface:** `com.streamflixreborn.streamflix.providers.Provider`

```kotlin
interface Provider {
    val baseUrl: String
    val name: String
    val logo: String
    val language: String

    suspend fun getHome(): List<Category>
    suspend fun search(query: String, page: Int): List<AppAdapter.Item>
    suspend fun getMovies(page: Int): List<Movie>
    suspend fun getTvShows(page: Int): List<TvShow>
    suspend fun getMovie(id: String): Movie
    suspend fun getTvShow(id: String): TvShow
    suspend fun getEpisodesBySeason(seasonId: String): List<Episode>
    suspend fun getGenre(id: String, page: Int): Genre
    suspend fun getPeople(id: String, page: Int): People
    suspend fun getServers(id: String, videoType: Video.Type): List<Video.Server>
    suspend fun getVideo(server: Video.Server): Video
}
```

**Provider list (45 total, with language support):**

| Language | Providers |
|---|---|
| English | Sflix, StreamingCommunity(en), Ridomovies, GuardaFlix, Einschalten, Frembed, AfterDark, Kidraz |
| Italian | StreamingCommunity(it), StreamingIta, Altadefinizione01, CB01, GuardaSerie, HDFilme |
| Spanish | CineCalidad, Pelisplusto, Cine24h, SoloLatino, Doramasflix, Latanime |
| French | Wiflix, FrenchStream, FrenchAnime, FrenchManga, UnJourUnFilm, MEGAKino |
| German | FilmPalast, PoseidonHD2, Zeriun |
| Portuguese/Global | MStream, CuevanaEu, FlixLatam, TvporinternetHD, TvLibrefutbol |
| Anime | AnimeWorld, AniWorld, Animefenix, AnimeFlv, AnimeAv1, AnimeUnity, AnimeSaturn, LaCartoons |
| Multi-language | CableVisionHD |
| IPTV | IptvOrg, IptvSpain |

**Metadata enrichment:** `TmdbProvider` uses TMDB API for posters, trailers, cast, ratings

## 2.4 Extractor System (89 video hosters)

**Interface:** `com.streamflixreborn.streamflix.extractors.Extractor`

```kotlin
abstract class Extractor {
    abstract val name: String
    abstract val mainUrl: String
    open val aliasUrls: List<String> = emptyList()
    open val rotatingDomain: List<Regex> = emptyList()
    abstract suspend fun extract(link: String): Video
}
```

**Extractor categories:**
- **Direct MP4 hosts:** Streamtape, Vidoza, MixDrop, DoodLa, Filemoon
- **Embed resolvers:** VidsrcTo, VidsrcNet, VidsrcRu, TwoEmbed, Vidplay
- **AES-encrypted sources:** Rabbitstream (key server at `keys4.fun`), Megacloud (Dokicloud)
- **Cloud storage:** GoogleDrive, AmazonDrive, Pcloud, MailRu, Oneupload
- **Specialized:** StreamWish (4 sub-variants), Chillx (2 variants)
- **Fork:** Voe, Vtube, Upzone, Streamhub, Moflix, LuluVdo, Supervideo
- **Universal bridge:** StreamHG/Sync/Cuevana links auto-resolved before extractor matching

**Resolution algorithm:**
1. Check universal bridge (mysync.mov/stream/)
2. Match by URL prefix → mainUrl / aliasUrls
3. Fallback: domain-agnostic matching (strip TLD)
4. Fallback: regex rotating domains
5. Fallback: server name fuzzy match

## 2.5 Player

- **Media3 ExoPlayer** v1.8.0
  - HLS (`media3-exoplayer-hls`)
  - DASH (`media3-exoplayer-dash`)
  - Progressive download
  - Media3 Session for lockscreen/media notifications
- **Picture-in-Picture** (mobile only)
- **Custom player UI:** `PlayerTvView` / `PlayerMobileView`
- **Player settings fragment:** Aspect ratio, subtitles, playback speed, caption style
- **Gesture controls:** `PlayerGestureHelper` for brightness/volume gestures
- **Subtitle sources:** SubDL API, OpenSubtitles, embedded tracks
- **Resume playback:** Saved positions in Room DB via `lastPlaybackPositionMillis`

## 2.6 Database (Room v8)

- **Per-provider databases:** Each provider gets its own `.db` file (e.g., `sflix.db`)
- **Tables:** `movies`, `tv_shows`, `seasons`, `episodes`
- **Watch tracking:** `isWatched`, `watchedDate`, `lastEngagementTimeUtcMillis`, `lastPlaybackPositionMillis`, `durationMillis`
- **Favorites:** `isFavorite`, `favoritedAtMillis` (movies and TV shows)
- **Indexes:** Episodes by tvShow+isWatched, tvShow+engagement, season+number
- **Separate databases:** `AniWorldDatabase`, `SerienStreamDatabase` (German anime/series)

## 2.7 Special Features

- **No ads, no account:** 100% free, no registration
- **In-app updater:** GitHub releases + in-app APK download with FileProvider
- **QR code scanner:** `QrScannerActivity` via ZXing
- **Bypass WebView:** `BypassWebViewActivity` for resolving protected video pages
- **WebSocket bypass:** Local WebSocket server + client for solving Cloudflare challenges
- **WebView resolver:** `WebViewResolver` for JavaScript-heavy video sources
- **Backup/Restore:** `BackupRestoreManager` for preferences
- **Parental controls:** PIN-based content filtering
- **Multiple languages:** App UI translated to 45+ languages
- **DoH:** DNS-over-HTTPS with user-selectable provider
- **Custom TLS:** ISRG Root X1 bundled for Android < 7 compatibility

## 2.8 Tech Stack

| Layer | Library |
|---|---|
| Player | Media3 ExoPlayer 1.8.0 |
| UI | Leanback 1.2.0, ConstraintLayout, Material |
| Image | Glide 5.0.0-rc01 + OkHttp + KSP |
| HTTP | OkHttp 4.12.0, Retrofit 2.11.0 |
| HTML parsing | Jsoup 1.19.1 + retrofit-jsoup-converter |
| DB | Room 2.7.0-rc01 + KSP |
| State | LiveData 2.8.7, ViewModel 2.8.7 |
| Navigation | Navigation Component 2.8.8 |
| Async | Coroutines |
| DNS | dnsjava 3.6.3, OkHttp DoH |
| SSL | Conscrypt 2.5.2 |
| Serialization | kotlinx-serialization 1.8.0, Gson |
| JS eval | Rhino 1.8.0 |
| Crypto | AES (javax.crypto) |
| WebSocket | Java-WebSocket 1.5.3 |
| QR | ZXing 3.5.1 |
| HTTP server | NanoHTTPD 2.3.1 |
| Browser tabs | AndroidX Browser 1.7.0 |

---

# 3. SIDE-BY-SIDE COMPARISON

| Aspect | Netfly TV | Streamflix |
|---|---|---|
| **Type** | Commercial IPTV + VOD | Free VOD aggregator |
| **Language** | Java + Flutter | Pure Kotlin |
| **Source** | Closed (96% obfuscated) | **Open source (Apache 2.0)** |
| **Player** | IJKPlayer (+ Media3) | Media3 ExoPlayer |
| **Auth** | Email/password + activation code + OTP | None |
| **Ads** | AdMob + Pangle | None |
| **Monetization** | Subscriptions + Ads | None (free) |
| **Content model** | CMS/API-driven (single backend) | Multi-provider web scraping |
| **Live TV** | Yes (EPG, sports) | No (IPTV providers are experimental) |
| **VOD** | Yes (API-based) | Yes (scraped from 45+ sites) |
| **Download** | Yes (foreground service) | No |
| **Anime** | Via content tags | 8 dedicated anime providers |
| **Sports** | Football leagues/matches | No |
| **Adult** | Dedicated section | No |
| **Screens** | 34 activities | 2 activities (mobile + TV) |
| **Security** | Native lib (tamper detection) | None |
| **Update** | Play Store / APK | In-app GitHub updater |
| **DB** | Room (server entities) | Room (per-provider local) |
| **Subs** | SubDL + OpenSubtitles | SubDL + OpenSubtitles |
| **Key tech** | clientgosdk, Pangle ads | Rhino JS, Conscrypt, DoH |

---

# 4. HOW EACH APP WORKS (DATA FLOW)

## Netfly TV Flow

```
1. LAUNCH
   SplashActivity → load cms_config.json from server
                    → NativeSecurity.check() (root/tamper detection)
                    → Firebase init, analytics init
                    → Check activation status (app/check API)
                    → Navigate to LoginActivity or HomeActivity

2. AUTH
   LoginActivity → email/password or OTP
                  → POST to user/device/login with device UUID
                  → Store session token in EncryptedSharedPreferences
                  → Navigate to RoleActivity → DashboardActivity

3. HOME
   HomeActivity → Fetch categories via API (video/list, live/categories/list)
                 → Render banner carousel, channel grid, VOD rows
                 → Glide loads poster/category images

4. LIVE TV
   LiveActivity → Fetch channel list (live/channels/list)
                → EPG data (live/channels/epgs)
                → On channel select → live/channels/play
                → IJKPlayer plays HLS/RTMP stream
                → Channel pre-buffering via PreloadManager

5. VOD
   VodLibraryActivity → Fetch by category/tag (video/list, video/tags)
                      → VodInfoActivity → video/info for details
                      → video/episodes for TV show seasons
                      → video/episodes/sources for playable URLs
                      → PlaybackActivity via IJKPlayer

6. PLAYER
   PlaybackActivity → IJKPlayer with custom controls
                    → VideoGestureFrameLayout for gestures
                    → CacheManager for local caching
                    → Resume position tracking
                    → Subtitle loading

7. DOWNLOADS
   DownloadService (foreground) → Thread pool executor
                                → SQLite DB for progress tracking
                                → Notification for progress
                                → DownloadTask per file
```

## Streamflix Flow

```
1. LAUNCH
   MainTvActivity (TV) / MainMobileActivity (phone)
   → StreamFlixApp.onCreate():
     - Conscrypt SSL provider
     - ISRG Root X1 cert injection
     - UserPreferences setup
     - DoH resolver init
     - AppDatabase init (per current provider)
     - SerienStream + AniWorld init
     - Artwork repair scheduler
     - Auto-clear cache if > threshold

2. HOME
   HomeFragment → Provider.getHome()
                 → Each provider scrapes its website HTML via Jsoup
                 → Parsed into Category objects (Trending, Popular, etc.)
                 → TMDB metadata merged for posters/ratings
                 → Glide loads images
                 → Rows of movies/TV shows in Leanback browse fragment

3. PROVIDER SELECTION
   Settings → User picks provider from 45 options
            → AppDatabase resets to new provider's DB
            → Home reloads with new provider's content

4. MOVIE/SHOW DETAIL
   MovieFragment → Provider.getMovie(id) → scrapes detail page
                 → TMDB enriches (cast, trailer, recommendations)
                 → Provider.getServers() → returns list of Video.Server
                 → Each server has name + URL to video hoster

5. VIDEO RESOLUTION
   Select server → Provider.getVideo(server) → returns embed/hoster URL
                 → Extractor.extract(URL) → finds matching extractor
                 → Extractor fetches page, decrypts if needed
                 → Returns Video object with source URL + subtitles
                 → Extractor chain: 89 hosters supported

6. PLAYBACK
   PlayerFragment → Media3 ExoPlayer
                  → HLS/DASH/progressive playback
                  → Subtitle overlays (SubDL/OpenSubtitles/embedded)
                  → Player gesture controls
                  → Resume position saved to Room DB
                  → Watch history tracked

7. SEARCH
   SearchFragment → Provider.search(query)
                   → Scrapes provider's search results page
                   → Returns mixed Movie/TvShow list
                   → TMDB search as fallback
```

---

# 5. KEY FILES TO REFERENCE

## For copying Streamflix patterns (clean source):

| File | Purpose |
|---|---|
| `app/build.gradle` | Full dependency list, build config |
| `StreamFlixApp.kt` | Application init (Conscrypt, ISRG, DB, DoH) |
| `providers/Provider.kt` | Provider interface + 45-provider registry |
| `providers/TmdbProvider.kt` | TMDB metadata integration pattern |
| `extractors/Extractor.kt` | Extractor interface + 89-extractor registry + universal bridge |
| `models/Video.kt` | Video model with Source, Subtitle, Server |
| `models/Movie.kt` | Room entity + Show/WatchItem interface |
| `database/AppDatabase.kt` | Room DB with per-provider instances, migrations 1→8 |
| `utils/NetworkClient.kt` | OkHttp factory with DoH, SSL, Conscrypt |
| `utils/UserPreferences.kt` | SharedPreferences + provider cache |
| `utils/DecryptHelper.kt` | AES/hoster decryption utilities |
| `utils/JsUnpacker.kt` | JavaScript unpacker for eval'd sources |

## For copying Netfly TV patterns (decompiled):

| File | Purpose |
|---|---|
| `xyz/stream/api/o.java` | Full API endpoint map (psk_app_nf_* keys) |
| `xyz/netfly/MyApplication.java` | App init (Firebase, ads, CMS config) |
| `xyz/netfly/SplashActivity.java` | Launch sequence + activation check |
| `xyz/netfly/ui/login/LoginActivity.java` | Full auth flow (email, OTP, register) |
| `xyz/netfly/player/playback/PlaybackActivity.java` | Player implementation (IJKPlayer) |
| `xyz/stream/api/f.java` | CMS config loader (cms_config.json) |
| `xyz/stream/utils/NativeSecurity.java` | Native library loading for tamper detection |
| `xyz/stream/download/service/DownloadService.java` | Foreground download manager |
| `resources/AndroidManifest.xml` | All 34 activities, permissions, ad SDKs |

---

# 6. VERDICT

## Which is better for copying?

**Streamflix** — Full clean source, Apache 2.0 license, 45+ providers, 89 extractors, modern Kotlin architecture. This is the one to clone and adapt. Features you'd build on top of it:

- Add IPTV/live TV support (from Netfly)
- Add download manager (from Netfly)
- Add subscription/ads monetization (from Netfly)
- Add sports match viewer (from Netfly)
- Add adult content toggle (from Netfly)

**Netfly TV** — Good for understanding the **IPTV backend pattern** (CMS config → signed API → channels/EPG/play). The API endpoint map is gold for building a compatible server. Heavily obfuscated but the architecture is clear. iOS/Android sharing via Flutter module is notable.
