Шаблон плагина для exteraGram / AyuGram, в котором вся логика написана на Kotlin,
собирается в DEX и встраивается прямо в .py-файл плагина.
<plugin-id>.py— сам плагин: метаданные, i18n, загрузка встроенного DEX черезInMemoryDexClassLoaderи вызов Kotlin-классаPlugin.src/main/kotlin/...— основная логика (хуки, пункты меню, настройки, i18n).tools/embed_dex.py— вшивает собранныйclasses.dexв копию.py.tools/dev_watch.py— live-reload на устройстве черезextera dev-sync(adb).libs/Telegram.jar— классы хост-приложения, распакованные из APK рецептомjust update-apk(лежит в git через LFS).libs/Telegram.stripped.jar— compile-classpath: тот же jar с восстановленными вложенными классами и без пакетов, которые приходят из Gradle-зависимостей. Собирается локально изlibs/Telegram.jar—just dexделает это сам.
java (JDK 21), uv, just, adb, jbang. Для update-apk дополнительно dex2jar.
# переименовать шаблон под себя: пакет, id и отображаемое имя
just init com.example.myplugin my-plugin "My Plugin"
just dex # debug-сборка DEX
just watch # live-reload на подключённом устройствеjust ci-release 1.2.3 # -> dist/<plugin-id>.plugin: версия, release-DEX и упаковкаjust embed вшивает уже собранный release-DEX в dist/<plugin-id>.py, не трогая версию.
Либо workflow Release в GitHub Actions (запуск вручную, версия в формате x.x.x).
just loc— перегенерировать i18n-файлы без полной пересборки DEX.just gen-stubs <rt.jar> <android.jar>— стабы для автодополнения в Python.just update-apk <apk>— обновитьlibs/Telegram.jarиз APK хоста и закоммитить его.just strip-telegram-jar— пересобратьlibs/Telegram.stripped.jarпринудительно;just dexиjust ci-releaseи так пересобирают его, когда он старшеlibs/Telegram.jarилиtools/FixTelegramJar.java.