सामान्य मान्यताओं
तो मुझे कोड से लॉग स्टेटमेंट को पट्टी करने के लिए प्रोगार्ड का उपयोग करने के बारे में बहुत कुछ मिला। मूल रूप से सभी -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.
का सामना करना पड़ा उसी समस्या का सामना करना पड़ा जब मैंने एपीके का उपयोग किया जो 'चींटी रिलीज' कमांड – juned
द्वारा दबाया गया है, इस सवाल के लिए कुछ भी नहीं है एक एप्लिकेशन क्रैश के साथ;) – JesusFreke