Ответ 1
Лучшим ответом, который я слышал до этой проблемы, является использование ProGuard в оптимизированном режиме (proguard-android-optimize.txt) с флагом -dontobfuscate
для удаления неиспользуемых классов и методов из окончательного APK (без обфускации их). Затем вы можете использовать файл ProGuard mapping.txt, чтобы помочь вам удалить неиспользуемые классы из используемых JAR-библиотек библиотеки (я не знаю о хорошем инструменте для этого). К сожалению, я не думаю, что в ProGuard есть функция, чтобы сделать это автоматически.
ProGuard работает только при выполнении экспорта в Eclipse, а не при выполнении приложения "Запуск As → Android". Это означает, что это не поможет избежать ограничения на отладочные сборки, если вы не используете собственный процесс сборки. Создатель 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 (который вы можете найти в своей папке SDK build-tools
, например "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.