yogesh-7/AppFence

GitHub: yogesh-7/AppFence

一款无需 Root 的 Android 本地防火墙,按应用独立控制 Wi‑Fi 与移动数据。

Stars: 1 | Forks: 1

# AppFence ### 无需 Root 的 Android 每应用网络控制 一个轻量级的开源 Android 防火墙,可让您精细控制哪些应用可以访问 Wi-Fi 和移动数据。使用 Kotlin 和 Jetpack Compose 构建。 ![Android](https://img.shields.io/badge/platform-Android-green) ![Kotlin](https://img.shields.io/badge/Kotlin-2.1.10-purple) ![Min SDK](https://img.shields.io/badge/minSdk-29-blue) ![Compose](https://img.shields.io/badge/UI-Jetpack%20Compose-4285F4) ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen) ![Hacktoberfest](https://img.shields.io/badge/Hacktoberfest-friendly-orange) ![GitHub stars](https://img.shields.io/github/stars/yogesh-7/AppFence?style=social) ## ✨ 为何选择 AppFence? - 🛡️ **阻止任意应用联网** — 阻止后台数据、广告和遥测 - 📶 **按网络独立规则** — 允许应用在 Wi-Fi 仅用、仅移动数据、两者或都不使用 - 🔓 **无需 Root** — 使用 Android 内置的 `VpnService` - 🔒 **完全本地处理** — 无服务器、无分析、所有数据保留在设备内 - 🪶 **轻量高效** — 无数据包解析,电池占用极低 - 🎨 **现代化 UI** — 基于 Material 3 和 Jetpack Compose ## 工作原理 AppFence 使用 Android 的 `VpnService` 创建一个**本地设备级 VPN**。所有流量均不发送至远程服务器。 ### 阻断机制 1. 当 VPN 激活时,**所有设备流量**被路由至本地隧道。 2. 被标记为**允许**的应用通过 `addDisallowedApplication()` 旁路隧道,直接使用真实网络。 3. 被**阻止**的应用流量进入隧道后被静默丢弃(永不转发)。 4. 切换应用访问权限时,隧道将在 **1 秒内** 重建并应用新规则。 ### 每网络类型独立控制 - 每个应用在 Wi-Fi 和移动数据上拥有**独立**的开关。 - 应用通过 `ConnectivityManager.NetworkCallback` 监听当前网络类型。 - 当设备在 Wi-Fi 与蜂窝网络间切换时,隧道会自动重建,并应用对应网络类型的阻断规则。 ## 📸 截图 ## 🚀 快速开始 ### 前提条件 - Android Studio Hedgehog (2024.1) 或更高版本 - JDK 17+ - 包含 `compileSdk 35` 的 Android SDK - 运行 **Android 10 (API 29)** 或更高版本的设备或模拟器 ### 从源码构建 ``` # 克隆仓库 git clone https://github.com/yogesh-7/AppFence.git cd AppFence # 构建调试 APK ./gradlew assembleDebug # APK 将位于: # app/build/outputs/apk/debug/app-debug.apk ``` 或者直接在 Android Studio 中打开项目并点击 **运行**。 ### 首次运行 1. 按提示授予 VPN 权限(系统对话框)。 2. 主界面显示所有已安装应用。 3. 为任意应用切换 Wi-Fi 和/或移动数据开关。 4. 进入 **设置** 启动或停止 VPN 服务。 ## 🔐 权限说明 | 权限 | 用途 | |---|---| | `BIND_VPN_SERVICE` | 创建本地 VPN 隧道所必需 | | `FOREGROUND_SERVICE` | VPN 必须以前台服务运行(Android 要求) | | `FOREGROUND_SERVICE_SPECIAL_USE` | Android 14+ 上用于 VPN 前台服务类型 | | `RECEIVE_BOOT_COMPLETED` | 设备启动时自动启动 VPN(可选) | | `ACCESS_NETWORK_STATE` | 检测 Wi-Fi 与蜂窝网络 | | `QUERY_ALL_PACKAGES` | 列出所有已安装应用 | | `POST_NOTIFICATIONS` | 显示 VPN 状态通知(Android 13+) | ## 🛠️ 技术栈 | 组件 | 技术 | |---|---| | 语言 | Kotlin 2.1.10 | | UI | Jetpack Compose + Material 3 | | 架构 | MVVM(ViewModel + StateFlow) | | 数据库 | Room | | 异步 | Kotlin Coroutines | | 导航 | Navigation Compose | | 最低 SDK | 29(Android 10) | | 目标 SDK | 35(Android 15) | | 后台 | 前台 VpnService | | 启动 | BroadcastReceiver(BOOT_COMPLETED) | ## 📁 项目结构 ``` com.yogesh.appfence/ ├── AppFenceApp.kt # Application class ├── data/ │ ├── AppRule.kt # Room entity │ ├── AppRuleDao.kt # Room DAO │ ├── AppRuleDatabase.kt # Room database │ └── AppRepository.kt # Repository ├── vpn/ │ ├── AppFenceVpnService.kt # VPN service (blocking logic) │ └── NetworkMonitor.kt # Wi-Fi/cellular detection ├── receiver/ │ └── BootReceiver.kt # Auto-start on boot ├── ui/ │ ├── MainActivity.kt # Single-activity host │ ├── theme/ # Material 3 dark theme │ ├── screens/ │ │ ├── MainScreen.kt # App list with toggles │ │ ├── SettingsScreen.kt # VPN control & preferences │ │ └── OnboardingScreen.kt # First-run welcome │ ├── components/ │ │ ├── AppListItem.kt # App row with toggles │ │ ├── FilterBar.kt # All/User/System/Blocked chips │ │ └── StatusBadge.kt # Allowed/Blocked badge │ └── viewmodel/ │ ├── MainViewModel.kt # App list + rules │ └── SettingsViewModel.kt # VPN state + preferences ├── model/ │ └── AppInfo.kt # UI models └── util/ └── PackageUtils.kt # Load installed apps ``` ## 🎯 设计原则 - **无需 Root** — 使用标准 Android VpnService API - **无广告、无分析、无网络请求** — 永远如此 - **完全离线** — 所有数据保留在设备本地 - **省电设计** — 无数据包解析,仅 OS 级路由 - **开放架构** — 清晰的 MVVM 分层设计 ## 🤝 贡献 **非常欢迎贡献** — 包括错误修复、功能改进、翻译、文档或截图! ### 适合新手的议题 查看标记为 [`good first issue`](https://github.com/yogesh-7/AppFence/labels/good%20first%20issue) 或 [`help wanted`](https://github.com/yogesh-7/AppFence/labels/help%20wanted) 的问题。 ### Hacktoberfest 🎃 本仓库参与 **Hacktoberfest**!在十月期间关注标记为 [`hacktoberfest`](https://github.com/yogesh-7/AppFence/labels/hacktoberfest) 的问题。 ### 如何贡献 1. Fork 本仓库 2. 创建功能分支(`git checkout -b feature/my-feature`) 3. 提交更改(`git commit -m 'Add my feature'`) 4. 推送到分支(`git push origin feature/my-feature`) 5. 发起 Pull Request 请遵循 Kotlin 编码规范并保持现有的 MVVM 结构。 ## 💡 灵感来源 功能上受优秀的开源应用 [NetGuard](https://github.com/M66B/NetGuard)(作者 M66B)启发,采用现代化 Jetpack Compose UI 并简化了架构设计。 ## 📄 许可证 AppFence 在 **GNU General Public License v3.0** 下发布。 请查阅 [LICENSE](LICENSE) 文件获取完整文本。
**⭐ 如果您觉得 AppFence 有用,请考虑给仓库加星!** 由 [@yogesh-7](https://github.com/yogesh-7) ❤️ 打造
标签:Android, Android开发, DNS解析, DSL, Hacktoberfest, Jetpack Compose, Kotlin, LangChain, MacOS取证, Material 3, PRs欢迎, VpnService, Wi-Fi控制, 后台数据阻止, 广告拦截, 应用白名单, 应用级网络控制, 应用黑名单, 开源, 开源项目, 无Root, 最小SDK 29, 本地VPN, 流量控制, 现代UI, 移动数据控制, 网络切换监控, 网络安全, 网络权限管理, 轻量级, 遥测阻断, 防火墙, 隐私保护