# uxazu/aemulator architecture

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

- Interactive diagram: https://gitdiagram.com/uxazu/aemulator
- Repository: https://github.com/uxazu/aemulator

## Overview

AEmulator imports Android firmware and runs it as a guest system on an Android phone. The principal flow is selecting firmware, parsing it into a boot plan, then starting and interacting with the guest. Runtime paths differ by guest version: older systems use patched QEMU, while newer arm64 programs run natively with an engine kernel. The README documents the major compatibility features; source excerpts chiefly expose property, input, binder, and graphics helpers, so detailed wiring among unsampled components is not asserted.

Main entry points: [`app/src/main/java/app/aemu/core/GuestRunner.kt`](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/GuestRunner.kt) (Guest execution), [`app/src/main/java/app/aemu/importer/Importer.kt`](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/importer/Importer.kt) (Firmware importer), [`app/src/main/java/app/aemu/ui/VmActivity.kt`](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/VmActivity.kt) (Guest controls), [`native/glbridge/host.c`](https://github.com/uxazu/aemulator/blob/main/native/glbridge/host.c) (GL bridge)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["App experience"]
  node_home["Firmware library<br/>[Home.kt]"]
  node_vmui["Guest controls<br/>[VmActivity.kt]"]
end

subgraph group_import["Firmware import"]
  node_importer["Firmware importer<br/>[Importer.kt]"]
  node_formats["Format readers<br/>[Formats.kt]"]
  node_bootplan["Boot planning<br/>[InitPlan.kt]"]
end

subgraph group_runtime["Guest runtime"]
  node_engine["Runtime engine<br/>[Engine.kt]"]
  node_guest["Guest execution<br/>[GuestRunner.kt]"]
  node_binder["Binder emulation<br/>[bclient.c]"]
  node_properties["Guest properties<br/>[PropService.kt]"]
  node_proparea[("Property area<br/>[PropArea.kt]")]
  node_unix["Unix sockets<br/>[UnixServer.kt]"]
end

subgraph group_compat["Hardware compatibility"]
  node_graphics["GL bridge<br/>[host.c]"]
  node_glsplit["GL adapter<br/>[split.c]"]
  node_audio["Audio HAL<br/>[audio_hal.c]"]
  node_input["Touch input<br/>[InputService.kt]"]
  node_network["TLS networking<br/>[TlsBridge.kt]"]
  node_sdcard["Shared card folder<br/>[Sdcard.kt]"]
end

subgraph group_support["App services"]
  node_settings["App settings"]
  node_localization["Translations"]
  node_updates["App updates"]
end

node_user(("Phone user"))
node_firmware["Firmware file"]
node_gpu["Phone GPU"]
node_audio_stack["Android audio stack"]

node_user -->|"opens"| node_home
node_user -->|"selects"| node_firmware
node_home -->|"adds firmware"| node_importer
node_firmware -->|"reads"| node_importer
node_importer -.->|"supports formats"| node_formats
node_importer -->|"builds plan"| node_bootplan
node_user -->|"starts guest"| node_vmui
node_vmui -.->|"starts runtime"| node_engine
node_engine -->|"runs guest"| node_guest
node_guest -->|"emulates binder"| node_binder
node_guest -->|"forwards graphics"| node_graphics
node_glsplit -->|"adapts GL calls"| node_graphics
node_graphics -->|"uses"| node_gpu
node_guest -->|"uses audio HAL"| node_audio
node_audio -->|"adapts output"| node_audio_stack
node_vmui -.->|"sends touch"| node_input
node_guest -->|"uses proxy"| node_network
node_guest -->|"shares files"| node_sdcard
node_properties -->|"reads and writes"| node_proparea
node_properties -->|"serves socket"| node_unix
node_input -->|"serves socket"| node_unix
node_user -->|"configures"| node_settings
node_settings -->|"chooses language"| node_localization
node_user -.->|"checks updates"| node_updates

click node_home "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/Home.kt"
click node_vmui "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/VmActivity.kt"
click node_importer "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/importer/Importer.kt"
click node_formats "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/importer/Formats.kt"
click node_bootplan "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/InitPlan.kt"
click node_engine "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/Engine.kt"
click node_guest "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/GuestRunner.kt"
click node_binder "https://github.com/uxazu/aemulator/blob/main/native/guest64/36/bclient.c"
click node_properties "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/PropService.kt"
click node_proparea "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/PropArea.kt"
click node_unix "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/UnixServer.kt"
click node_graphics "https://github.com/uxazu/aemulator/blob/main/native/glbridge/host.c"
click node_glsplit "https://github.com/uxazu/aemulator/blob/main/native/glsplit/split.c"
click node_audio "https://github.com/uxazu/aemulator/blob/main/native/audiohal/audio_hal.c"
click node_input "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/InputService.kt"
click node_network "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/TlsBridge.kt"
click node_sdcard "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/Sdcard.kt"
click node_settings "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/AppSettingsActivity.kt"
click node_localization "https://github.com/uxazu/aemulator/tree/main/app/l10n/langs"
click node_updates "https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/update/AppUpdateManager.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_home,node_vmui,node_user toneBlue
class node_importer,node_formats,node_bootplan toneAmber
class node_engine,node_guest,node_binder,node_properties,node_proparea,node_unix toneMint
class node_graphics,node_glsplit,node_audio,node_input,node_network,node_sdcard toneRose
class node_settings,node_localization,node_updates,node_firmware,node_gpu,node_audio_stack toneIndigo
```

## Components

### App experience

- [Firmware library](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/Home.kt): `app/src/main/java/app/aemu/ui/Home.kt`
- [Guest controls](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/VmActivity.kt): `app/src/main/java/app/aemu/ui/VmActivity.kt`

### Firmware import

- [Firmware importer](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/importer/Importer.kt): `app/src/main/java/app/aemu/importer/Importer.kt`
- [Format readers](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/importer/Formats.kt): `app/src/main/java/app/aemu/importer/Formats.kt`
- [Boot planning](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/InitPlan.kt): `app/src/main/java/app/aemu/core/InitPlan.kt`

### Guest runtime

- [Runtime engine](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/Engine.kt): `app/src/main/java/app/aemu/core/Engine.kt`
- [Guest execution](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/GuestRunner.kt): `app/src/main/java/app/aemu/core/GuestRunner.kt`
- [Binder emulation](https://github.com/uxazu/aemulator/blob/main/native/guest64/36/bclient.c): `native/guest64/36/bclient.c`
- [Guest properties](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/PropService.kt): `app/src/main/java/app/aemu/core/PropService.kt`
- [Property area](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/PropArea.kt): `app/src/main/java/app/aemu/core/PropArea.kt`
- [Unix sockets](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/UnixServer.kt): `app/src/main/java/app/aemu/core/UnixServer.kt`

### Hardware compatibility

- [GL bridge](https://github.com/uxazu/aemulator/blob/main/native/glbridge/host.c): `native/glbridge/host.c`
- [GL adapter](https://github.com/uxazu/aemulator/blob/main/native/glsplit/split.c): `native/glsplit/split.c`
- [Audio HAL](https://github.com/uxazu/aemulator/blob/main/native/audiohal/audio_hal.c): `native/audiohal/audio_hal.c`
- [Touch input](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/InputService.kt): `app/src/main/java/app/aemu/core/InputService.kt`
- [TLS networking](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/TlsBridge.kt): `app/src/main/java/app/aemu/core/TlsBridge.kt`
- [Shared card folder](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/core/Sdcard.kt): `app/src/main/java/app/aemu/core/Sdcard.kt`

### App services

- [App settings](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/ui/AppSettingsActivity.kt): `app/src/main/java/app/aemu/ui/AppSettingsActivity.kt`
- [Translations](https://github.com/uxazu/aemulator/tree/main/app/l10n/langs): `app/l10n/langs`
- [App updates](https://github.com/uxazu/aemulator/blob/main/app/src/main/java/app/aemu/update/AppUpdateManager.kt): `app/src/main/java/app/aemu/update/AppUpdateManager.kt`

### Other components

- **Phone user**
- **Firmware file**
- **Phone GPU**
- **Android audio stack**

## Connections

- Phone user → Firmware library: opens (evidence: `README.md`)
- Phone user → Firmware file: selects (evidence: `README.md`)
- Firmware library → Firmware importer: adds firmware (evidence: `README.md`)
- Firmware file → Firmware importer: reads (evidence: `README.md`)
- Firmware importer → Format readers: supports formats
- Firmware importer → Boot planning: builds plan (evidence: `README.md`)
- Phone user → Guest controls: starts guest (evidence: `README.md`)
- Guest controls → Runtime engine: starts runtime
- Runtime engine → Guest execution: runs guest (evidence: `README.md`)
- Guest execution → Binder emulation: emulates binder (evidence: `README.md`)
- Guest execution → GL bridge: forwards graphics (evidence: `README.md`)
- GL adapter → GL bridge: adapts GL calls (evidence: `native/glsplit/split.c`)
- GL bridge → Phone GPU: uses (evidence: `README.md`)
- Guest execution → Audio HAL: uses audio HAL (evidence: `README.md`)
- Audio HAL → Android audio stack: adapts output (evidence: `README.md`)
- Guest controls → Touch input: sends touch
- Guest execution → TLS networking: uses proxy (evidence: `README.md`)
- Guest execution → Shared card folder: shares files (evidence: `README.md`)
- Guest properties → Property area: reads and writes (evidence: `app/src/main/java/app/aemu/core/PropService.kt`)
- Guest properties → Unix sockets: serves socket (evidence: `app/src/main/java/app/aemu/core/PropService.kt`)
- Touch input → Unix sockets: serves socket (evidence: `app/src/main/java/app/aemu/core/InputService.kt`)
- Phone user → App settings: configures (evidence: `README.md`)
- App settings → Translations: chooses language (evidence: `README.md`)
- Phone user → App updates: checks updates
