Предупреждения Proguard "не могут писать ресурс [META-INF/MANIFEST.MF] (Дублирование записи в zip)"
Я использую IntelliJ и запускаю Proguard в режиме отладки, но я не могу избавиться от таких предупреждений, как:
ProGuard: [MyApplication] Warning: can't write resource [META-INF/MANIFEST.MF]
(Duplicate zip entry [android-support-v13.jar:META-INF/MANIFEST.MF])
В этом проекте имеется несколько модулей и android-support-v13.jar
используется на 2 из них. Я подумал, что это проблема, поэтому я удалил эту библиотеку из папки libs, добавил ее в качестве библиотеки проектов и добавил зависимость для обоих модулей. Это ничего не решило, предупреждение сохраняется, и я не понимаю, почему.
Я знаю, что эти предупреждения ничего не влияют, но чистая сборка - это счастливая сборка!
Ответы
Ответ 1
Возможно, проблема "proguard.cfg". Включает ли он какие-либо "-инджары"? Если ваш проект включает в себя другой проект в качестве библиотеки, банки могут обрабатываться дважды. Не могли бы вы разместить свой proguard.cfg?
Выдержка из http://proguard.sourceforge.net/index.html#manual/troubleshooting.html:
Ваши входные баночки содержат несколько файлов ресурсов с тем же именем. ProGuard продолжает копировать файлы ресурсов, как обычно, пропуская любые файлы с ранее использованными именами. Еще раз предупреждение может быть указание какой-либо проблемы, поэтому, поэтому рекомендуется удалить дубликаты. Удобный способ сделать это - указать фильтры на входные банки. Невозможно отключить эти предупреждения.
ВАРИАНТ № 1:
Как вы не можете опубликовать свои "-injars", проверьте, включают ли они "android-support-v13.jar" или библиотеку, включенную в ваш проект, которая также включает в себя "android-support-v13.jar".
Предполагая, что вы строите с помощью Ant внутри IntelliJ IDEA, вы не должны добавлять опции -injars, -outjars или -libraryjars; Ant script уже делает это для вас.
ВАРИАНТ № 2:
Хотя предупреждения безобидны, чистая сборка - это счастливая сборка, поэтому попробуйте:
http://www.dancartoon.com/2012/01/14/fixing-proguard-warning-cant-write-resource-meta-infmanifest-mf/
и
https://gist.github.com/paulpv/4439012
ВАРИАНТ № 3:
Включить (!META-INF/MANIFEST.MF)
после каждой команды '-injars'
-injars library.jar(!META-INF/MANIFEST.MF)
ОПЦИЯ № 4: Дублирующее определение Android Proguard
Исправлено это, переместив сторонние библиотеки в другой каталог, в мой случай "lib". Затем добавили
-injars lib/jmdns.jar
в файл proguard.cfg.
ВАРИАНТ № 5: Android - ошибка повторной записи zip-защиты Proguard
Если ваш конфигурационный файл Proguard содержит следующую строку, удалите его:
-injars bin/classes
ОПЦИЯ # 6: Android obfuscate приложение с использованием proguard поддерживает обфускацию библиотечных банок - или это?
Я нашел еще один способ сделать баннеры библиотеки Proguard в одиночку для попросите его сохранить имена своих пакетов, например:
-keep class javax. ** {*; } -keep class org. ** {*; } -keep class twitter4j. ** {*; }
ВАРИАНТ № 7:
Странное решение (удаление папки META-INF в папке src) на что-то похожее здесь.
Ответ 2
Я использовал packagingOptions
с exclude
в build.gradle
, и у меня такие же проблемы с вами.
Вы можете исправить это, используя это.
packagingOptions {
pickFirst 'META-INF/services/javax.annotation.processing.Processor'
pickFirst 'META-INF/DEPENDENCIES.txt'
pickFirst 'META-INF/DEPENDENCIES'
pickFirst 'META-INF/LICENSE.txt'
pickFirst 'META-INF/LICENSE'
pickFirst 'META-INF/NOTICE.txt'
pickFirst 'META-INF/NOTICE'
pickFirst 'META-INF/LGPL2.1'
}
Замените pickFirst
на exclude
.
Ответ 3
Лучшим решением, которое я нашел, было скопировать цель -обфуспинг из /tools/ ant/build.xml в ваш проект custom_rules.xml. Затем нужно изменить только один блок:
<pathconvert property="project.all.classes.value" refid="project.all.classes.path">
<firstmatchmapper>
<regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"(!META-INF/MANIFEST.MF)'/>
<identitymapper/>
</firstmatchmapper>
</pathconvert>
Единственный добавленный бит - (!META-INF/MANIFEST.MF)
. Это исключает все файлы манифеста, которые в любом случае не будут скопированы в окончательный APK.
Ответ 4
Не ссылайтесь на библиотеку поддержки, вставляя ее банку напрямую; когда вы это делаете, система сборки не может устранить неоднозначность между несколькими версиями, и вы получаете ошибки этого типа. Включите его, указав его координаты Maven:
зависимости { compile 'com.android.support:support-v13:X.X.X'
}
где X.X.X - это правильный номер версии, основанный на том, с каким API вы компилируете. Если вы включите эту зависимость через пользовательский интерфейс в структуре проектa > (ваш модуль) > "Зависимости" > "Кнопка" > "Зависимость от библиотеки", это поможет вам выбрать правильный номер версии.
Вам также может быть удобно включать другие зависимости через координаты Maven вместо того, чтобы спорить с их банками; тот же пользовательский интерфейс зависимостей библиотеки имеет функцию поиска, которая поможет вам найти библиотеки.
обязательно удалите эту библиотеку из libs или любой другой папки, в которой она находилась внутри
Ответ 5
добавить -dontwarn
в proguard.cfg, чтобы игнорировать предупреждения