Intereting Posts
Как использовать ClickableSpan, но игнорировать клики из TextView Воспроизведение зашифрованного видео с помощью ExoPlayer LibGDX и ScrollPane с несколькими виджетами Как я могу правильно вызвать startIntentSenderForResult в службе? Как использовать сервис Google для преобразования текста в речь для китайских иероглифов на Android? Android: как получить строку в определенной локали БЕЗ изменения текущей локали Обновлен Android ADT, теперь возникают ошибки Fix Android (Studio) Вход Активность Шаблон сгенерированной активности Как показать номер пропущенного вызова в режиме блокировки? Волейбол, не вызывающий getParams () для стандартного запроса POST Изменение и применение темы во время выполнения в Android Android ViewPager Пред. / Следующая кнопка Альтернатива CATiledLayer для Android? Работает ли jFreeChart / дополняет приложение Android 2.x Поддерживает ли браузер Android 2.1 HTML 5 и какой видеоформат он воспроизводит?

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

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

подробность

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

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

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

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

Задний план

Здесь есть возможность « проблемы XY », поэтому я лучше объясню фон.

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

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

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

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

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

Этот учебник является хорошим началом для внешней загрузки файлов 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
Протестировано нормально . Копирует com.example.toastlib.jar из SD-карты во внутреннее хранилище приложений [outdex / dex], (не папка с активами). (Вы должны прочитать файл README.md в проекте для его создания).

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

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

В: Внешний файл имеет неправильные разрешения.
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 является единственной включенной средой исполнения.

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

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

Изменить: Больше о Theema

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

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