ProGuard: Định nghĩa trùng lặp của lớp thư viện?


83

Tôi chạy ProGuard cho dự án Android của mình và nhận được các cảnh báo sau:

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.

Tôi tìm thấy ở đây để khắc phục điều này bằng cách bỏ qua nó với:

-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-keep class android.net.http.** { *; }
-dontwarn android.net.http.**

Tôi không thấy cách nào để xóa các bản sao khỏi các thư viện đã sử dụng. Ngay cả sau khi sử dụng dontwarncác cảnh báo không biến mất.

Đây có phải là cách đúng đắn để xử lý cảnh báo này khi chỉ phớt lờ nó hay điều này có thể dẫn đến vấn đề?


Có vẻ như bạn đã nhập một số lớp từ nhiều thư viện. bạn có thể thêm jar thư viện android vào bên trong cấu hình proguard
Adem

1
Bạn có thể vui lòng đăng một ví dụ cho điều đó. Android plrguard def nói rằng bạn không nên sử dụng: libraryjars. Xem: proguard.sourceforge.net/manual/…
confile

đăng progaurdtệp quy tắc của bạn
NJ

@confile bạn đã giải quyết được vấn đề của mình chưa?
NickUnuchek

Tôi đã giải quyết điều này bằng cách xóa thư viện apache khỏi dự án của mình và thay thế bằng mã của riêng tôi.
ban-geoengineering

Câu trả lời:


96

Nếu bạn thêm tùy chọn proguard, -printconfiguration config.txtbạn sẽ thấy thêm proguard

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

-libraryjars 'D: \ tools \ android \ platform \ android-23 \ option \ org.apache.http.legacy.jar'

các lớp trùng lặp của bạn (ví dụ: SslError) được trình bày trong cả android.jar và org.apache.http.legacy.jar

Proguard thêm jar thứ hai ngay cả khi bạn không useLibrary 'org.apache.http.legacy' Đây là một lỗi mở mô tả sự cố.

Vì vậy, bây giờ chúng tôi không thể làm bất cứ điều gì với vấn đề. Chỉ cần bỏ qua nó:

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

Không cần phải giữ các lớp miễn là chúng nằm trong thư viện jar (thực tế là thư viện của điện thoại). dontwarn không hoạt động bởi vì nó không phải là một cảnh báo, nó là một ghi chú.


6
Tuyệt quá! Cảm ơn. Câu trả lời này phải được đánh dấu là câu đúng!
Radim Vaculik

Chỉ cần cố gắng đặt useLibrary 'org.apache.http.legacy'trong build.gradle và đặt của bạn -dontnotevào tệp proguard. Nhưng vẫn nhận được vấn đề. Tôi đã sử dụng api 22, hoạt động tốt. Bây giờ tôi nâng cấp lên 23, tôi gặp phải những lỗi này khi cố tạo bản đã ký. Một số lần điểm làm việc vô thời hạn. Không biết phải làm gì khác.
wviana

Nơi tôi thêm tùy chọn này proguard option -printconfiguration config.txt?
MML

Trong dòng lệnh bạn đã chạy proguard. Tập tin config.txt sẽ được tạo tại thư mục hiện tại
Flavio

6

Có thể, bạn đã đề cập đến "-injars" và -libraryjars "trong proguard-project.txt của mình, xem xét hệ thống xây dựng mới nhất sẽ quan tâm đến việc đề cập đến chúng cho bạn .. vì vậy bạn không cần phải đề cập lại.

nguồn: http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass

Tôi nghĩ điều này sẽ giúp ích. :)


1
Chà, tôi đang sử dụng Android Studio khá mới (bản dựng ngày 1 tháng 12 năm 2015) và không ai quan tâm đến việc nhắc đến chúng cho tôi. Tôi đang thiếu một cái gì đó đơn giản?
aasu

1

Bạn có thể yêu cầu gradle không cho phép các lớp trùng lặp (chỉ lấy lớp đầu tiên) bằng cách thêm phần sau vào build.gradle của bạn:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
Build.gradle nào? dự án hoặc ứng dụng? nếu ứng dụng, bạn đặt nó dưới khối nào? tôi đã cố gắng đặt nó trong build.gradle khối android ứng dụng của tôi android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }, nhưng tôi nhận được lỗi Lỗi: Phương pháp Gradle DSL không tìm thấy: 'jar ()'
Edijae Crusar

jar {là một nhiệm vụ trong plugin gradle java, vì vậy nếu bạn apply plugin: 'java'thì bạn sẽ có thể sử dụng khối jar đó; nó không đi vào bên trong một khối khác; nó ở cấp cơ sở của build.gradle. ( xem tài liệu gradle này ) Tôi đã sử dụng nó trong một ứng dụng, nhưng không chắc liệu điều đó có quan trọng không.
voxoid

-7

Bạn có thể thử điều này trong build.gradle của mình cho mọi thứ được chỉ ra là trùng lặp trong nhật ký. Tôi không chắc liệu điều này có hiệu quả hay không, vì vậy hãy dùng thử và thông báo nếu nó hoạt động hay không.

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.