ProGuard : 라이브러리 클래스의 중복 정의?


84

Android 프로젝트 용 ProGuard를 실행하면 다음과 같은 경고가 표시됩니다.

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경고가 사라지지 않습니다.

이 경고를 무시하고이 경고를 처리하는 올바른 방법입니까, 아니면 문제를 일으킬 수 있습니까?


여러 라이브러리에서 일부 클래스를 가져온 것 같습니다. 당신은 proguard 구성 내부에 안드로이드 라이브러리 jar를 추가 할 수 있습니다
Adem

1
이에 대한 예를 게시 해 주시겠습니까? Android plrguard def에서는 libraryjars를 사용하지 말아야한다고 말합니다. 참조 : proguard.sourceforge.net/manual/...
confile

당신의 게시 progaurd규칙 파일을
뉴저지

@confile 문제를 해결 했습니까?
NickUnuchek

내 프로젝트에서 아파치 라이브러리를 삭제하고 내 코드로 대체하여이 문제를 해결했습니다.
ban-geoengineering

답변:


96

proguard 옵션을 추가하면 proguard가 추가되는 -printconfiguration config.txt것을 볼 수 있습니다.

-libraryjars 'D : \ tools \ android \ platforms \ android-23 \ android.jar'

-libraryjars 'D : \ tools \ android \ platforms \ android-23 \ optional \ org.apache.http.legacy.jar'

중복 된 클래스 (예 : SslError)는 android.jar 및 org.apache.http.legacy.jar 모두에 표시됩니다.

Proguard는 두 번째 병을 추가하지 않더라도 문제를 설명 useLibrary 'org.apache.http.legacy' 하는 공개 버그 입니다.

이제 우리는이 문제에 대해 아무것도 할 수 없습니다. 그냥 무시하세요 :

-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**

라이브러리 jar (실제로 전화의 라이브러리)에있는 한 클래스를 보관할 필요가 없습니다. dontwarn은 경고가 아니기 때문에 작동하지 않습니다. 그것은 메모입니다.


6
큰! 감사. 이 답변은 올바른 답변으로 표시되어야합니다!
Radim Vaculik

그냥 장소 시도 useLibrary 'org.apache.http.legacy'build.gradle 과 장소 -dontnote난독 파일로. 그러나 여전히 문제가 있습니다. 나는 API 22를 사용하고 있었고 잘 작동했습니다. 이제 23으로 업그레이드하면 서명을 빌드하려고 할 때 이러한 오류가 발생합니다. 때때로 등급은 무기한으로 작동합니다. 무엇을 해야할지 모르겠습니다.
wviana

이 옵션을 어디에 추가 proguard option -printconfiguration config.txt합니까?
MML

명령 줄에서 proguard를 실행했습니다. config.txt는 현재 폴더에 생성됩니다
Flavio 2019

6

아마도 proguard-project.txt에서 "-injars"와 -libraryjars "를 언급 하셨을 것입니다. 최신 빌드 시스템이 그들을 언급하는 것을 고려한다면 다시 언급 할 필요가 없습니다.

출처 : http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

나는 이것이 도움이 될 것이라고 생각한다. :)


1
글쎄요, 저는 꽤 새로운 Android Studio (2015 년 12 월 1 일 빌드)를 사용 중이며 아무도 나를 위해 언급하지 않습니다. 나는 단순한 것을 놓치고 있습니까?
aasu

1

build.gradle에 다음을 추가하여 gradle에게 중복 클래스를 허용하지 않도록 지시 할 수 있습니다 (첫 번째 클래스 만 가져옴).

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
어떤 build.gradle? 프로젝트 또는 앱? 앱이라면 어떤 블록 아래에 배치합니까? 난 내 응용 프로그램의 build.gradle 안드로이드 블록에 넣어 시도 android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }하지만 난 오류 얻을 ') 항아리 ('오류 : 찾을 수 없습니다 Gradle을 DSL 방법
Edijae Crusar

jar {gradle java 플러그인 내의 작업이므로 apply plugin: 'java'해당 jar 블록을 사용할 수 있어야합니다. 다른 블록 안으로 들어 가지 않습니다. build.gradle의 루트 수준에 있습니다. ( 이 gradle 문서 참조 ) 앱에서 사용했지만 그게 중요한지 확실하지 않습니다.
복소 이드

-7

로그에서 중복으로 표시된 모든 항목에 대해 build.gradle에서이를 시도 할 수 있습니다. 이것이 작동하는지 확실하지 않으므로 시도해보고 작동하는지 알려주십시오.

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.