【发布时间】:2015-05-14 03:03:53
【问题描述】:
在我的 Android 应用程序中,我正在发布模式下构建。激活 Proguard 会导致一个罕见的问题,永远不会执行特定的 for 循环:
List<MyClass> objectList = getObjectList();
Log.d("Step 1", String.valueOf(objectList.size())); //Print size > 0
for(MyClass object: objectList) {
Log.d("Step 2", object.toString()); //Never printed
...
}
“步骤 1”日志打印正确,objectList.size() > 0。我不明白是什么原因导致“步骤 2”日志永远不会打印(并且所有进入 for 循环的代码都不会执行)。我正在使用 Android 设备管理器 Logcat。
在调试模式或禁用 Proguard 时,此 sn-p 可以正常工作。
提前致谢。
更新
我刚刚添加了-dontoptimize,但问题没有解决。这是我的 proguard-rules 文件:
-dontoptimize
-dontpreverify
-repackageclasses ''
-allowaccessmodification
#-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*,EnclosingMethod,SourceFile,LineNumberTable
-renamesourcefileattribute SourceFile
-keepnames class com.androidplot.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class org.acra.** { *; }
-keep,allowoptimization class com.mypackage.myapp.model.** { *; }
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.preference.PreferenceFragment
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn com.mypackage.myapp.**
-dontwarn com.fasterxml.jackson.databind.ext.**
-dontwarn com.google.common.**
-dontwarn android.support.**
【问题讨论】:
-
可能你的
toString返回 null 或空字符串,在这种情况下它不会被记录 -
不,这些情况已经过验证,而且
toString()在 MyClass 中是@Override并且总是打印一个字符串。 -
您是否尝试记录其他内容以确保没有发生这种情况?
-
是的,而且for循环包含更多代码,不仅仅是Log.d指令。
-
下一步是反编译混淆后的代码,以查看 proguard 运行后究竟执行了什么。