it-roy-ru.com

ProGuard: дублированное определение класса библиотеки?

Я запускаю ProGuard для своего проекта Android и получаю следующие предупреждения: 

Note: duplicate definition of library class [org.Apache.http.conn.scheme.HostNameResolver]
Note: duplicate definition of library class [org.Apache.http.conn.scheme.SocketFactory]
Note: duplicate definition of library class [org.Apache.http.conn.ConnectTimeoutException]
Note: duplicate definition of library class [org.Apache.http.params.HttpParams]
Note: duplicate definition of library class [Android.net.http.SslCertificate$DName]
Note: duplicate definition of library class [Android.net.http.SslError]
Note: duplicate definition of library class [Android.net.http.SslCertificate]

Note: there were 7 duplicate class definitions.

Я нашел здесь чтобы исправить это, проигнорировав это с помощью: 

-keep class org.Apache.http.** { *; }
-dontwarn org.Apache.http.**
-keep class Android.net.http.** { *; }
-dontwarn Android.net.http.**

Я не вижу способа удалить дубликаты из используемых библиотек. Даже после использования dontwarn предупреждения не исчезают.

Это правильный способ обработки этого предупреждения, просто игнорируя его, или это может привести к проблемам? 

74
confile

Если вы добавите параметр proguard -printconfiguration config.txt, вы увидите, что proguard добавляет 

-libraryjars 'D:\tools\Android\platform\Android-23\Android.jar'

-libraryjars 'D:\tools\Android\платформы\Android-23\необязательно\org.Apache.http.legacy.jar'

ваши дублированные классы (например, SslError) представлены как в Android.jar, так и в org.Apache.http.legacy.jar.

Proguard добавляет второй jar, даже если вы не useLibrary 'org.Apache.http.legacy' Здесь есть open bug , описывающая проблему.

Так что теперь мы ничего не можем сделать с этой проблемой. Просто игнорируй это:

-dontnote Android.net.http.*
-dontnote org.Apache.commons.codec.**
-dontnote org.Apache.http.**

Нет необходимости хранить классы, пока они находятся в библиотеке jar (на самом деле это библиотека телефона). Dontwarn не работает, потому что это не предупреждение, это заметка.

87
Flavio

Возможно, вы упомянули «-injars» и -libraryjars »в вашем proguard-project.txt, учитывая, что последняя система сборки позаботится о том, чтобы упомянуть их для вас ... так что вам не нужно упоминать это снова.

источник: http://proguard.sourceforge.net/manual/troublesho.html#duplicateclass

Я думаю, что это поможет. :) 

6
Sankalp Pandya

Вы можете сказать gradle, чтобы он не разрешал дублировать классы (берите только первый), добавив в свой build.gradle следующее:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
0
voxoid