This page provides a high-level introduction to JEngine, a Unity framework designed for runtime hot updates. It covers the framework's core purpose, architectural components, package structure, and how the system enables code and asset updates without requiring application resubmission.
For detailed information about specific subsystems:
JEngine is a Unity framework that enables runtime hot updates for games. It allows you to ship code and asset updates to production builds without resubmitting to app stores. The framework integrates HybridCLR (IL2CPP hot reload), YooAsset (asset management), and built-in encryption/obfuscation.
Key Value Proposition:
Minimum Requirements:
Package Architecture:
| Package | Version | Type | Core Classes |
|---|---|---|---|
com.jasonxudeveloper.jengine.core | 1.1.6 | Required | Bootstrap, EncryptionMapping, BuildManager, Panel |
com.jasonxudeveloper.jengine.util | 1.1.4 | Optional | JAction, JObjectPool |
com.jasonxudeveloper.jengine.ui | 1.1.4 | Optional | MessageBox, JButton, JFormField, JTheme |
Sources: README.md1-135 UnityProject/Packages/com.jasonxudeveloper.jengine.core/package.json1-29 UnityProject/Packages/com.jasonxudeveloper.jengine.util/package.json1-21 UnityProject/Packages/com.jasonxudeveloper.jengine.ui/package.json1-24
Hot updates enable runtime modification of game code and assets without requiring application resubmission. JEngine implements hot updates through two core systems:
1. Dynamic Assembly Loading
HotUpdate.Code.dll and deployed to a CDNBootstrap.LoadHotCode() retrieves the DLL, decrypts it via Obfuz.DecryptDll(), and loads it through HybridCLR.Assembly.Load()2. Asset Bundle Management
Bootstrap.InitYooAssets() initializes a ResourcePackage with platform-specific play mode parametersResourceDownloaderOperation, decrypted using keys from EncryptionMapping, and cached locallyYooAssets.LoadSceneAsync() after hot code execution beginsKey Implementation Classes:
Bootstrap.cs - Orchestrates initialization sequenceEncryptionMapping.cs - Maps bundle names to decryption algorithmsBuildManager.cs - State machine controlling build pipelineUpdateScreen.cs - Progress display during resource downloadSources: README.md13-26 Diagram 2, Diagram 5
High-Level Component Relationships:
Core Runtime Flow with Actual Method Names:
Key Integration Points:
| Component | Version | Critical Methods | Called From |
|---|---|---|---|
| HybridCLR | 7.1.0 | Assembly.Load(byte[]) | Bootstrap.LoadHotCode() |
| HybridCLR | 7.1.0 | LoadMetadataForAOTAssembly(byte[]) | Bootstrap.LoadMetadataForAOTAssemblies() |
| YooAsset | 2.3.16 | ResourcePackage.InitializeAsync() | Bootstrap.InitYooAssets() |
| YooAsset | 2.3.16 | CreateResourceDownloader() | Bootstrap.DownloadResources() |
| Obfuz | Latest | ObfuzManager.DecryptDll(byte[]) | Bootstrap.LoadHotCode() |
| Obfuz | Latest | SetUpStaticSecretKey(string) | Bootstrap.Awake() |
Sources: UnityProject/Packages/com.jasonxudeveloper.jengine.core/package.json24-28 README.md97 Diagram 1, Diagram 2
Directory Layout with Key Classes:
com.jasonxudeveloper.jengine.core/
├── Runtime/
│ ├── Bootstrap.cs # Main runtime entry point
│ ├── Bootstrap.Common.cs # LoadAdditionalPackage(), LoadSceneAsync()
│ ├── BootstrapText.cs # Configurable UI text (v1.1.6)
│ ├── Update/
│ │ └── TargetPlatform.cs # Platform enum
│ └── Encrypt/
│ ├── EncryptionMapping.cs # GetBundleConfig()
│ ├── EncryptionOption.cs # Xor/Aes/ChaCha20 enum
│ └── Config/
│ ├── XorBundleConfig.cs # XOR encryption config
│ ├── AesBundleConfig.cs # AES encryption config
│ └── ChaCha20BundleConfig.cs # ChaCha20 encryption config
└── Editor/
├── CustomEditor/
│ ├── Panel.cs # EditorWindow menu item
│ ├── BuildManager.cs # BuildAll(), BuildCodeOnly()
│ └── BuildHelper.cs # StartBuildAll() facade
├── Settings/
│ └── Settings.cs # ScriptableObject config
└── EditorUtils.cs # GetAvailableYooAssetPackages()
Class Responsibilities by Module:
| Module | Class | Key Public Methods | Purpose |
|---|---|---|---|
| Runtime/Initialization | Bootstrap | Awake(), InitYooAssets(), LoadHotCode() | Orchestrates hot update lifecycle |
| Runtime/Utilities | Bootstrap.Common | LoadAdditionalPackage(), LoadSceneAsync() | Static helper methods |
| Runtime/Security | EncryptionMapping | GetBundleConfig(EncryptionOption) | Maps encryption type to config |
| Editor/Build | BuildManager | BuildAll(), BuildCodeOnly(), BuildAssetsOnly() | State machine build orchestration |
| Editor/UI | Panel | OnGUI(), StartBuildAll() | Unity Editor window |
| Editor/Config | Settings | GetOrCreateSettings(), Save() | Persistent build configuration |
Data Flow Between Classes:
Sources: UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/Panel.cs1-100 UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/BuildManager.cs1-200 CHANGE.md1-7
The following diagram shows how code and assets flow from development through build to runtime:
Build Process Classes:
| Class | Method | Purpose |
|---|---|---|
Panel | DrawGUI() | Renders build UI in Unity Editor |
BuildHelper | StartBuildAll() | Initiates full build (code + assets) |
BuildManager | BuildAll() | Orchestrates build steps via state machine |
Settings | GetOrCreateSettings() | Provides build configuration |
Runtime Process Classes:
| Class | Method | Purpose |
|---|---|---|
Bootstrap | Awake() | Initializes encryption keys and YooAsset |
Bootstrap | InitYooAssets() | Sets up resource package and play mode |
Bootstrap | LoadHotCode() | Loads hot update DLL via HybridCLR |
Bootstrap.Common | LoadAdditionalPackage() | Loads supplementary asset packages |
Sources: Diagram 2, Diagram 6, CHANGE.md1-80
YooAsset Play Mode Parameters by Platform:
| Platform Category | Play Mode Class | Initialization Code Pattern | Use Case |
|---|---|---|---|
| iOS, Android, PC, macOS | HostPlayModeParameters | new HostPlayModeParameters() | Standard CDN-based hot updates |
| WebGL | WebPlayModeParameters | new WebPlayModeParameters() | Browser-based streaming |
| WeChat/Douyin/Alipay/TapTap | HostPlayModeParameters | Custom IRemoteServices implementation | Mini-game platform file systems |
| Standalone (No Updates) | OfflinePlayModeParameters | new OfflinePlayModeParameters() | All resources embedded in build |
Bootstrap Initialization by Platform:
Platform Configuration in Bootstrap:
The TargetPlatform enum controls platform-specific behavior:
TargetPlatform.Regular // iOS, Android, PC, macOS
TargetPlatform.WebGL // Browser deployment
TargetPlatform.WeChatMiniGame // WeChat platform
TargetPlatform.DouyinMiniGame // TikTok/Douyin platform
TargetPlatform.AlipayMiniGame // Alipay platform
TargetPlatform.TapTapMiniGame // TapTap platform
Sources: README.md57 Diagram 1, UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/Update/TargetPlatform.cs1-20
Hot Update Mechanism:
| Feature | Technical Implementation | Code References |
|---|---|---|
| IL2CPP Hot Reload | HybridCLR transforms IL2CPP into AOT+JIT hybrid, 10x faster than ILRuntime | Bootstrap.LoadHotCode() → HybridCLR.Assembly.Load(byte[]) |
| Code Encryption | Multi-layer: static secret key + dynamic secret key + XOR/AES/ChaCha20 | Obfuz.SetUpStaticSecretKey(), Bootstrap.SetUpDynamicSecret(), EncryptionMapping.GetBundleConfig() |
| Asset Encryption | YooAsset bundles encrypted with symmetric key, decrypted at load time | XorDecryption, AesDecryption, ChaCha20Decryption classes |
| AOT Metadata | Supplements IL2CPP AOT assemblies with generic method implementations | Bootstrap.LoadMetadataForAOTAssemblies() → HybridCLR.LoadMetadataForAOTAssembly() |
| Zero-GC Async | UniTask replaces Task, JAction pools task chains | JAction.Do().Delay().Execute(), JObjectPool<T>.Get()/Return() |
| One-Click Build | State machine orchestrates: compile → obfuscate → encrypt → package | BuildManager.BuildAll() → 6 build steps |
Build Pipeline State Machine:
Security Layers:
| Layer | Technology | Configuration Class | Applied To |
|---|---|---|---|
| Static Secret Key | Obfuz XOR obfuscation | SetUpStaticSecretKey() | All hot update DLLs |
| Dynamic Secret Key | Runtime key from YooAsset | Bootstrap.SetUpDynamicSecret() | All hot update DLLs |
| Bundle Encryption | XOR/AES/ChaCha20 | XorBundleConfig, AesBundleConfig, ChaCha20BundleConfig | Asset bundles |
| Manifest Encryption | Same as bundle | XorManifestConfig, AesManifestConfig, ChaCha20ManifestConfig | YooAsset manifests |
Sources: README.md19-68 CLAUDE.md35-44 Diagram 2, Diagram 3
Architectural Transitions:
Version History:
| Version | Date | Core Technology | Key Changes |
|---|---|---|---|
| v0.5-0.7 | 2020-2022 | ILRuntime + XAsset | Initial hot update foundation, ClassBind, JBehaviour |
| v0.8 | Apr 2023 | ILRuntime + YooAsset | Asset management overhaul, WebGL support |
| v1.0 | Sep 2025 | HybridCLR + YooAsset | 10x performance boost, XOR/AES/ChaCha20 encryption, Obfuz integration |
| v1.1.4 | Jan 2026 | HybridCLR + YooAsset | Split into 3 packages, JAction, JObjectPool, MessageBox |
| v1.1.6 | Feb 2026 | HybridCLR + YooAsset | Configurable BootstrapText, JTabView, auto-detect manifest decryption |
Latest Features (v1.1.6):
BootstrapText.cs - Configurable UI text strings for BootstrapJTabView.cs - Tab navigation component in JEngine.UIPreprocessBuildCatalogSources: CHANGE.md1-150 README.md101-108 UnityProject/Packages/com.jasonxudeveloper.jengine.core/package.json3
JEngine/
├── UnityProject/
│ ├── Assets/
│ │ ├── HotUpdate/ # Hot update code and scenes
│ │ │ ├── Compiled/ # Built DLLs and PDBs
│ │ │ └── Scenes/ # Hot update scenes
│ │ └── Scenes/
│ │ └── Init.unity # Bootstrap scene
│ └── Packages/
│ ├── com.jasonxudeveloper.jengine.core/
│ │ ├── Runtime/ # Bootstrap, Update, Encrypt
│ │ └── Editor/ # Panel, BuildManager, Settings
│ ├── com.jasonxudeveloper.jengine.util/
│ │ └── Runtime/ # JAction, JObjectPool
│ └── com.jasonxudeveloper.jengine.ui/
│ ├── Runtime/ # MessageBox
│ └── Editor/ # EditorUI components
├── .github/
│ └── workflows/ # CI/CD automation
├── .claude-plugin/ # AI assistance skills
└── README.md # Framework overview
Sources: Repository structure analysis, Diagram 3
To begin using JEngine:
For detailed architectural information about specific subsystems, refer to the linked sections in the table of contents.
Sources: README.md28-32