2015-05-29 10 views
14

का उपयोग कर निजी फ़ील्ड को बाधित करें I Gradle 1.2.3 के साथ AndroidStudio 1.2.1.1 में ProGuard का उपयोग कर रहा हूं।ProGuard

मेरे Gradle की रिहाई का निर्माण इसलिए तरह कॉन्फ़िगर किया गया है:

minifyEnabled true 
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
shrinkResources true 

मैं वर्गों में से निजी क्षेत्रों चाहते हैं समझ से परे जाना है।

यहाँ अब के रूप में मेरे ProGuard कॉन्फ़िग फ़ाइल (कई कोशिशों के बाद) है:

-allowaccessmodification 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-repackageclasses '' 
-verbose 
[...] 

लेकिन मैं अंत में, androdd AndroidGuard से साथ decompiling के बाद, साथ:

private com.google.android.gms.common.api.GoogleApiClient googleApiClient; 

मुझे पता है इस obfuscation का उपयोग सीमित है, लेकिन मुझे googleApiClient का नाम बदलकर ProGuard द्वारा किया जाएगा। ऐसा कैसे करें?

यहां refcard है।

-keepclassmembernames के विपरीत करने का कोई तरीका है?

+0

googleApiClient केवल सुलझे है क्षेत्र या यह सभी क्षेत्रों के लिए समान है? –

+1

मैं इसे सभी निजी क्षेत्रों के लिए पसंद करूंगा। – shkschneider

उत्तर

8

इस से हो रही है: How to tell ProGuard to keep private fields without specifying each field

ProGuard documenation के अनुसार वाइल्डकार्ड किसी भी क्षेत्र से मेल खाता है।

उसमें से ऊपर, आप नकारात्मक (!) का उपयोग कर सकते हैं। (http://proguard.sourceforge.net/#manual/usage.html)

विशेषता नाम?, * और ** वाइल्डकार्ड शामिल कर सकते हैं, और वे से पहले हो सकता है! negator।

मैं इस क्षेत्र में इतना अनुभवी नहीं हूं, बल्कि यह एक अनुमान है, लेकिन एक नई टिप्पणी में लिखना आसान है। कुछ इस तरह काम (नहीं परीक्षण) करना चाहिए:

-keepclassmembers class * { //should find all classes 
    !private <fields>;  
    <methods>; 
    <init>; //and keep every field, method, constructor apart from private fields 
} 

हो सकता है आप इस तरह उपयोग कर सकते हैं, लेकिन यकीन है कि नहीं है कि यह कैसे एक negator पहले साथ काम करता है:

-keepclassmembers class * { //should find all classes 
    !private <fields>;  
    *; //should exclude everything except private fields, which should be obfuscated. 
} 
+0

मैंने '-keepclassmembers क्लास my.package {! निजी का उपयोग किया; संरक्षित ; सार्वजनिक ; ; } 'और जो मैं चाहता था वह मिला: नाम' ए', 'बी', 'सी' आदि वाले फ़ील्ड आदि। मुझे पता था कि इसे नकारात्मक लोगों के साथ करना है, मुझे सही उपयोग के लिए अग्रणी बनाने के लिए धन्यवाद। मैं अपने व्यक्तिगत उपयोग के लिए परिशोधित कर दूंगा, लेकिन यही वह जवाब है जिसे मैं ढूंढ रहा था। – shkschneider

+0

मेरी अंतिम प्रोगार्ड फ़ाइल है जो बग एंड्रॉइड बग # 78377 काम करती है: https://gist.github.com/shkschneider/a1c81780cd1f35a7037d – shkschneider

+0

आपकी प्रतिक्रिया और इनाम के लिए धन्यवाद! मुझे खुशी है कि आपने मेरे संकेतों के आधार पर काम किया, जीथूब डालने के लिए भी धन्यवाद, यह मेरे लिए भी एक अच्छा अनुभव था। – czupe

संबंधित मुद्दे