#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