xPlugin
1. Введение
Android-плагин для обмена сообщениями использует обмен сообщениями для максимального разделения, что позволяет плагинам загружаться асинхронно при запуске и повышает эффективность запуска приложения. В настоящее время все интерфейсы совместимы с версиями Android API от 19 до 30.
Особенности:
-
Ресурсный обмен: можно указать Runtime Module, другие модули могут использовать предоставленные им типы и ресурсы.
-
Изоляция ресурсов: каждый модуль плагина старается использовать свои собственные типы и ресурсы, чтобы избежать конфликтов типов и ресурсов.
-
Обмен сообщениями: модули взаимодействуют через обмен сообщениями, максимально разделяя зависимости, откладывая загрузку зависимостей и загружая их при вызове модуля (можно настроить автоматическую асинхронную загрузку зависимых модулей).
-
Близость к нативному: использование системных API близко к нативным, ограничения и решения см. ниже.
Ограничения:
-
Activity: не поддерживает прямой запуск из внешних приложений, рекомендуется регистрация в хост-приложении или реализация пользовательской Activity для перехода.
-
Service: не поддерживает прямой запуск из внешних приложений, сценарии использования ограничены, обновления нечастые, рекомендуется регистрация в хост-приложении.
-
Broadcast: динамическая регистрация, приложение должно быть запущено, статическая регистрация рекомендуется в хост-приложении.
-
ContentProvider: не поддерживает прямой запуск из внешних приложений, рекомендуется регистрация в хост-приложении.
-
Проблемы с ресурсами системного процесса: Notification и другие требуют загрузки ресурсов приложения системным процессом, рекомендуется использовать пакетные интерфейсы для упаковки и предоставления плагину.
-
Проблема с анимацией overridePendingTransition: аналогично проблемам с системными процессами, но можно добавить одноимённые ресурсы в хост-приложение или установить сопоставление через ActivityHelper#registerOverridePendingTransitionAnimId, фреймворк автоматически обработает загрузку.
2. Архитектура программного обеспечения
Обратите внимание: после компиляции основного модуля в демонстрационном проекте ресурсы, зависящие от других модулей, будут выводиться в каталог runtime, позволяя другим модулям использовать ресурсы, предоставляемые основным модулем.
3. Общие интерфейсы
- PluginRuntime: класс инициализации плагина, используется при инициализации Application.
- Installer: инструмент установки и загрузки плагина, здесь можно получить информацию об установленных и загруженных плагинах.
- PluginMsg: сообщения плагина, используемые для связи между плагинами.
- PluginEntry: точка регистрации сообщений, соглашение об именах классов: $packageName.PluginEntry, для удобства интеграции во внешние SDK, PluginEntry хоста может быть указан через интерфейс инициализации.
- Plugin: родительский класс для хоста (Host) и дочерних модулей (Module), информация о соответствующем плагине может быть получена через Plugin.getPlugin (тип или экземпляр плагина).
4. Инициализация
- Добавление зависимостей Gradle:
// Минимальное требование к версии плагина Gradle: com.android.tools.build:gradle:4.0.0
// В хосте
implementation 'org.xutils:xutils:3.9.0'
implementation 'org.xplugin:xplugin:1.3.10'
// В плагине
compileOnly 'org.xutils:xutils:3.9.0' // Необязательно
compileOnly 'org.xplugin:xplugin:1.3.10'
- Пример интерфейса инициализации: MyApplication
- Добавьте информацию о зависимостях в Manifest хоста или плагина, фреймворк будет автоматически асинхронно загружать зависимые модули плагинов, см. AndroidManifest.xml
- Обратитесь к примеру конфигурации проекта Gradle, обратите внимание, что packageId плагина должен быть >= 0x70, но не должен быть установлен на 0x7F, например:
aaptOptions {
// Для использования packageId меньше 0x80 необходимо добавить '--allow-reserved-package-id'
// additionalParameters '--allow-reserved-package-id', '--package-id', '0x72',
additionalParameters '--package-id', '0x80'
}
5. Использование Activity в плагине
См. пример в основном проекте Дополнительная информация
6. Использование Service в плагине
См. пример в основном проекте
7. Использование Broadcast в плагине
См. пример в основном проекте
8. Использование ContentProvider в плагине
См. пример в основном проекте
9. Вызов сообщений между плагинами
См. примеры использования PluginEntry и PluginMsg.
Прочее
Компиляция примера проекта:
- Очистить кэш компиляции: ./gradlew clean
- Скомпилировать основной модуль: ./gradlew main:build
- Скомпилируйте модуль module1: ./gradlew module1:build
- Скомпилируйте модуль module2: ./gradlew module2:build
О теме
API Android 28 и ниже не поддерживают ссылки на темы Runtime Module, включая темы с ресурсами пакетов, которые должны быть скомпилированы в плагин с использованием метода реализации.
Проблемы с отражением styleable
Если используется Class.forName(packageName + ".R$styleable").getFields()
для отражения получения ресурсов styleable, рекомендуется изменить его на R.styleable.class.getFields()
, чтобы обеспечить лучшую совместимость. В противном случае при компиляции плагина необходимо добавить:
aaptOptions {
additionalParameters '--java', 'src/main/java', '--custom-package', 'app_packageName'
}
Комментарии ( 0 )