प्रोगार्ड: लाइब्रेरी क्लास की डुप्लिकेट परिभाषा?


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चेतावनी का उपयोग करने के बाद भी गायब नहीं होता है।

क्या इस चेतावनी को संभालने का यह सही तरीका है कि इसे अनदेखा किया जाए या इससे समस्याएं पैदा हो सकती हैं?


ऐसा लगता है कि आपने कई लाइब्रेरी से कुछ कक्षाएं आयात की हैं। आप प्रोफ़िगर कॉन्फिगरेशन के अंदर android लाइब्रेरी जार जोड़ सकते हैं
Adem

1
क्या आप इसके लिए एक उदाहरण पोस्ट कर सकते हैं। एंड्रॉइड प्लेगार्ड डीफ का कहना है कि आपको उपयोग नहीं करना चाहिए: लाइब्रेरीजर्स। देखें: proguard.sourceforge.net/manual/...
confile

अपनी progaurdनियम फ़ाइल
NJ

@confile क्या आपने अपना मुद्दा हल किया?
निकुंचे

मैंने अपनी परियोजना से अपाचे पुस्तकालय को हटाकर अपने कोड के साथ प्रतिस्थापित करके इसे हल किया।
प्रतिबंध-जियोइंजीनियरिंग

जवाबों:


96

यदि आप एक रक्षक विकल्प जोड़ते हैं, तो आप -printconfiguration config.txtदेख सकते हैं कि वह रक्षक है

-लॉगर्सजर्स डी: \ टूल्स \ एंड्रॉइड \ प्लेटफार्मों \ एंड्रॉइड -23 \ android.jar

-लूजर्स के डी: \ टूल्स \ एंड्रॉइड \ प्लेटफॉर्म \ एंड्रॉइड -23 \ वैकल्पिक \ org.apache.http.legacy.jar '

आपके डुप्लिकेट किए गए वर्ग (जैसे SslError) दोनों android.jar और org.apache.http.leg2.jar में प्रस्तुत किए जाते हैं

यदि आप useLibrary 'org.apache.http.legacy' यहां नहीं हैं तो भी गार्ड दूसरा जार जोड़ता है , समस्या का वर्णन करने वाला एक खुला बग है।

इसलिए अब हम इस मुद्दे पर कुछ नहीं कर सकते। बस इसे नजरअंदाज करें:

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

जब तक वे लाइब्रेरी जार (फोन की लाइब्रेरी वास्तव में) में स्थित हैं तब तक कक्षाओं को रखने की कोई आवश्यकता नहीं है। नॉटवरन काम नहीं करता है क्योंकि यह चेतावनी नहीं है, यह एक नोट है।


6
महान! धन्यवाद। इस उत्तर को सही के रूप में चिह्नित किया जाना चाहिए!
रेडिम वैकुलिक

बस build.gradleuseLibrary 'org.apache.http.legacy' में जगह बनाने और अपने -dontnoteको गार्ड फ़ाइल में रखने की कोशिश की । लेकिन फिर भी समस्या हो रही है। मैं एपी 22 का उपयोग कर रहा था, ठीक काम कर रहा था। अब मैं 23 में अपग्रेड करता हूं, मुझे साइन करने की कोशिश करते समय ये त्रुटियां हो रही हैं। कुछ समय ग्रेड अनिश्चितकालीन के लिए काम करता है। पता नहीं और क्या करना है।
विएना

मैं इस विकल्प को कहां जोड़ूं proguard option -printconfiguration config.txt?
एमएमएल

कमांड लाइन में आप प्रॉपर चला रहे थे। Config.txt वर्तमान फ़ोल्डर में बनाया जाएगा
Flavio

6

संभवतः, आपने अपने प्रॉपर-प्रोजेक्ट.टेक्स्ट में "-injars" और -libraryjars का उल्लेख किया है, नवीनतम बिल्ड सिस्टम पर विचार करने के बाद उन्हें आपके लिए उल्लेख करने का ध्यान रखता है। फिर भी आपको इसे फिर से उल्लेख करने की आवश्यकता नहीं है।

स्रोत: http://proguard.sourceforge.net/manual/troublesourcing.html#duplicateclass

मुझे लगता है कि इससे मदद मिलेगी। :)


1
खैर, मैं एक बहुत नए एंड्रॉइड स्टूडियो (1 दिसंबर, 2015 का निर्माण) पर हूं और कोई भी मेरे लिए उनका उल्लेख करने का ध्यान नहीं रखता है। क्या मुझे कुछ सरल याद आ रहा है?
आसू

1

आप अपने बिल्ड.gradle में निम्न जोड़कर डुप्लिकेट कक्षाओं (केवल पहले लेने के लिए) की अनुमति नहीं दे सकते हैं:

jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

1
कौन सा बिल्ड.ग्रेड? परियोजना या अनुप्रयोग? यदि ऐप है, तो आप इसे किस ब्लॉक में रखते हैं? मैंने इसे अपने ऐप के बिल्ड.ग्रेडल एंड्रॉइड ब्लॉक में डालने की कोशिश की है, android{jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE } }लेकिन मुझे त्रुटि मिलती है : ग्रेडल डीएसएल विधि नहीं मिली: 'जार ()'
एडिजे क्रूसर

jar {ग्रेड जावा प्लगइन के भीतर एक कार्य है, इसलिए यदि आप apply plugin: 'java'तब उस जार ब्लॉक का उपयोग करने में सक्षम होना चाहिए; यह दूसरे ब्लॉक के अंदर नहीं जाता है; यह build.gradle के मूल स्तर पर है। ( इस ग्रेडल डॉक देखें ) मैंने इसे एक ऐप में इस्तेमाल किया था, लेकिन निश्चित नहीं है कि क्या मायने रखता है।
voxoid

-7

आप इसे अपने build.gradle में उन सभी चीज़ों के लिए आज़मा सकते हैं जिन्हें लॉग में डुप्लिकेट के रूप में दर्शाया गया है। मुझे यकीन नहीं है कि यह काम करेगा, इसलिए इसे आज़माएं और सूचित करें कि यह काम करता है या नहीं।

packagingOptions {
        exclude 'android.net.http.SslCertificate'
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.