Подтвердить что ты не робот

Предупреждения 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, добавил ее в качестве библиотеки проектов и добавил зависимость для обоих модулей. Это ничего не решило, предупреждение сохраняется, и я не понимаю, почему.

Я знаю, что эти предупреждения ничего не влияют, но чистая сборка - это счастливая сборка!

4b9b3361

Ответ 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, чтобы игнорировать предупреждения