# byxiaorun/ruru architecture

> Architecture diagram of the GitHub repository byxiaorun/ruru, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/byxiaorun/ruru
- Repository: https://github.com/byxiaorun/ruru

## Overview

ApplistDetector is an Android app that runs device and installed-app checks and presents their findings in expandable cards. On launch, MainActivity gathers accessibility, account, developer-setting, and VPN signals; MainPage schedules detector runs and renders results. Detector modules cover environment artifacts, package-manager visibility, file presence, Xposed/Magisk indicators, and device settings. The README provides little feature detail, so the map follows the app workflow visible in excerpts; several detector implementations are indexed but unsampled, and their links are shown only where MainPage documents their invocation.

Main entry points: [`app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/MainPage.kt) (Results page), [`library/src/main/java/icu/nullptr/applistdetector/IDetector.kt`](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/IDetector.kt) (Detector contract), [`app/src/main/java/com/byxiaorun/detector/MainActivity.kt`](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/com/byxiaorun/detector/MainActivity.kt) (Main activity), [`library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt`](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt) (Environment scan)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App workflow"]
  node_activity["Main activity<br/>[MainActivity.kt]"]
  node_application["App context<br/>[MyApplication.kt]"]
  node_page["Results page<br/>[MainPage.kt]"]
  node_cards["Result cards<br/>[CheckCard.kt]"]
  node_hints["Hint card<br/>[IconHintCard.kt]"]
end

subgraph group_environment["Environment checks"]
  node_abnormal["Environment scan"]
  node_file["File checks<br/>[FileDetection.kt]"]
  node_xposed["Xposed modules<br/>[XposedModules.kt]"]
end

subgraph group_packages["Package checks"]
  node_pmcommand["PM command<br/>[PMCommand.kt]"]
  node_pmconventional["PM conventional APIs"]
  node_pmsundry["PM sundry APIs<br/>[PMSundryAPIs.kt]"]
  node_pmquery["Intent queries"]
  node_magisk["Magisk app scan<br/>[MagiskApp.kt]"]
end

subgraph group_device["Device signals"]
  node_accessibility["Accessibility scan<br/>[Accessibility.kt]"]
  node_settings["Setting properties<br/>[SettingProp.kt]"]
  node_accounts["Account scan<br/>[Account.kt]"]
  node_detector["Detector contract<br/>[IDetector.kt]"]
end

node_user(("User"))
node_android["Android services"]

node_user -.->|"opens app"| node_activity
node_activity -->|"uses context"| node_application
node_activity -->|"reads device state"| node_android
node_activity -->|"shows page"| node_page
node_page -->|"renders results"| node_cards
node_page -->|"renders hints"| node_hints
node_page -->|"runs check"| node_abnormal
node_page -->|"runs check"| node_pmcommand
node_page -->|"runs check"| node_pmconventional
node_page -->|"runs check"| node_pmsundry
node_page -->|"runs check"| node_pmquery
node_page -->|"runs checks"| node_file
node_page -->|"runs checks"| node_xposed
node_page -->|"runs check"| node_magisk
node_page -->|"runs check"| node_accessibility
node_page -->|"runs check"| node_settings
node_page -->|"runs check"| node_accounts
node_abnormal -->|"checks paths"| node_file
node_activity -->|"collects account data"| node_accounts
node_activity -->|"collects accessibility data"| node_accessibility
node_activity -.->|"collects setting data"| node_settings
node_abnormal -->|"implements"| node_detector
node_file -->|"implements"| node_detector
node_xposed -->|"implements"| node_detector
node_magisk -->|"implements"| node_detector
node_accounts -->|"implements"| node_detector
node_accessibility -->|"implements"| node_detector
node_settings -.->|"implements"| node_detector
node_pmcommand -.->|"implements"| node_detector
node_pmconventional -.->|"implements"| node_detector
node_pmsundry -.->|"implements"| node_detector
node_pmquery -->|"implements"| node_detector

click node_activity "https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/com/byxiaorun/detector/MainActivity.kt"
click node_application "https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/com/byxiaorun/detector/MyApplication.kt"
click node_page "https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/MainPage.kt"
click node_cards "https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/component/CheckCard.kt"
click node_hints "https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/component/IconHintCard.kt"
click node_abnormal "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt"
click node_file "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/FileDetection.kt"
click node_xposed "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/XposedModules.kt"
click node_pmcommand "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMCommand.kt"
click node_pmconventional "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMConventionalAPIs.kt"
click node_pmsundry "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMSundryAPIs.kt"
click node_pmquery "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMQueryIntentActivities.kt"
click node_magisk "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/MagiskApp.kt"
click node_accessibility "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/Accessibility.kt"
click node_settings "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/SettingProp.kt"
click node_accounts "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/Account.kt"
click node_detector "https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/IDetector.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_activity,node_application,node_page,node_cards,node_hints,node_user toneBlue
class node_abnormal,node_file,node_xposed toneAmber
class node_pmcommand,node_pmconventional,node_pmsundry,node_pmquery,node_magisk toneMint
class node_accessibility,node_settings,node_accounts,node_detector toneRose
class node_android toneIndigo
```

## Components

### App workflow

- [Main activity](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/com/byxiaorun/detector/MainActivity.kt): `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`
- [App context](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/com/byxiaorun/detector/MyApplication.kt): `app/src/main/java/com/byxiaorun/detector/MyApplication.kt`
- [Results page](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/MainPage.kt): `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`
- [Result cards](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/component/CheckCard.kt): `app/src/main/java/icu/nullptr/applistdetector/component/CheckCard.kt`
- [Hint card](https://github.com/byxiaorun/ruru/blob/new/app/src/main/java/icu/nullptr/applistdetector/component/IconHintCard.kt): `app/src/main/java/icu/nullptr/applistdetector/component/IconHintCard.kt`

### Environment checks

- [Environment scan](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt): `library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt`
- [File checks](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/FileDetection.kt): `library/src/main/java/icu/nullptr/applistdetector/FileDetection.kt`
- [Xposed modules](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/XposedModules.kt): `library/src/main/java/icu/nullptr/applistdetector/XposedModules.kt`

### Package checks

- [PM command](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMCommand.kt): `library/src/main/java/icu/nullptr/applistdetector/PMCommand.kt`
- [PM conventional APIs](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMConventionalAPIs.kt): `library/src/main/java/icu/nullptr/applistdetector/PMConventionalAPIs.kt`
- [PM sundry APIs](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMSundryAPIs.kt): `library/src/main/java/icu/nullptr/applistdetector/PMSundryAPIs.kt`
- [Intent queries](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/PMQueryIntentActivities.kt): `library/src/main/java/icu/nullptr/applistdetector/PMQueryIntentActivities.kt`
- [Magisk app scan](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/MagiskApp.kt): `library/src/main/java/icu/nullptr/applistdetector/MagiskApp.kt`

### Device signals

- [Accessibility scan](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/Accessibility.kt): `library/src/main/java/icu/nullptr/applistdetector/Accessibility.kt`
- [Setting properties](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/SettingProp.kt): `library/src/main/java/icu/nullptr/applistdetector/SettingProp.kt`
- [Account scan](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/Account.kt): `library/src/main/java/icu/nullptr/applistdetector/Account.kt`
- [Detector contract](https://github.com/byxiaorun/ruru/blob/new/library/src/main/java/icu/nullptr/applistdetector/IDetector.kt): `library/src/main/java/icu/nullptr/applistdetector/IDetector.kt`

### Other components

- **User**
- **Android services**

## Connections

- User → Main activity: opens app
- Main activity → App context: uses context (evidence: `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`)
- Main activity → Android services: reads device state (evidence: `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`)
- Main activity → Results page: shows page (evidence: `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`)
- Results page → Result cards: renders results (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Hint card: renders hints (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Environment scan: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → PM command: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → PM conventional APIs: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → PM sundry APIs: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Intent queries: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → File checks: runs checks (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Xposed modules: runs checks (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Magisk app scan: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Accessibility scan: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Setting properties: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Results page → Account scan: runs check (evidence: `app/src/main/java/icu/nullptr/applistdetector/MainPage.kt`)
- Environment scan → File checks: checks paths (evidence: `library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt`)
- Main activity → Account scan: collects account data (evidence: `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`)
- Main activity → Accessibility scan: collects accessibility data (evidence: `app/src/main/java/com/byxiaorun/detector/MainActivity.kt`)
- Main activity → Setting properties: collects setting data
- Environment scan → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/AbnormalEnvironment.kt`)
- File checks → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/FileDetection.kt`)
- Xposed modules → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/XposedModules.kt`)
- Magisk app scan → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/MagiskApp.kt`)
- Account scan → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/Account.kt`)
- Accessibility scan → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/Accessibility.kt`)
- Setting properties → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/SettingProp.kt`)
- PM command → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/PMCommand.kt`)
- PM conventional APIs → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/PMConventionalAPIs.kt`)
- PM sundry APIs → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/PMSundryAPIs.kt`)
- Intent queries → Detector contract: implements (evidence: `library/src/main/java/icu/nullptr/applistdetector/PMQueryIntentActivities.kt`)
