Как создать APK и отдельные библиотеки, которые приложение загружает динамически

Краткое описание: Как создать APK и отдельные библиотеки (под которыми я подразумеваю набор классов (и в идеале - ресурсы) в той или иной форме, такие как JAR, AAR или DEX файлы), но не включают те библиотеки в АПК; вместо этого приложение загружает их во время выполнения?

Detail

Итак, мой главный вопрос: как создать такое приложение (например, Gradle). Как указать, какие классы входят в файлы JAR или DEX? Я создаю модуль Android Studio для каждого файла DEX, в который я хочу закончить?

Близкий вопрос заключается в том, как Java-код должен затем загружать внешние библиотеки и получать доступ к их классам во время выполнения. Для последнего я надеюсь, что подход, показанный в доступе к классам приложения из файла dex загрузчиком классов, будет работать.

Я пробовал инструкции в https://developer.android.com/studio/projects/android-library.html, но это создает APK, который включает библиотеку зависимостей.

Я также пробовал Multidex (https://developer.android.com/studio/build/multidex.html), но это, похоже, не оставляет разработчику никакого контроля над тем, какие классы зайдите в файл DEX и, кроме того, упакуйте их все в один APK. AFAICT не может контролировать загрузку этих файлов DEX во время выполнения.

Фон

Здесь есть возможность " проблема X-Y", поэтому мне лучше объяснить фон.

Я создаю приложение для клиента. Он не будет распространяться через магазин приложений, поэтому у него не будет доступа к нормальному механизму обновлений. Вместо этого клиент хочет, чтобы приложение могло обновить себя, загрузив новые компоненты самостоятельно, чтобы заменить старые компоненты, без необходимости вручную загружать новый APK вручную. Основной мотив здесь заключается в том, что обновления должны быть легкими для нетехнических пользователей. Если приложение может контролировать процесс обновления, оно может сделать его гладким и ориентированным на пользователя.

Кроме того, приложение будет использоваться в тех областях, где доступ в Интернет ограничен и дорог, поэтому клиент хочет иметь возможность выпускать обновления приложений в небольших кусках (например, 2 МБ), а не заставлять пользователя повторно загружать все приложение для получения небольшого обновления.

Один из аспектов требований, которые я должен упомянуть в случае, если это имеет значение, заключается в том, что библиотеки, которые должны быть загружены во время выполнения, должны жить на карте microSD. Это также может помочь в распространении обновлений без доступа в Интернет.

Текущее состояние приложения заключается в том, что он написан примерно на 50%: то есть была выпущена пара более ранних версий, но теперь приложение необходимо изменить (изменить) для удовлетворения вышеуказанных требований, а также других,

Ответ 1

Этот учебник является хорошим началом для внешней загрузки файлов DEX. Только три небольших файла источника (MainActivity.java, LibraryInterface.java, LibraryProvider.java) и он копирует файл secondary_dex.jar из папки с ресурсами в внутреннее хранилище приложений [outdex/dex] (как указано в Интернете в учебнике). Вы должны построить его с помощью ant, поскольку он использует пользовательские шаги сборки. Я попробовал, он работает нормально. Стоит посмотреть.
загрузка пользовательского класса в Dalvik и ART


UPDATE этот код был перенесен в Android Studio gradle (нет необходимости в ant). https://github.com/timrae/custom-class-loader
Протестировано ok. Копирует com.example.toastlib.jar из SDcard в внутреннее хранилище приложений [outdex/dex], (не папка с ресурсами). (вы должны прочитать файл README.md в проекте для его создания).

В: Как добавить активность, я не могу добавить ее в манифест?
A: Использование Фрагменты, им не нужны записи в манифесте.

Q: Jar с ресурсами, которые должны быть добавлены к существующей проект должен иметь возможность объединить свои ресурсы с собственные ресурсы (Р.).
A: Доступны хаки, файл данных...
Загрузка файлов ресурсов Android в распространяемый файл Jar

Q: Внешний файл имеет неправильные разрешения.
A: Импортируйте его.

В: Мне нужно добавить использование-разрешение.
A: Используйте API23, вы можете программным образом добавлять разрешения-назначения (но они все равно должны быть объявлены в манифесте, поэтому новая модель разрешений, вероятно, не так много для нас).

Этот раздел предназначен для более общих пользователей (@LarsH имеет более конкретные требования об обновлениях). Пример выше - 17kb apk и 1 kb jar. Вы можете поместить основную часть вашего кода в одноразовую банку, и обновления будут включать в себя просто загрузку нового Apk (а затем импорт банкомата большого объема, чтобы минимизировать передачу данных). Когда Apk становится слишком большим, начните с маленького Apk, и все переместится в другую банку (импортируйте 2 баночки). Вам нужно сбалансировать усилия по кодированию, пользовательский интерфейс, удобство обслуживания, поддержку, пропускную способность, правила Android, правила хранения файлов (если эти слова существуют, O)).

ПРИМЕЧАНИЕ Dalvik прекращен

Преемником Dalvik является Android Runtime (ART), в котором используются одни и те же файлы байт-кода и .dex(но не .odex файлы), причем преемственность направлена ​​на повышение производительности, прозрачное для конечных пользователей. Новая среда исполнения была впервые включена в Android 4.4 "KitKat" в качестве предварительного просмотра технологии и полностью заменила Dalvik в более поздних версиях; Android 5.0 "Lollipop" - это первая версия, в которой ART является единственной включенной средой исполнения.

Ответ 2

Вы можете попытаться построить несколько apk с тем же sharedUserId и тем же процесс.

Это механизм плагинов, используемый Threema

Изменить: Подробнее о Theema

Threema имеет одно основное приложение и два плагина:

Для этого основное приложение не нуждается в разрешениях для доступа к камере или микрофону