Что происходит при установке apk, скомпилированного для Lollipop, на устройствах до Lollipop?

#android #dalvik #android-multidex

#Android #dalvik #android-multidex

Вопрос:

В моем приложении более 64 тысяч методов.

Когда я нажимаю кнопку «Выполнить», а устройство, выпущенное до Lollipop, подключается к 4d, я получаю ошибку метода 64k.

Когда я нажимаю кнопку «Выполнить» и подключается устройство Lollipop или более поздней версии, apk создается.

Что происходит, когда я устанавливаю этот apk на устройство до Lollipop? он работает нормально, но рискованно ли это?

Ответ №1:

В моем приложении более 64 тысяч методов.

Если ваше приложение имеет более 64 тысяч методов и вы хотите запустить его на устройствах, выпущенных до Lollipop, вам необходимо включить Multidex. В противном случае произойдет то, что ваш код будет скомпилирован в несколько DEX-файлов (например, classes.dex, classes2.dex, classes3.dex и т.д.), Но устройство до Lollipop загрузит только первый DEX-файл и проигнорирует классы во вторичных DEX-файлах.

Что происходит, когда я устанавливаю этот apk-файл на устройство, выпущенное до lollipop?

Установка будет успешной. Вы можете увидеть предупреждающие сообщения о том, что «классы не проходят проверку» в logcat, но установка все равно будет успешной.

он работает нормально, но рискованно ли это?

Он не будет работать нормально. Приложение может запуститься и даже работать некоторое время, но как только система попытается загрузить класс, который был упакован в один из вторичных файлов DEX, приложение завершит работу с ClassNotFoundException . Это может произойти сразу, если Activity или Service , который вы пытаетесь открыть, использует один из указанных классов, но также может произойти позже, когда вы используете некоторый путь кода, для которого требуется один из них.

В любом случае, лучшим решением является использование ProGuard или аналогичного инструмента для устранения неиспользуемого кода и доведения вашего приложения до предела 64 КБ. Если это не сработает, единственный другой вариант — следовать инструкциям и рекомендациям в официальном руководстве, чтобы продолжить поддержку устройств, выпущенных до Lollipop.

Ответ №2:

Используйте MultiDex, если у вас есть метод более 64 КБ.

Добавьте многодексную зависимость в build.gradle.

 compile 'com.android.support:multidex:1.0.1'
  

внутри defalutConfig добавить

 multiDexEnabled true
  

Внесите изменения в манифест:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>
  

Если вы внесли вышеуказанные изменения, перейдите по этой ссылке

Комментарии:

1. Это был не вопрос.

2. Я пытаюсь избежать multidex, и в любом случае вопрос был не о multidex