2012-10-31 16 views
5

सामान्य मान्यताओं

तो मुझे कोड से लॉग स्टेटमेंट को पट्टी करने के लिए प्रोगार्ड का उपयोग करने के बारे में बहुत कुछ मिला। मूल रूप से सभी -assumenosideeffects $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt config का उपयोग कर चाल करना होगा के साथ एक साथ कहते हैं। मेरी समझ उर्फ ​​मैं doSomeExpensiveStuff() मेरी apk से समाप्त करने के लिए कॉल प्राप्त करने के लिए मान लिया बाईटकोड कि कुछandroid.Log.d कैसे पट्टी करें?

if(Consts.DEBUG) Log.d("",""); 

कर के बराबर है मिल गया था:

android.util.Log.d("Hello","World"+(new Foo().doSomeExpensiveStuff())); 

मेरे कोड

public class MainActivity extends Activity { 
    private class Slooow { 
     @Override 
     public String toString() { 
      // being slow 
      try { 
       Thread.sleep(5000); 
      } catch(InterruptedException e) { 
      } 
      return "bla"; 
     } 
    } 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("tag", "onCreate: " + (new Slooow().toString())); 
    } 
} 

proguard-project.txt:

-repackageclasses '' 
-optimizationpasses 5 
-dontobfuscate 
-assumenosideeffects class android.util.Log { public * ; } 

decompiled डेक्स फ़ाइल

.method public onCreate(Landroid/os/Bundle;)V 
.limit registers 5 
; this: v3 (Lcom/example/test/MainActivity;) 
; parameter[0] : v4 (Landroid/os/Bundle;) 
.line 18 
    invoke-super {v3,v4},android/app/Activity/onCreate ; onCreate(Landroid/os/Bundle;)V 
.line 19 
    const/high16 v0,32515 
    invoke-virtual {v3,v0},com/example/test/MainActivity/setContentView ; setContentView(I)V 
.line 20 
    new-instance v0,java/lang/StringBuilder 
    const-string v1,"onCreate: " 
    invoke-direct {v0,v1},java/lang/StringBuilder/<init> ; <init>(Ljava/lang/String;)V 
    new-instance v1,com/example/test/MainActivity$Slooow 
    const/4 v2,0 
    invoke-direct {v1,v2},com/example/test/MainActivity$Slooow/<init> ; <init>(B)V 
    invoke-virtual {v1},com/example/test/MainActivity$Slooow/toString ; toString()Ljava/lang/String; 
    move-result-object v1 
    invoke-virtual {v0,v1},java/lang/StringBuilder/append ; append(Ljava/lang/String;)Ljava/lang/StringBuilder; 
.line 21 
    return-void 
.end method 

समस्या

अब अगर मैं अपने डिवाइस को यह तैनात है, मैं किसी भी लॉग उत्पादन लेकिन अभी भी 5s नींद (या किसी अन्य देरी या कोड से दुर्घटना नहीं मिलता है कि shouldn ' टी मेरे उपयोगकर्ताओं को परेशान नहीं)। मैं क्या गलत कर रहा हूँ?

इसके अलावा जांच

Log.d("t", "h" + "w");       // would get stripped just fine. 
if(DEBUG) 
    Log.d("t", "h: " + (new Slooow().toString())); // would get optimized away, too. 
Log.d("t", "h" + bundle.toString());    // has just the same problem as described above. 
+0

का सामना करना पड़ा उसी समस्या का सामना करना पड़ा जब मैंने एपीके का उपयोग किया जो 'चींटी रिलीज' कमांड – juned

+0

द्वारा दबाया गया है, इस सवाल के लिए कुछ भी नहीं है एक एप्लिकेशन क्रैश के साथ;) – JesusFreke

उत्तर

0

जब मैं इस सवाल का जवाब पता नहीं है, मुझे विश्वास है कि होने final static boolean DEBUG = falseif(D) { Log.d(...) } में परिणाम होगा पूरी तरह से संकलक

+0

त्वरित उत्तर के लिए एलेक्स धन्यवाद। दुर्भाग्य से यह "ओवरहेड" वांछित नहीं है हालांकि यह बदसूरत sed-scripting के अलावा एकमात्र कामकाज है कि मैं अभी के लिए आ सकता है। (इसके अलावा मुझे समझ में करना चाहते हैं, क्यों ProGuard बिल्कुल परवाह करता है अगर मैं एक निरंतर स्ट्रिंग प्रिंट या अंदर एक आभासी बॉक्स शुरू एक लॉग (,) कहते हैं, जब यह स्पष्ट रूप से किसी भी दुष्प्रभाव को यह विचार करने के लिए नहीं कहा है।) – Giszmo

+0

आह , मैंने सोचा था कि आप सिर्फ लॉगकट आउटपुट को पट्टी करना चाहते हैं, क्षमा करें –

1

यह अभी भी ProGuard तरह लग रहा है के निर्माण पर विचार करता है के द्वारा छीन लिया जा रहा है नया Slooow उदाहरण साइड इफेक्ट होने/होने के लिए। बाईटकोड स्तर है जिस पर ProGuard काम करता है, वहाँ अनिवार्य रूप से कोई अंतर नहीं है:

Log.d("tag", "onCreate: " + (new Slooow().toString())); 

और

String temp = new Sloooow().toString(); 
Log.d("tag", "onCreate: " + temp); 

तो ProGuard Log.d देखता है, और स्ट्रिप्स कि बाहर है, लेकिन यह बाहर के निर्माण के अलग करना नहीं है नया Sloooow उदाहरण, क्योंकि यह नहीं बताया गया है कि इसका कोई दुष्प्रभाव नहीं है।

मैं सामान्य रूप से करने के लिए किसी भी अच्छा तरीका नहीं सोच सकते हैं विशेष रूप से ProGuard यह कोई साइड प्रभाव पड़ता है कि बताए बिना sloooow() के निर्माण, निकाल देते हैं। (अगर मैं किसी कन्स्ट्रक्टर के लिए भी संभव है तो मुझे पता नहीं है)

+0

लगता है।मुझे कुछ नींद की ज़रूरत है और थोड़ा अधिक आशाजनक उत्तर देने की उम्मीद है जो वास्तव में मेरी समस्या को सुरक्षित रूप से हल करती है लेकिन किसी भी तरह से मुझे लगता है कि मेरे प्रोगार्ड-केंद्रित प्रश्न को देखते हुए थोड़ा जोड़ना है :) – Giszmo

+0

यह सही है। ProGuard नहीं जानता कि कन्स्ट्रक्टर और toString विधि दुष्प्रभाव नहीं है। जाहिर है कि ProGuard को अवांछित प्रभाव हो सकते हैं, क्योंकि यह (वर्तमान में) सभी toString() कार्यान्वयन पर लागू होगा, उदाहरण के लिए। और स्ट्रिंगबिल्डर विधियों के दुष्प्रभाव होते हैं, भले ही वे केवल आंतरिक हों। संभावित समाधान: यदि आप अपनी खुद की लॉगिंग विधि बना सकते हैं जिसमें सभी अतिरिक्त कोड शामिल हैं, तो आप उस पर -सुमेनोसाइडफ्रेट निर्दिष्ट कर सकते हैं। –

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