2015-09-24 7 views
3

Наше приложение имеет три dexes в apk, который был построен градиентом с функцией multidex.Как проверить, было ли загружено второе dex завершено или нет после установки моего приложения?

После того, как было установлено приложение,

  1. были главным Dex и второй Dex загружается одним и тем же загрузчик классов?

  2. Как проверить, завершено ли второе (classes2.dex) и третье, или нет? Могу ли я проверить его в коде динамически?

  3. Или вы можете представить какой-либо связанный документ о процедуре загрузки класса (или dex) в Android? Я не знаком с этим.

спасибо.

+0

Там есть ресурс здесь: https://developer.android.com/tools/building/multidex .html –

+0

Кроме того, это зависит от того, используете ли вы АРТ (по умолчанию для API20 +) или Dalvik (по умолчанию вплоть до API19). –

+1

Для второго вопроса я прочитал ClassLoader.java и обнаружил, что я могу проверить, был ли класс class во 2-й dex загружен ClassLoader # findLoadedClass() с отражением. – Zachary

ответ

2

я не копал в код ART, но вы можете прочитать, что поддержка Lib Multidex делает для Dalvik here:

  1. Да. Классы во всех dexes загружаются одним и тем же ClassLoader. При загрузке вашего приложения, то MultiDex приборов:
    • извлекает дополнительные файлы DEX из .apk и помещает их в своих собственных файлах .zip в каталоге данных (так что они неотличимы от APK, к ClassLoader),
    • Получает ClassLoader из контекста вашего приложения и добавляет эти новые .zip-файлы в список, который ClassLoader знает об этом.

Не только отдельные dexes загружены одним и тем же ClassLoader, они загружаются тем же ClassLoader, который будет использоваться без MultiDex.

  1. Дополнительные указатели должны устанавливаться автоматически при загрузке приложения. Непросто проверить этот код, но вы можете проверить его локально, проверив журналы для вашего устройства.

  2. Есть Android docs about the architecture of ART and Dalvik. Но, нет ничего лучше, чем чтение источника :)

+0

Спасибо, что ответите Фабиану! У меня все еще есть вопрос, наше приложение имеет два процесса с именем UI процесса и процесса обслуживания. Являются ли их загрузчики классов одинаковыми? Если нет, возможно, один класс будет загружен дважды? – Zachary

+0

@ Отдельные процессы Zachary в пределах одного APK полностью изолированы друг от друга. Поэтому классы в вашем процессе «пользовательского интерфейса» и ваш «сервис» не знают друг друга. «Приложение» будет создано для каждого процесса, что означает, что поддержка нескольких приложений будет установлена ​​для обоих процессов. Оба процесса будут использовать один и тот же тип Classloader, но они будут разными экземплярами и полностью не будут знать друг друга. Имеет ли это смысл? –

+0

да, это имеет смысл. Так возможно ли, что один класс будет загружен дважды, поскольку эти два процесса относятся к одному приложению? Один vm для одного процесса, поэтому один класс будет загружаться отдельно в каждом процессе, это It? – Zachary