Các giả định chung
Vì vậy, tôi đã tìm thấy rất nhiều về cách sử dụng trình bảo vệ để tách các câu lệnh nhật ký khỏi mã. Về cơ bản tất cả các thuật ngữ -assumenosideeffects cùng với việc sử dụng cấu hình $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt sẽ làm điều này. hiểu biết của tôi là để có được bytecode đó là tương đương với làm một sốCách xóa android.Log.d?
if(Consts.DEBUG) Log.d("","");
aka tôi cho rằng để có được những cuộc gọi đến doSomeExpensiveStuff() loại khỏi apk tôi:
android.util.Log.d("Hello","World"+(new Foo().doSomeExpensiveStuff()));
Mã My
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 tập tin dex
.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
Vấn đề
Bây giờ nếu tôi triển khai này vào điện thoại của tôi, tôi không nhận được bất kỳ dữ liệu ghi nhận nhưng vẫn ngủ 5s (hoặc bất kỳ chậm trễ khác hoặc tai nạn từ mã mà shouldn' t làm phiền người dùng của tôi). Tôi đang làm gì sai?
nghiên cứu sâu hơn
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.
ứng dụng cùng một vấn đề gặp sự cố khi tôi sử dụng gói ứng dụng bị can thiệp bởi lệnh 'ant release' – juned
@juned câu hỏi này không có gì để làm với sự cố ứng dụng;) – JesusFreke