# sxtufs/vmc architecture

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

- Interactive diagram: https://gitdiagram.com/sxtufs/vmc
- Repository: https://github.com/sxtufs/vmc

## Overview

VMPacker is an Android APK protection app: users select an APK, optionally add a mapping and exclusions, preview candidates, choose signing credentials, and pack a rebuilt APK. The central packer coordinates analysis, DEX rewriting, VMC container creation, APK assembly, and signing; a native JNI runtime later verifies the installed APK and interprets protected methods. The graph preserves documented preview and signing capabilities. Some implementation files were not sampled, so uncertain internal links are omitted; README-documented workflow links are cited to the README.

Main entry points: [`app/src/main/java/com/vmp/packer/Packer.kt`](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/Packer.kt) (Pack coordinator), [`app/src/main/java/com/vmp/packer/MainActivity.kt`](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/MainActivity.kt) (Main screen), [`app/src/main/java/com/vmp/packer/VmcWriter.kt`](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/VmcWriter.kt) (VMC containers), [`native/src/vmp.cpp`](https://github.com/sxtufs/vmc/blob/main/native/src/vmp.cpp) (JNI runtime loader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App Workflow"]
  node_ui["Main screen<br/>[MainActivity.kt]"]
  node_preview["Package preview"]
  node_mapping["Name mapping<br/>[ProguardMapping.kt]"]
  node_credentials["Signing identities<br/>[SigningSource.kt]"]
end

subgraph group_processing["APK Processing"]
  node_packer["Pack coordinator<br/>[Packer.kt]"]
  node_policy["Selection policy<br/>[PackPolicy.kt]"]
  node_parser["DEX analysis<br/>[DexParser.kt]"]
  node_rewriter["DEX rewriting<br/>[DexRewriter.kt]"]
  node_manifest["Manifest patching<br/>[AxmlPatcher.kt]"]
  node_abi["ABI preflight<br/>[AbiPreflight.kt]"]
  node_builder["APK assembly<br/>[ApkBuilder.kt]"]
  node_signer["APK signing<br/>[ApkSigner.kt]"]
end

subgraph group_protection["Protected Payload"]
  node_containers["VMC containers<br/>[VmcWriter.kt]"]
  node_ir["IR encoding<br/>[IrCodec.kt]"]
  node_permutation["Opcode permutation<br/>[InsnPerm.kt]"]
end

subgraph group_runtime["Native Runtime"]
  node_native["JNI runtime loader<br/>[vmp.cpp]"]
  node_verify["APK verification<br/>[vmp_apk_verify.cpp]"]
  node_sigblock["Signature block<br/>[vmp_sigblock.cpp]"]
  node_vmpfile["Container reader<br/>[vmp_file.cpp]"]
  node_interpreter["DEX interpreter<br/>[interpreter.cpp]"]
  node_compression["Compression support<br/>[miniz.c]"]
end

node_user(("App user"))

node_user -->|"selects APK"| node_ui
node_ui -->|"starts scan or pack"| node_packer
node_ui -->|"shows candidates"| node_preview
node_ui -->|"imports mapping"| node_mapping
node_ui -->|"selects signing"| node_credentials
node_packer -->|"uses names"| node_mapping
node_packer -->|"checks ABI"| node_abi
node_packer -->|"patches manifest"| node_manifest
node_packer -->|"analyzes DEX"| node_parser
node_packer -->|"selects methods"| node_policy
node_parser -->|"checks eligibility"| node_policy
node_packer -->|"rewrites DEX"| node_rewriter
node_packer -->|"creates containers"| node_containers
node_containers -->|"reads method data"| node_parser
node_containers -->|"encodes opcodes"| node_permutation
node_containers -->|"encodes IR"| node_ir
node_packer -->|"rebuilds APK"| node_builder
node_builder -->|"uses permutation"| node_permutation
node_builder -->|"uses IR codec"| node_ir
node_packer -->|"signs output"| node_signer
node_signer -.->|"uses identity"| node_credentials
node_native -->|"verifies APK"| node_verify
node_verify -->|"checks signature"| node_sigblock
node_native -->|"loads containers"| node_vmpfile
node_native -->|"dispatches methods"| node_interpreter
node_native -->|"uses compression"| node_compression
node_vmpfile -->|"provides method data"| node_interpreter
node_containers -->|"supplies VMC data"| node_vmpfile

click node_ui "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/MainActivity.kt"
click node_preview "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/PackagePreviewAdapter.kt"
click node_mapping "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ProguardMapping.kt"
click node_credentials "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/SigningSource.kt"
click node_packer "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/Packer.kt"
click node_policy "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/PackPolicy.kt"
click node_parser "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/DexParser.kt"
click node_rewriter "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/DexRewriter.kt"
click node_manifest "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/AxmlPatcher.kt"
click node_abi "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/AbiPreflight.kt"
click node_containers "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/VmcWriter.kt"
click node_ir "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/IrCodec.kt"
click node_permutation "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/InsnPerm.kt"
click node_builder "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ApkBuilder.kt"
click node_signer "https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ApkSigner.kt"
click node_native "https://github.com/sxtufs/vmc/blob/main/native/src/vmp.cpp"
click node_verify "https://github.com/sxtufs/vmc/blob/main/native/src/vmp_apk_verify.cpp"
click node_sigblock "https://github.com/sxtufs/vmc/blob/main/native/src/vmp_sigblock.cpp"
click node_vmpfile "https://github.com/sxtufs/vmc/blob/main/native/src/vmp_file.cpp"
click node_interpreter "https://github.com/sxtufs/vmc/blob/main/native/src/interpreter.cpp"
click node_compression "https://github.com/sxtufs/vmc/blob/main/native/src/miniz.c"

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_ui,node_preview,node_mapping,node_credentials,node_user toneBlue
class node_packer,node_policy,node_parser,node_rewriter,node_manifest,node_abi,node_builder,node_signer toneAmber
class node_containers,node_ir,node_permutation toneMint
class node_native,node_verify,node_sigblock,node_vmpfile,node_interpreter,node_compression toneRose
```

## Components

### App Workflow

- [Main screen](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/MainActivity.kt): `app/src/main/java/com/vmp/packer/MainActivity.kt`
- [Package preview](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/PackagePreviewAdapter.kt): `app/src/main/java/com/vmp/packer/PackagePreviewAdapter.kt`
- [Name mapping](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ProguardMapping.kt): `app/src/main/java/com/vmp/packer/ProguardMapping.kt`
- [Signing identities](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/SigningSource.kt): `app/src/main/java/com/vmp/packer/SigningSource.kt`

### APK Processing

- [Pack coordinator](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/Packer.kt): `app/src/main/java/com/vmp/packer/Packer.kt`
- [Selection policy](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/PackPolicy.kt): `app/src/main/java/com/vmp/packer/PackPolicy.kt`
- [DEX analysis](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/DexParser.kt): `app/src/main/java/com/vmp/packer/DexParser.kt`
- [DEX rewriting](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/DexRewriter.kt): `app/src/main/java/com/vmp/packer/DexRewriter.kt`
- [Manifest patching](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/AxmlPatcher.kt): `app/src/main/java/com/vmp/packer/AxmlPatcher.kt`
- [ABI preflight](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/AbiPreflight.kt): `app/src/main/java/com/vmp/packer/AbiPreflight.kt`
- [APK assembly](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ApkBuilder.kt): `app/src/main/java/com/vmp/packer/ApkBuilder.kt`
- [APK signing](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/ApkSigner.kt): `app/src/main/java/com/vmp/packer/ApkSigner.kt`

### Protected Payload

- [VMC containers](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/VmcWriter.kt): `app/src/main/java/com/vmp/packer/VmcWriter.kt`
- [IR encoding](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/IrCodec.kt): `app/src/main/java/com/vmp/packer/IrCodec.kt`
- [Opcode permutation](https://github.com/sxtufs/vmc/blob/main/app/src/main/java/com/vmp/packer/InsnPerm.kt): `app/src/main/java/com/vmp/packer/InsnPerm.kt`

### Native Runtime

- [JNI runtime loader](https://github.com/sxtufs/vmc/blob/main/native/src/vmp.cpp): `native/src/vmp.cpp`
- [APK verification](https://github.com/sxtufs/vmc/blob/main/native/src/vmp_apk_verify.cpp): `native/src/vmp_apk_verify.cpp`
- [Signature block](https://github.com/sxtufs/vmc/blob/main/native/src/vmp_sigblock.cpp): `native/src/vmp_sigblock.cpp`
- [Container reader](https://github.com/sxtufs/vmc/blob/main/native/src/vmp_file.cpp): `native/src/vmp_file.cpp`
- [DEX interpreter](https://github.com/sxtufs/vmc/blob/main/native/src/interpreter.cpp): `native/src/interpreter.cpp`
- [Compression support](https://github.com/sxtufs/vmc/blob/main/native/src/miniz.c): `native/src/miniz.c`

### Other components

- **App user**

## Connections

- App user → Main screen: selects APK (evidence: `README.md`)
- Main screen → Pack coordinator: starts scan or pack (evidence: `app/src/main/java/com/vmp/packer/MainActivity.kt`)
- Main screen → Package preview: shows candidates (evidence: `app/src/main/java/com/vmp/packer/MainActivity.kt`)
- Main screen → Name mapping: imports mapping (evidence: `app/src/main/java/com/vmp/packer/MainActivity.kt`)
- Main screen → Signing identities: selects signing (evidence: `app/src/main/java/com/vmp/packer/MainActivity.kt`)
- Pack coordinator → Name mapping: uses names (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- Pack coordinator → ABI preflight: checks ABI (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- Pack coordinator → Manifest patching: patches manifest (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- Pack coordinator → DEX analysis: analyzes DEX (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- Pack coordinator → Selection policy: selects methods (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- DEX analysis → Selection policy: checks eligibility (evidence: `app/src/main/java/com/vmp/packer/DexParser.kt`)
- Pack coordinator → DEX rewriting: rewrites DEX (evidence: `README.md`)
- Pack coordinator → VMC containers: creates containers (evidence: `app/src/main/java/com/vmp/packer/Packer.kt`)
- VMC containers → DEX analysis: reads method data (evidence: `app/src/main/java/com/vmp/packer/VmcWriter.kt`)
- VMC containers → Opcode permutation: encodes opcodes (evidence: `app/src/main/java/com/vmp/packer/VmcWriter.kt`)
- VMC containers → IR encoding: encodes IR (evidence: `app/src/main/java/com/vmp/packer/VmcWriter.kt`)
- Pack coordinator → APK assembly: rebuilds APK (evidence: `README.md`)
- APK assembly → Opcode permutation: uses permutation (evidence: `app/src/main/java/com/vmp/packer/ApkBuilder.kt`)
- APK assembly → IR encoding: uses IR codec (evidence: `app/src/main/java/com/vmp/packer/ApkBuilder.kt`)
- Pack coordinator → APK signing: signs output (evidence: `README.md`)
- APK signing → Signing identities: uses identity
- JNI runtime loader → APK verification: verifies APK (evidence: `native/src/vmp.cpp`)
- APK verification → Signature block: checks signature (evidence: `native/src/vmp_apk_verify.cpp`)
- JNI runtime loader → Container reader: loads containers (evidence: `native/src/vmp.cpp`)
- JNI runtime loader → DEX interpreter: dispatches methods (evidence: `native/src/vmp.cpp`)
- JNI runtime loader → Compression support: uses compression (evidence: `native/src/vmp.cpp`)
- Container reader → DEX interpreter: provides method data
- VMC containers → Container reader: supplies VMC data (evidence: `README.md`)
