Реалізація Plugin-архітектури мобільного додатку
Plugin-архітектура — крок далі модульної. Якщо у модульній архітектурі всі модулі відомі на етапі компіляції та собираються в єдиний бінарник, то plugin-архітектура передбачає, що частини додатку можуть бути додані, замінені або оновлені незалежно від основного додатку — іноді у runtime.
Це потрібно не завжди. Конкретні сценарії: додаток-платформа з партнерськими розширеннями, super app де мініпрограми — це плагіни, корпоративна MDM-система де компанія-клієнт додає свої модулі.
Як це працює на Android
Android дозволяє динамічне завантаження коду через DexClassLoader. Плагін — це APK або DEX-файл, завантажений у runtime:
val pluginApkPath = File(context.filesDir, "plugin-v2.apk").absolutePath
val classLoader = DexClassLoader(
pluginApkPath,
context.codeCacheDir.absolutePath,
null,
context.classLoader
)
val pluginClass = classLoader.loadClass("com.plugin.FeatureImpl")
val plugin = pluginClass.getDeclaredConstructor().newInstance() as PluginContract
plugin.initialize(pluginContext)
PluginContract — інтерфейс, який плагін імплементує. Основний додаток знає тільки про інтерфейс, не про реалізацію. Плагін завантажується з сервера, верифікується за цифровим підписом (JarVerifier або власна через SHA-256), розміщується в filesDir, завантажується.
Google Play Integrity API — для перевірки того, що завантажений плагін не був підміняний. IntegrityManager.requestIntegrityToken() перед завантаженням плагіна підтверджує цілісність запиту.
Обмеження. App Store (iOS) забороняє динамічне завантаження виконуваного коду — guideline 2.5.2. На iOS plugin-архітектура означає либо compile-time плагіни (все відомо при збірці, підключено через протоколи), либо інтерпретований контент (JavaScript через JavaScriptCore, Lua, WebAssembly) — це не нативний код і не порушує правила.
iOS: плагіни через протоколи та JavaScriptCore
На iOS «плагін» у сенсі динамічно завантажуваного коду неможливий без джейлбрейку. Але plugin-архітектуру можна реалізувати через:
1. Protocol-based compile-time плагіни. Кожен плагін — Swift Package, що імплементує PluginProtocol. Додаток компілюється зі всіма плагінами, активує потрібні через конфіг. Плагіни ізольовані через модулі, доступ до API хоста — тільки через протокол.
2. JavaScriptCore як runtime. Плагін — JavaScript-файл, завантажений з сервера та виконуваний через JSContext. Хост реєструє нативні функції як JS-об'єкти: context["nativeAPI"] = nativeAPI as AnyObject. Швидкість виконання — прийнятна для бізнес-логіки, неприйнятна для рендерингу. Саме так працюють мініпрограми у WeChat та деяких super app.
3. WebAssembly. iOS 14+ WKWebView виконує WASM через JavaScript engine. Плагін компілюється в WASM (з C++, Rust, AssemblyScript), виконується в ізольованому середовищі. Взаємодія з нативним кодом — через WASM imports/exports.
Версіонування та сумісність плагінів
Найскладніша частина plugin-архітектури — не завантаження коду, а управління сумісністю. Додаток v2.5 повинен запустити плагін, написаний під v2.0 API, та не упасти на плагіні v2.6, який очікує неіснуючого API.
Рішення — явне версіонування контракту. PluginContract має minHostVersion та targetHostVersion. При завантаженні плагіна хост перевіряє сумісність перед initialize(). Застарілі версії API позначені @Deprecated та підтримуються два мажорні версії.
Приклад. Корпоративний retail super app: основний додаток — авторизація, навігація, спільний UI. Плагіни: StockPlugin (складський облік), CRMPlugin (робота з клієнтами), AnalyticsPlugin (дашборди). Кожен розробляється окремою командою, завантажується через MDM при першому запуску сотрудником. Android: DexClassLoader з верифікацією підпису. iOS: compile-time плагіни через локальні SPM пакети, активація через feature flags. Оновлення плагіна — без оновлення основного додатку в Google Play (через власний сервер дистрибуції для корпоративних пристроїв).
Час реалізації
| Тип системи | Орієнтовні строки |
|---|---|
| Compile-time plugin система (iOS + Android) | 8–14 тижнів |
| Runtime plugin система (Android) + JS-плагіни (iOS) | 4–7 місяців |
| Повнофункціональна платформа з маркетплейсом плагінів | 8–14 місяців |
Ціна розраховується індивідуально. Plugin-архітектура — рішення для складних платформ; для стандартних продуктів вона надмірна та ускладнює розробку без користі.







