प्रॉपर का उपयोग करते समय किसी विशेष पैकेज पथ को कैसे रखें / बाहर रखें?


110

मैं ProGuard से कुछ फ़ाइल पथों को बाहर करना चाहता हूं। उदाहरणcom.myapp.customcomponents

मैं यह कैसे कर सकता हूँ? इस निर्देशिका में मेरे पास मौजूद हर एक कस्टम कंपोनेंट फ़ाइल के लिए -स्टिग-फ्लैग रखने से मुझे नफरत है।

मैंने निम्नलिखित कोशिश की है, लेकिन यह काम नहीं करता है:

-keep public class com.myapp.customcomponents.*

जवाबों:


241

आप निर्दिष्ट नहीं करते हैं कि यह किस तरह से काम नहीं करता है। आपका कॉन्फ़िगरेशन निर्दिष्ट पैकेज में सभी सार्वजनिक वर्गों के नाम रखता है:

-keep public class com.myapp.customcomponents.*

निम्नलिखित कॉन्फ़िगरेशन निर्दिष्ट पैकेज और इसके उप-पैकेजों में सभी सार्वजनिक वर्गों के नाम रखता है:

-keep public class com.myapp.customcomponents.**

निम्नलिखित विन्यास सभी सार्वजनिक / संरक्षित वर्गों / क्षेत्रों / विधियों के नाम निर्दिष्ट पैकेज और उसके उप-पैकेजों में रखता है:

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
डबल तारांकन (**) अब और संकलन नहीं करता है (एंड्रॉइड स्टूडियो 4.0)
डैनियल

1
एंड्रॉइड स्टूडियो 4.x दोहरे तारांकन (**) के लिए "अनारक्षित वर्ग नाम" आदि जैसी त्रुटियां दिखाएगा, लेकिन यह उम्मीद के मुताबिक काम करेगा।
महमूदुल हसन शोहग

इसकी नियत और आगामी रिलीज
shadygoneinsane

55

अपने ProGuard कॉन्फ़िगरेशन के नीचे निम्न पंक्ति जोड़ें:

-keep class com.facebook.** { *; }

तदनुसार पैकेज का नाम बदलें, यहां पैकेज com.facebookको प्रोगार्ड से बाहर रखा जाएगा।


13
क्यों रखते हैं और फेवरवार एक साथ उपयोग करते हैं
जोंगज़ पुंगपुत

@ जोंगज़ पुंगपुट, अगर मैं सही हूं - यदि ऐप कॉम.फेसबुक पैकेज का उपयोग नहीं करता है, तो बिल्ड पर ध्यान दिया जाएगा "कॉन्फ़िगरेशन अज्ञात वर्ग को संदर्भित करता है ..."। -dontwarn इस नोट को निष्क्रिय करें।
यूरा शिंकरेव

14
क्या { *; }मतलब है?
मुहम्मद बाबर

15
@ मुहम्मदबाबर का मतलब है हर सदस्य, तरीका, हर दायरे में क्लास, हर चीज में!
उमर एल डॉन

1

बहुत से लोग -keep class com.myapp.customcomponents.** { *; }एक रास्ते को संसाधित करने से बाहर करने के तरीके के रूप में सुझाते हैं। यहाँ देखें:

  1. पैकेज को प्रोगार्ड से बाहर करें
  2. पैकेज को पूरी तरह से अनदेखा करें
  3. एक निर्देशिका को पहरेदारी से रोकें

इस समाधान के साथ समस्या यह है कि अभी भी कुछ स्तर की गड़बड़ी हो रही है, जो आपके कोड को तोड़ सकती है। आप मैपिंग प्रिंट आउट में मैपिंग देख सकते हैं:

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

समाधान मैंने चुना है एक दो कदम प्रक्रिया है। सबसे पहले, injarsपैकेज पथ का चयन करने के लिए एक फिल्टर के साथ उपयोग करना चाहूंगा। पुस्तकालयों के रूप में अन्य पैकेज पथों को जोड़ना संभव है।

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

दूसरा, संसाधित जार को मूल जार के साथ मिलाएं, लेकिन केवल उन रास्तों को छोड़ दिया गया था जिन्हें छोड़ दिया गया था।

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

परिणाम एक मर्ज किया गया जार है जो संसाधित पैकेज पथ और स्किप किए गए पथ का संयोजन है। यह अभ्यास अमान्य है, यदि कोई व्यक्ति कुछ रास्तों के प्रसंस्करण को पूरी तरह से छोड़ने का एक तरीका प्रदान कर सकता है (जो मुझे नहीं मिला है)।


1

एंड्रॉइड स्टूडियो 4.0 का उपयोग करके मेरे लिए क्या काम किया गया है:

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

अन्य उत्तरों में डबल तारांकन (**) मेरे लिए काम नहीं किया। मैंने R8 के साथ उपरोक्त विन्यास की भी कोशिश की, ठीक काम करता है।


यह उत्तर मुझे लगता है कि आज तक का जवाब है। धन्यवाद।
गोगो-ए-बिल्ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.