# What Is the FQNews Android App? Purpose and Architecture Explained

> Discover the FQNews Android app, an open-source news aggregator. Access uncensored RSS feeds without a VPN by using imported proxy nodes like SS, Vmess, Vless, and Trojan.

- Repository: [如何翻墙/fanqiang](https://github.com/bannedbook/fanqiang)
- Tags: deep-dive
- Published: 2026-09-05

---

**The FQNews Android app is an open-source news aggregator that enables users to access "wall-outside" (uncensored) RSS feeds without a full VPN client by routing traffic through user-imported proxy nodes (SS/Vmess/Vless/Trojan).**

Maintained within the `bannedbook/fanqiang` repository, the **FQNews Android app** provides a lightweight solution for circumventing internet censorship. Unlike traditional VPN applications that tunnel all device traffic, this specialized client focuses specifically on news consumption, bundling pre-configured banned-news sources while allowing users to import custom proxy configurations.

## Core Purpose and Architecture

According to the repository documentation in [`fqnews2/README.md`](https://github.com/bannedbook/fanqiang/blob/main/fqnews2/README.md), the application serves as a censorship-circumventing news client through four integrated mechanisms. The primary function centers on aggregating RSS and Atom feeds typically inaccessible behind the Great Firewall.

### Proxy Node Import and Management

Users initiate connectivity by pasting newline-separated proxy URLs directly into the application interface. The system supports multiple protocols including **Shadowsocks (SS)**, **Vmess**, **Vless**, and **Trojan** nodes.

The storage mechanism relies on Android shared preferences through the `PreferenceProvider` class:

```kotlin
// In the import-node screen (simplified)
val nodes = clipboardText.split("\n")
nodes.forEach { nodeUrl ->
    // Store each node in the app's shared preferences
    PreferenceProvider.saveNode(nodeUrl.trim())
}

```

*Implementation location:* [`dpreference/src/main/java/me/dozen/dpreference/PreferenceProvider.java`](https://github.com/bannedbook/fanqiang/blob/main/dpreference/src/main/java/me/dozen/dpreference/PreferenceProvider.java)

### RSS Feed Fetching Through the Great Firewall

Once nodes are configured, background workers fetch configured RSS URLs using the imported proxy settings. The networking layer utilizes **OkHttp** with dynamic proxy configuration to bypass restrictions.

```kotlin
val request = Request.Builder()
    .url(feedUrl)                     // e.g. https://example.com/rss
    .proxy(Proxy(Proxy.Type.SOCKS, InetSocketAddress(proxyHost, proxyPort)))
    .build()
okHttpClient.newCall(request).enqueue { response ->
    // Parse and cache the feed items
    FeedParser.parse(response.body?.string() ?: "")
}

```

This logic resides within the `net.frju.flym.*` package, specifically handling the feed retrieval and parsing pipeline.

### Local Caching and Offline Reading

Downloaded articles are stored locally on the device via the app's internal storage mechanisms. This enables offline access to censored content regardless of current network connectivity or proxy availability.

### Bundled Default Sources

The application ships with pre-selected **"禁闻网" (banned-news)** channels, providing immediate access to censored content without requiring manual source configuration.

## Automatic Update Mechanism

The FQNews Android app implements a custom update checker that queries remote JSON metadata hosted on GitHub. This bypasses potential Play Store restrictions in certain regions.

```kotlin
val updateUrl = getString(R.string.update_check_url)   // → https://raw.githubusercontent.com/bannedbook/fanqiang/master/fqnews/update.json
val json = okHttpClient.get(updateUrl).body?.string()
val latestVersion = JSONObject(json).getString("version")

```

The update URL is defined in [`core/src/main/res/values/strings.xml`](https://github.com/bannedbook/fanqiang/blob/main/core/src/main/res/values/strings.xml) and points to [`fqnews/update.json`](https://github.com/bannedbook/fanqiang/blob/main/fqnews/update.json), which contains the latest version information and download links.

## Key Source Files and Architecture

Understanding the codebase structure reveals how the components interact:

- **App Entry Point**: [`app/src/main/java/net/frju/flym/ui/about/AboutActivity.kt`](https://github.com/bannedbook/fanqiang/blob/main/app/src/main/java/net/frju/flym/ui/about/AboutActivity.kt) displays application information and repository links.
- **Proxy Storage**: [`dpreference/src/main/java/me/dozen/dpreference/PreferenceProvider.java`](https://github.com/bannedbook/fanqiang/blob/main/dpreference/src/main/java/me/dozen/dpreference/PreferenceProvider.java) manages the persistence of user-provided node configurations.
- **Feed Display**: [`app/src/main/java/net/frju/flym/ui/entries/EntriesFragment.kt`](https://github.com/bannedbook/fanqiang/blob/main/app/src/main/java/net/frju/flym/ui/entries/EntriesFragment.kt) handles the UI layer for loading and presenting news items through the proxy tunnel.
- **Configuration**: [`core/src/main/res/values/strings.xml`](https://github.com/bannedbook/fanqiang/blob/main/core/src/main/res/values/strings.xml) contains critical URLs including the remote update endpoint.

## Summary

- The **FQNews Android app** is a specialized news client within the `bannedbook/fanqiang` ecosystem designed specifically for circumventing censorship.
- It operates by importing **SS/Vmess/Vless/Trojan proxy nodes** rather than implementing a full VPN tunnel.
- The application fetches **RSS/Atom feeds** through these configured proxies, bypassing Great Firewall restrictions.
- Content is **cached locally** for offline reading.
- **Default banned-news sources** are bundled for immediate use.
- Update checking occurs against a **remote JSON file** hosted on GitHub to ensure users access the latest version despite regional app store restrictions.

## Frequently Asked Questions

### Does FQNews require a separate VPN application to function?

No. The FQNews Android app functions independently by utilizing user-imported proxy nodes. While it routes traffic through these nodes similarly to a VPN, it does not require a separate VPN client installation. Users simply paste their SS, Vmess, Vless, or Trojan node URLs directly into the app's import interface, which stores them via `PreferenceProvider.saveNode()`.

### What types of proxy protocols does FQNews support?

According to the source code analysis, the application supports **Shadowsocks (SS)**, **Vmess**, **Vless**, and **Trojan** protocols. These node URLs are parsed from clipboard input and stored in the device's shared preferences for subsequent use in configuring the OkHttp client's proxy settings.

### How does the app handle updates if it's not available through standard app stores?

The FQNews Android app implements an internal update checker that queries `https://raw.githubusercontent.com/bannedbook/fanqiang/master/fqnews/update.json`. This JSON file, referenced in [`core/src/main/res/values/strings.xml`](https://github.com/bannedbook/fanqiang/blob/main/core/src/main/res/values/strings.xml) via the `update_check_url` string resource, contains the latest version metadata and download links, allowing the app to self-update directly from GitHub.

### Can I read articles offline with FQNews?

Yes. The application automatically caches downloaded RSS feed items locally on the device through the `FeedParser.parse()` workflow. This caching mechanism enables users to read previously fetched articles even when disconnected from the internet or when proxy nodes are unavailable.