Intereting Posts
Публикация приложения в PlayStore как организации? Fiddler – расшифровать Android HttpsUrlConnection SSL-трафик Как узнать, вызвана ли операция с помощью startActivityForResult или просто вызвана с помощью startActivity? Применение stateListAnimator в элементе RecylerView вызовет мерцающий эффект при вызове notifyDataSetChanged Android: что лучше, разработать приложение для Android на Mac или Windows-ПК? Android в Eclipse: копирование / вставка из LogCat (только «текст») Универсальный загрузчик изображений roundedBitmapDisplayer Установите ориентацию телефона, но установите ориентацию экрана на портрет Кнопка «Назад» и последняя активность Android BottomSheet как рухнуть при нажатии на внешнюю сторону? Не запускать приложение Auto при запуске через андроид-студию Создание тестовых зависимостей при использовании Dagger2 Как отключить чертеж украшения элемента RecyclerView для продолжительности анимации элементов Как по умолчанию я использую цифровую клавиатуру на EditText без принудительного ввода цифр? Не удалось найти свойство «xxxx» на com.android.build.gradle.AppExtension_Decorated

Не удается создать несколько файлов Android dex с Ant с внешних банок

Я разрабатываю приложение для Android, которое требует нескольких библиотек (для Facebook, Google Maps v2 и Quickblox среди других), в результате чего количество переполнений метода превышает 64-килобайтный лимит:

Unable to execute dex: method ID not in [0, 0xffff]: 65536 Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536 

Поскольку я не могу обойтись без какой-либо из этих библиотек, я искал решение для ошибки ограничения метода. Я нашел популярную запись в блоге от разработчиков Android, где рекомендуется разделение исходного кода. (Запись в блоге, о которой я говорю, можно найти здесь: http://android-developers.blogspot.com.es/2011/07/custom-class-loading-in-dalvik.html ). Я пробовал это решение без успеха.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что самый большой объем кода не в самом моем приложении, а в необходимых библиотеках, поэтому мне приходится распространять эти библиотеки среди разных файлов dex, которые я должен загрузить в своем приложении. Мои знания об Ant очень ограничены, и то, что я хотел бы знать, – это то, что я должен написать в файле build.xml, чтобы сделать dex копией каждой библиотеки, где я хочу:

  <!-- Primary dex to include my source code and some libraries. --> <copy todir="${out.classes.absolute.dir}.1" > <fileset dir="${out.classes.absolute.dir}" > ... </fileset> </copy> <!-- Secondary dex to include some other libraries. --> <copy todir="${out.classes.absolute.dir}.2" > <fileset dir="${out.classes.absolute.dir}" > ... </fileset> </copy> 

Любая помощь будет по-настоящему оценена. Заранее благодарим!

Solutions Collecting From Web of "Не удается создать несколько файлов Android dex с Ant с внешних банок"

Лучший ответ, который я до сих пор слышал по этой проблеме, – использовать ProGuard в оптимизированном режиме (proguard-android-optimize.txt) с флагом -dontobfuscate для удаления неиспользуемых классов и методов из окончательного APK (без обфускации их). Затем вы можете использовать файл proGuard mapping.txt, чтобы помочь вам удалить неиспользуемые классы из используемых JAR-библиотек библиотеки (я не знаю о хорошем инструменте для этого). К сожалению, я не думаю, что в ProGuard есть функция, чтобы сделать это автоматически.

ProGuard работает только при выполнении экспорта в Eclipse, а не при выполнении Run As -> Android Application. Это означает, что это не поможет избежать ограничения на сборку отладки, если вы не используете собственный процесс сборки. Создатель ProGuard предлагает использовать свой коммерческий брат DexGuard , который будет запускаться в Eclipse как для отладки, так и для выпуска.

Использование ProGuard настоятельно рекомендуется для создания релизов, так как это уменьшит размер вашего кода, повысит производительность (например, путем наложения кода) и также запутает ваш источник. Убедитесь, что вы сделали достаточное тестирование в финальной APK, поскольку оно будет сильно отличаться от отладочного. К сожалению, ProGuard сам по себе недостаточно для решения моей проблемы, поэтому я удалил одну из своих зависимостей JAR как обходной путь.

Я проверил количество методов в зависимых JAR с помощью этой команды:

 dx --dex --output=temp.dex library.jar cat temp.dex | head -c 92 | tail -c 4 | hexdump -e '1/4 "%d\n"' 

Примеры номеров методов для наших крупнейших библиотек:

 11222 guava-11.0.1.jar 10452 aws-android-sdk-1.5.0-core.jar 5761 org.restlet.jar 5129 protobuf-java-2.4.1.jar 2499 aws-android-sdk-1.5.0-s3.jar 2024 ormlite-core-4.41.jar 1145 gson-2.2.2.jar 1716 google-http-client-1.11.0-beta.jar 

FYI, вы можете проверить количество методов в APK, используя dexdump (который вы можете найти в папке с build-tools SDK, например «Android Studio.app/sdk/build-tools/21.0.2/dexdump»):

 dexdump -f MyApp.apk | grep method_ids_size method_ids_size : 64295 

В нашем случае мы использовали Guava только для поиска YouTube, поэтому было легко удалить эту зависимость и дать нам больше передышки.

Обновление: я нашел, что самый простой способ удалить неиспользуемый код из больших JAR – использовать dex2jar в моей сборке Proguard, а затем использовать JD-GUI для сравнения этого финального JAR с конкретным входным JAR, который я хотел подрезать. Затем я удаляю пакеты верхнего уровня, которые, как мне известно, удаляются Proguard. Это позволило мне удалить> 8000 методов из aws-android-sdk-1.5.0-core.jar.

ProGuard – инструмент для минимизации исходного кода, он удаляет любые неиспользуемые / дублированные классы при упаковке приложения. Поэтому, даже если вы используете все эти внешние JAR, вы не будете использовать 100% всех классов внутри них, и многие из этих JAR могут иметь одинаковые классы внутри них (например, Log4J и т. Д.).

Proguard встроен в dex . Но он не активируется по умолчанию, вам нужно запустить ant в режиме выпуска, и вам также может потребоваться прокомментировать строку в project.properties.

Скорее всего, ProGuard может удалить некоторые классы, используемые в вашем приложении. Если при компиляции в ProGuard вы получаете ошибки, такие как class X not found , настройте ProGuard в proguard.cfg что вам нужен этот класс:

 -keep public class <full path to the class that you need> 

Просмотрите документацию Android ProGuard и посмотрите, уменьшает ли разрешающая способность proguard размер (классов и методов) в вашем APK.