# xloger/exlink architecture

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

- Interactive diagram: https://gitdiagram.com/xloger/exlink
- Repository: https://github.com/xloger/exlink

## Overview

ExLink is an Android/Xposed app that lets users configure per-app link rules and intercepts matching apps’ activity launches to open extracted links through Android’s normal intent dispatch. The main path runs from app selection and rule configuration, through JSON-backed rule sharing, to package matching, URL extraction and whitelist checks in the hook. The README describes the hook behavior; sampled code confirms the UI, storage calls and interception logic, but not every initialization or import/export connection.

Main entry points: [`app/src/main/java/com/xloger/exlink/app/activity/MainActivity.kt`](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/MainActivity.kt) (App manager), [`app/src/main/java/com/xloger/exlink/app/HookMain.kt`](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/HookMain.kt) (Package hook), [`app/src/main/java/com/xloger/exlink/app/activity/EditRuleActivity.java`](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/EditRuleActivity.java) (Rule editor), [`app/src/main/java/com/xloger/exlink/app/util/JSONFile.kt`](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/JSONFile.kt) (Rule JSON)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_management["Rule management"]
  node_main["App manager<br/>[MainActivity.kt]"]
  node_appmodel["App settings<br/>[App.kt]"]
  node_choose["Choose app<br/>[StepOneDialog.kt]"]
  node_ruleeditor["Rule editor"]
  node_rulemodel["Link rules<br/>[Rule.kt]"]
  node_whitelist["Whitelist editor"]
  node_settings["App settings"]
  node_importdialog["Import rules"]
  node_exportdialog["Export rules"]
end

subgraph group_storage["Rule storage"]
  node_jsonfile["Rule JSON<br/>[JSONFile.kt]"]
  node_config["Hook config files<br/>[FileUtil.java]"]
end

subgraph group_runtime["Link interception"]
  node_hook["Package hook<br/>[HookMain.kt]"]
end

subgraph group_platform["Android platform"]
  node_appdiscovery["Installed apps"]
  node_xposed["Xposed framework"]
  node_intentdispatch["Intent dispatch"]
end

node_user(("App user"))
node_launchingapp(("Launching app"))
node_linktarget(("Link destination"))

node_user -->|"manages apps"| node_main
node_main -->|"loads and saves"| node_jsonfile
node_main -->|"updates settings"| node_appmodel
node_main -->|"adds app"| node_choose
node_choose -->|"lists apps"| node_appdiscovery
node_main -->|"edits rules"| node_ruleeditor
node_ruleeditor -->|"loads and saves"| node_jsonfile
node_ruleeditor -->|"edits rules"| node_rulemodel
node_main -->|"edits whitelist"| node_whitelist
node_settings -->|"writes hook flags"| node_config
node_user -->|"changes preferences"| node_settings
node_xposed -->|"loads package hook"| node_hook
node_hook -->|"loads rules"| node_jsonfile
node_launchingapp -->|"starts activity"| node_hook
node_hook -->|"intercepts launch"| node_launchingapp
node_hook -->|"sends view intent"| node_intentdispatch
node_intentdispatch -->|"opens link"| node_linktarget
node_user -->|"imports rules"| node_importdialog
node_user -->|"exports rules"| node_exportdialog

click node_main "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/MainActivity.kt"
click node_appmodel "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/entity/App.kt"
click node_choose "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/StepOneDialog.kt"
click node_appdiscovery "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/AndroidAppUtil.java"
click node_ruleeditor "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/EditRuleActivity.java"
click node_rulemodel "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/entity/Rule.kt"
click node_whitelist "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/AddWhiteDialog.java"
click node_jsonfile "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/JSONFile.kt"
click node_config "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/FileUtil.java"
click node_settings "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/SettingActivity.java"
click node_importdialog "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/ImportJsonDialog.kt"
click node_exportdialog "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/ExportJsonDialog.kt"
click node_hook "https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/HookMain.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_main,node_appmodel,node_choose,node_ruleeditor,node_rulemodel,node_whitelist,node_settings,node_importdialog,node_exportdialog,node_user toneBlue
class node_jsonfile,node_config toneAmber
class node_hook toneMint
class node_appdiscovery,node_xposed,node_intentdispatch toneRose
class node_launchingapp,node_linktarget toneIndigo
```

## Components

### Rule management

- [App manager](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/MainActivity.kt): `app/src/main/java/com/xloger/exlink/app/activity/MainActivity.kt`
- [App settings](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/entity/App.kt): `app/src/main/java/com/xloger/exlink/app/entity/App.kt`
- [Choose app](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/StepOneDialog.kt): `app/src/main/java/com/xloger/exlink/app/view/StepOneDialog.kt`
- [Rule editor](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/EditRuleActivity.java): `app/src/main/java/com/xloger/exlink/app/activity/EditRuleActivity.java`
- [Link rules](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/entity/Rule.kt): `app/src/main/java/com/xloger/exlink/app/entity/Rule.kt`
- [Whitelist editor](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/AddWhiteDialog.java): `app/src/main/java/com/xloger/exlink/app/view/AddWhiteDialog.java`
- [App settings](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/activity/SettingActivity.java): `app/src/main/java/com/xloger/exlink/app/activity/SettingActivity.java`
- [Import rules](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/ImportJsonDialog.kt): `app/src/main/java/com/xloger/exlink/app/view/ImportJsonDialog.kt`
- [Export rules](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/view/ExportJsonDialog.kt): `app/src/main/java/com/xloger/exlink/app/view/ExportJsonDialog.kt`

### Rule storage

- [Rule JSON](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/JSONFile.kt): `app/src/main/java/com/xloger/exlink/app/util/JSONFile.kt`
- [Hook config files](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/FileUtil.java): `app/src/main/java/com/xloger/exlink/app/util/FileUtil.java`

### Link interception

- [Package hook](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/HookMain.kt): `app/src/main/java/com/xloger/exlink/app/HookMain.kt`

### Android platform

- [Installed apps](https://github.com/xloger/exlink/blob/master/app/src/main/java/com/xloger/exlink/app/util/AndroidAppUtil.java): `app/src/main/java/com/xloger/exlink/app/util/AndroidAppUtil.java`
- **Xposed framework**
- **Intent dispatch**

### Other components

- **App user**
- **Launching app**
- **Link destination**

## Connections

- App user → App manager: manages apps
- App manager → Rule JSON: loads and saves
- App manager → App settings: updates settings
- App manager → Choose app: adds app
- Choose app → Installed apps: lists apps
- App manager → Rule editor: edits rules
- Rule editor → Rule JSON: loads and saves
- Rule editor → Link rules: edits rules
- App manager → Whitelist editor: edits whitelist
- App settings → Hook config files: writes hook flags
- App user → App settings: changes preferences
- Xposed framework → Package hook: loads package hook
- Package hook → Rule JSON: loads rules
- Launching app → Package hook: starts activity
- Package hook → Launching app: intercepts launch
- Package hook → Intent dispatch: sends view intent
- Intent dispatch → Link destination: opens link
- App user → Import rules: imports rules
- App user → Export rules: exports rules
