9

Недавно я обнаружил новую функциональность MultiDex от Android для работы с приложениями, имеющими более 65 000 ссылок. См: https://developer.android.com/tools/building/multidex.htmlAndroid MultiDex - вопросы о внутренних работах

Может кто-то помочь мне понять следующие вопросы:

1) Как Gradle построить плагин определить, что поместить в основной файл Dex (classes.dex) против вторичных тны файлов? На основе документа есть определенные вещи, которые должны быть в первичных dex, но это не дает никаких примеров. Требуются ли все действия в основном файле dex?

Цитируется Текст:

Есть сложные требования относительно того, какие классы необходимы в первичный файл Dex при выполнении во время выполнения Dalvik. Обновления оснастки для Android поддерживают требования Android, но возможно, что в других включенных библиотеках есть дополнительная зависимость , включая использование интроспекции или вызов Java методов из собственного кода. Некоторые библиотеки могут быть недоступны для использования до тех пор, пока средства сборки multidex не будут обновлены, чтобы вы могли указать классы , которые должны быть включены в основной файл dex.

2) При создании только для Android API уровня 21 (Android L) и выше в плагине Build Gradle существует другое поведение. Он говорит, что он намного быстрее, потому что он «Создает каждый модуль приложения (включая зависимости) в виде отдельных файлов dex. Это обычно называют предварительным расширением». Что такое определение модуля в Android? Является ли это библиотекой Java, библиотекой Android и Android-приложениями, упомянутой здесь: http://developer.android.com/sdk/installing/studio-build.html#projectModules? Удаленные или локальные двоичные зависимости (например, Jars) считаются отдельными модулями и, таким образом, попадают в другой файл dex или они включаются в модуль в зависимости от них?

ответ

4

1) Плагин gradle внутренне использует Proguard для создания двух файлов jar в папке сложениями intermediates/multi-dex. Один из них будет основным dex, остальные будут распределены по dex 2, 3 и т. Д.

Задача collect{variant}MultiDexComponents отвечает за создание файла keep for proguard, вы можете видеть этот файл и другие параметры proguard, используемые в варианте специфический подкаталог папки, упомянутой выше. Надеюсь, это будет настраиваться в долгосрочной перспективе.

В настоящее время существует ошибка, связанная с тестовыми проектами в 1.0.0-rc1 плагина gradle (https://code.google.com/p/android/issues/detail?id=80741). С некоторыми небольшими изменениями обходной путь, который я разместил там, также может быть использован для добавления ваших собственных записей в список удержания (таким образом, чтобы ваши классы попадали в первичный dex) прямо сейчас.

2) Модули относятся к модулям с точки зрения Gradle, но это действительно могут быть разные элементы, упомянутые в списке, к которому вы привязались. Если вы выполняете построение градиента pre-lollipop из командной строки с --info в качестве флага, вы можете видеть все файлы dex, передаваемые в dx. (Обратите внимание, что это не должно быть multidex enabled build или одно с preDexLibraries = false).

+0

Отличный ответ. Всегда ли выполняются действия в первичной директории на основе задачи «MultiDexComponents»? – AnDev123

+0

Еще один вопрос: эта функция пытается получить количество методов чуть ниже предела, поэтому методы во вторичных файлах dex как можно меньше? Aka Умеет ли он в отношении количества методов, которые он удаляет? – AnDev123

+0

В нем хранятся * только * классы, указанные в списке хранения в первом банке/dex. В моем файле сохранения я вижу, что это, по крайней мере, все действия, службы, BackupAgents и ваше приложение, а также аннотации. – thoutbeckers

12

Что размещается в main-dex?

Есть три последовательные задачи, которые вычисляют, какие классы должны быть упакованы в основной DEX:

Отобрать {вариант} MultiDexComponents задач

Эта задача записывает имена классов всех компонентов приложения (приложение, действия, службы, получатели, поставщики) в текстовый файл в соответствии с манифестом. То есть, если у вас есть компонент, который не зарегистрирован в манифесте, он не будет помещен в main-dex. И есть другие неявные классы - например, аннотации. Чтобы увидеть полный список, зайдите в задачу CreateManifestKeepList.groovy в источниках плагинов.
Результатом этой задачи является файл manifest_keep.txt.

термоусадочного {вариант} MultiDexComponents задача

Эта задача вызывает ProGuard создать термоусаживаемую банку только с классами, которые упоминаются в manifest_keep.txt файла.
Результатом этой задачи является файл componentClasses.jar.

создать {вариант} MainDexClassList задача

Эта задача принимает файл componentClasses.jar, и для каждого класса вычисляет прямую иерархию ссылок (для получения дополнительной информации см implementation). То есть, если один из ваших классов компонентов имеет поле типа X, то этот класс X будет добавлен в список main-dex.
Результатом этой задачи является файл maindexlist.txt, который включает в себя список всех классов, которые будут упакованы в основной файл dex.

Что произойдет, если мой minSdk равен 21?

Ни одна из вышеперечисленных задач не выполняется, если ваша версия minSdk равна 21 - не требуется вычисление списка основных деексов. Это связано с тем, что в ART все файлы dex были преобразованы в один файл .oat во время установки приложения. И поэтому не требуется исправление ClassLoader во время выполнения.

Смежные вопросы