# soot-oss/sootup architecture

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

- Interactive diagram: https://gitdiagram.com/soot-oss/sootup
- Repository: https://github.com/soot-oss/sootup

## Overview

SootUp is a static-analysis library that loads JVM-family program inputs, represents methods in Jimple, and builds analyses and graph representations over that program. The principal workflow is input loading and body conversion, optional body interception, then call-graph and data-flow analysis, with results available as analysis graphs or code property graphs. The README also documents Jimple parsing/serialization and class-hierarchy generation. The supplied source samples are selective, so links for those documented capabilities are shown only at the subsystem level; no unsupported internal call sequence is asserted.

Main entry points: [`sootup.core/src/main/java/sootup/core/jimple`](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/jimple) (Jimple IR), [`sootup.callgraph/src/main/java/sootup/callgraph`](https://github.com/soot-oss/sootup/tree/develop/sootup.callgraph/src/main/java/sootup/callgraph) (Call Graph), [`sootup.core/src/main/java/sootup/core/frontend/BodySource.java`](https://github.com/soot-oss/sootup/blob/develop/sootup.core/src/main/java/sootup/core/frontend/BodySource.java) (Method Bodies), [`sootup.core/src/main/java/sootup/core/graph`](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/graph) (Control-Flow Graphs)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_input["Program Inputs"]
  node_input_api["Input Locations<br/>[inputlocation]"]
  node_apk_frontend["APK / Dex Frontend<br/>[frontend]"]
  node_class_provider["Class Providers<br/>[frontend]"]
  node_body_source["Method Bodies<br/>[BodySource.java]"]
end

subgraph group_ir["Jimple Model"]
  node_interceptors["Body Interceptors<br/>[interceptor]"]
  node_jimple["Jimple IR<br/>[jimple]"]
  node_jimple_io["Jimple Parse / Serialize<br/>[jimple]"]
end

subgraph group_graphs["Program Graphs"]
  node_hierarchy["Class Hierarchy<br/>[core]"]
  node_callgraph["Call Graph<br/>[callgraph]"]
  node_cfg["Control-Flow Graphs<br/>[graph]"]
  node_icfg["Interprocedural CFG<br/>[icfg]"]
end

subgraph group_analysis["Static Analysis"]
  node_intra["Intraprocedural Analysis<br/>[intraprocedural]"]
  node_reaching["Reaching Definitions<br/>[ReachingDefs.java]"]
  node_ifds["IFDS / IDE Solvers<br/>[interprocedural]"]
  node_qilin["Pointer Analysis<br/>[qilin]"]
end

subgraph group_representations["Graph Representations"]
  node_cpg["Code Property Graph<br/>[codepropertygraph]"]
end

node_engineer(("Library User"))
node_program["Program Files"]
node_analysis_results["Analysis Results"]

node_engineer -->|"selects inputs"| node_input_api
node_program -->|"provides files"| node_input_api
node_input_api -->|"resolves classes"| node_class_provider
node_program -.->|"provides APK"| node_apk_frontend
node_apk_frontend -->|"provides Dex bodies"| node_body_source
node_class_provider -->|"provides sources"| node_body_source
node_body_source -->|"intercepts bodies"| node_interceptors
node_body_source -->|"produces Jimple"| node_jimple
node_interceptors -->|"transforms bodies"| node_jimple
node_engineer -->|"parses or serializes"| node_jimple_io
node_jimple -->|"supports resolution"| node_hierarchy
node_jimple -->|"analyzes calls"| node_callgraph
node_hierarchy -->|"resolves targets"| node_callgraph
node_jimple -->|"builds control flow"| node_cfg
node_cfg -->|"supports flow analysis"| node_intra
node_intra -->|"implements analysis"| node_reaching
node_cfg -->|"extends across methods"| node_icfg
node_icfg -->|"supports tabulation"| node_ifds
node_callgraph -->|"connects methods"| node_icfg
node_jimple -->|"analyzes pointers"| node_qilin
node_callgraph -->|"guides reachability"| node_qilin
node_jimple -->|"builds graph"| node_cpg
node_callgraph -->|"produces graph"| node_analysis_results
node_intra -->|"produces facts"| node_analysis_results
node_ifds -->|"produces facts"| node_analysis_results
node_qilin -->|"produces points-to results"| node_analysis_results
node_cpg -->|"exposes representation"| node_analysis_results

click node_input_api "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/inputlocation"
click node_apk_frontend "https://github.com/soot-oss/sootup/tree/develop/sootup.apk.frontend/src/main/java/sootup/apk/frontend"
click node_class_provider "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/frontend"
click node_body_source "https://github.com/soot-oss/sootup/blob/develop/sootup.core/src/main/java/sootup/core/frontend/BodySource.java"
click node_interceptors "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/interceptor"
click node_jimple "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/jimple"
click node_hierarchy "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core"
click node_callgraph "https://github.com/soot-oss/sootup/tree/develop/sootup.callgraph/src/main/java/sootup/callgraph"
click node_cfg "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/graph"
click node_icfg "https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural/icfg"
click node_intra "https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural"
click node_reaching "https://github.com/soot-oss/sootup/blob/develop/sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural/reachingdefs/ReachingDefs.java"
click node_ifds "https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural"
click node_qilin "https://github.com/soot-oss/sootup/tree/develop/sootup.qilin/src/main/java/qilin"
click node_cpg "https://github.com/soot-oss/sootup/tree/develop/sootup.codepropertygraph/src/main/java/sootup/codepropertygraph"
click node_jimple_io "https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/jimple"

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_input_api,node_apk_frontend,node_class_provider,node_body_source,node_engineer toneBlue
class node_interceptors,node_jimple,node_jimple_io toneAmber
class node_hierarchy,node_callgraph,node_cfg,node_icfg toneMint
class node_intra,node_reaching,node_ifds,node_qilin toneRose
class node_cpg,node_program,node_analysis_results toneIndigo
```

## Components

### Program Inputs

- [Input Locations](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/inputlocation): `sootup.core/src/main/java/sootup/core/inputlocation`
- [APK / Dex Frontend](https://github.com/soot-oss/sootup/tree/develop/sootup.apk.frontend/src/main/java/sootup/apk/frontend): `sootup.apk.frontend/src/main/java/sootup/apk/frontend`
- [Class Providers](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/frontend): `sootup.core/src/main/java/sootup/core/frontend`
- [Method Bodies](https://github.com/soot-oss/sootup/blob/develop/sootup.core/src/main/java/sootup/core/frontend/BodySource.java): `sootup.core/src/main/java/sootup/core/frontend/BodySource.java`

### Jimple Model

- [Body Interceptors](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/interceptor): `sootup.core/src/main/java/sootup/core/interceptor`
- [Jimple IR](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/jimple): `sootup.core/src/main/java/sootup/core/jimple`
- [Jimple Parse / Serialize](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/jimple): `sootup.core/src/main/java/sootup/core/jimple`

### Program Graphs

- [Class Hierarchy](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core): `sootup.core/src/main/java/sootup/core`
- [Call Graph](https://github.com/soot-oss/sootup/tree/develop/sootup.callgraph/src/main/java/sootup/callgraph): `sootup.callgraph/src/main/java/sootup/callgraph`
- [Control-Flow Graphs](https://github.com/soot-oss/sootup/tree/develop/sootup.core/src/main/java/sootup/core/graph): `sootup.core/src/main/java/sootup/core/graph`
- [Interprocedural CFG](https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural/icfg): `sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural/icfg`

### Static Analysis

- [Intraprocedural Analysis](https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural): `sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural`
- [Reaching Definitions](https://github.com/soot-oss/sootup/blob/develop/sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural/reachingdefs/ReachingDefs.java): `sootup.analysis.intraprocedural/src/main/java/sootup/analysis/intraprocedural/reachingdefs/ReachingDefs.java`
- [IFDS / IDE Solvers](https://github.com/soot-oss/sootup/tree/develop/sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural): `sootup.analysis.interprocedural/src/main/java/sootup/analysis/interprocedural`
- [Pointer Analysis](https://github.com/soot-oss/sootup/tree/develop/sootup.qilin/src/main/java/qilin): `sootup.qilin/src/main/java/qilin`

### Graph Representations

- [Code Property Graph](https://github.com/soot-oss/sootup/tree/develop/sootup.codepropertygraph/src/main/java/sootup/codepropertygraph): `sootup.codepropertygraph/src/main/java/sootup/codepropertygraph`

### Other components

- **Library User**
- **Program Files**
- **Analysis Results**

## Connections

- Library User → Input Locations: selects inputs
- Program Files → Input Locations: provides files
- Input Locations → Class Providers: resolves classes
- Program Files → APK / Dex Frontend: provides APK
- APK / Dex Frontend → Method Bodies: provides Dex bodies
- Class Providers → Method Bodies: provides sources
- Method Bodies → Body Interceptors: intercepts bodies
- Method Bodies → Jimple IR: produces Jimple
- Body Interceptors → Jimple IR: transforms bodies
- Library User → Jimple Parse / Serialize: parses or serializes
- Jimple IR → Class Hierarchy: supports resolution
- Jimple IR → Call Graph: analyzes calls
- Class Hierarchy → Call Graph: resolves targets
- Jimple IR → Control-Flow Graphs: builds control flow
- Control-Flow Graphs → Intraprocedural Analysis: supports flow analysis
- Intraprocedural Analysis → Reaching Definitions: implements analysis
- Control-Flow Graphs → Interprocedural CFG: extends across methods
- Interprocedural CFG → IFDS / IDE Solvers: supports tabulation
- Call Graph → Interprocedural CFG: connects methods
- Jimple IR → Pointer Analysis: analyzes pointers
- Call Graph → Pointer Analysis: guides reachability
- Jimple IR → Code Property Graph: builds graph
- Call Graph → Analysis Results: produces graph
- Intraprocedural Analysis → Analysis Results: produces facts
- IFDS / IDE Solvers → Analysis Results: produces facts
- Pointer Analysis → Analysis Results: produces points-to results
- Code Property Graph → Analysis Results: exposes representation
