
# 否决
### 一个开源的 Android 版 VirusTotal 客户端
[](https://developer.android.com)
[](https://kotlinlang.org)
[](https://developer.android.com/jetpack/compose)
[](https://developer.android.com/tools/releases/platforms)
## 什么是 Veto?
Veto 是一个 Android 版的 VirusTotal 客户端。提交文件、链接或已安装的应用程序,即可查看实时分析结果。该应用会展示清晰的报告,范围涵盖从单一的统一判定结果到该服务返回的完整字段集。
本项目是免费且开源的,不包含任何用户账户、跟踪系统或广告。由于用户使用自己的 VirusTotal API key,所有扫描均直接在其个人账户下运行,而不会通过中间的第三方服务器进行路由。
## 截图
## 功能特性
* **扫描能力:** 扫描已安装的应用程序、本地文件或目标 URL。
* **多引擎聚合:** 汇总来自 70 多种反病毒引擎的诊断结果。
* **双重报告模式:** 快速模式用于快速验证摘要,详细模式用于深入检查。
* **上下文说明:** 每个部分均提供说明文本,并支持设置在不需要时隐藏说明。
* **高保真报告:** 显示文件哈希、威胁分类、历史记录、社区投票、沙盒行为、YARA 匹配、Android 应用程序内部结构以及所有额外的 API payload 字段。
* **后台执行:** 实时上传并追踪分析进度,该追踪会在后台服务中持久保留。
* **离线访问:** 在本地保存报告,以便日后即使在没有网络连接的情况下也能进行审查。
* **速率限制警告:** 当本地 API key 达到速率限制时,会显示清晰的通知。
* **主题化:** 全面支持 Material 3 及动态系统配色,同时支持浅色和深色主题。
### 核心架构实现细节
* **状态同步:** 应用作用域内的 `ScanManager` 作为所有扫描状态的集中单一事实来源。这确保了无论应用是在前台激活、在后台挂起,还是被操作系统销毁,用户界面都能保持同步。
* **弹性轮询:** 应用使用六分钟的实际时间上限来轮询 `/analyses/{id}` endpoint。如果遇到速率限制响应,该过程将等待而不是直接失败。系统会重新获取报告直到结果填充完毕,如果达到超时限制,则返回结构化的失败状态。
* **进程生命周期:** 虽然 `ScanState` 驻留在 `ScanManager` 中以在 Activity 销毁后保留状态,但在执行活动操作期间,`ScanService` 会维持进程生命周期,并管理进行中和完成的通知。
* **全保真解析:** 常见字段使用类型化模型进行捕获,而完整的原始 `attributes` JSON 则通过自定义序列化器保留。这使得“详细”报告视图能够渲染所有返回的字段,包括未来随着时间的推移添加到 API payload 中的任何新字段。
## 技术栈
| 层级 | 技术 | 项目中的角色 |
| :--- | :--- | :--- |
| **语言** | Kotlin | 主要编程语言 |
| **UI 框架** | Jetpack Compose | 声明式 UI 结构 |
| **设计系统** | Material 3 | 视觉样式、动态系统着色和扩展图标 |
| **依赖注入** | Hilt | 依赖管理 |
| **网络通信** | Retrofit & OkHttp | 与 VirusTotal API 进行 HTTP 通信 |
| **序列化** | `kotlinx.serialization` | 类型安全的 JSON 解析和自定义属性保留 |
| **异步处理** | Kotlin Coroutines | 异步编程和后台处理 |
| **数据持久化** | Jetpack DataStore | 动态设置存储和已保存的扫描报告 |
| **兼容性** | SDK 30 到 36 | 使用 JDK 17 编译,minSdk 30,targetSdk 36 |
## 项目结构
```
└── app/src/main/java/com/quantum_prof/vtscansuite/
├── data/ # Models, remote API, and repository implementation
├── domain/ # Repository interface and business use cases
├── di/ # Hilt dependency injection modules
├── scan/ # ScanManager, ScanService, and system notifications
└── ui/ # UI components and presentation layers
├── intro/ # Splash screen and API key configuration
├── dashboard/ # Navigation hub: link, file, and app scanning modules
├── results/ # Quick and Detailed report visualizers
├── components/# Reusable UI elements and layouts
├── theme/ # Color, shapes, typography, and motion configurations
└── util/ # Haptic feedback, gestures, and deep linking utilities
```
* 应用商店上架素材和文本资源位于 `fastlane/metadata/android/en-US/`。
* 可编辑的模型 SVG 位于 `docs/store/svg/`。
* 可以使用 `docs/store/export.html` 将模型导出为 PNG 格式。
## 入门指南
### 前置条件
* Android Studio(最新稳定版本)
* JDK 17
* 一个免费的 VirusTotal API key,可在此获取:https://www.virustotal.com/gui/my-apikey
### 构建与运行
克隆代码仓库并使用命令行编译 debug 版本:
```
git clone https://github.com/ProfessorQuantumUniverse/VTScan.git
cd VTScan
./gradlew :app:assembleDebug
```
或者,在 Android Studio 中打开根目录并选择 Run 配置。
首次启动时,请在引导设置界面输入您的 VirusTotal API key。该 key 将在本地存储在您的设备上。免费的 API key 通常受限于每分钟 4 次查询的限制。
## 隐私政策
本应用程序仅使用您提供的凭据与 VirusTotal API 进行通信。上传的文件、提交的 URL 以及动态结果将直接发送至 VirusTotal 的服务器。API key 本地存储在您的设备上。Veto 不收集分析数据,也不包含任何广告 SDK。
## 许可证
本项目根据 **GNU General Public License v3.0** 的条款进行授权。
### GPLv3 的核心条款:
* **商业用途:** 允许
* **修改:** 允许
* **分发:** 允许
* **源代码披露:** 分发时必须提供
* **相同许可证:** 修改后的代码也必须使用 GPLv3
* **责任与保证:** 作者不提供任何责任与保证
有关更多详细信息,请参阅本代码仓库中的 [LICENSE](LICENSE) 文件。
由 VirusTotal API 提供支持。未隶属于 VirusTotal,也未获得其认可。