2012-05-23 58 views
0

我正在使用Proguard和我的应用程序,并将NullPointerExceptions发送给我的开发者控制台供随机用户使用。当我执行ReTrace时,它似乎是我使用的AdView的问题。令人困惑的是,错误发生在我的Service,显然,它不使用广告。不知道是否Proguard正在做的代码或什么。这是去混淆堆栈跟踪:NullPointerException与proguard

java.lang.NullPointerException 
at com.google.ads.internal.AdWebView$1.a(Unknown Source) 
at com.app.base.MainService.onHandleIntent(Unknown Source) 
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.os.HandlerThread.run(HandlerThread.java:60) 

MainService是我的服务,然后将其显示,从我可以告诉,涉及到com.google.ads.internal.AdView一个NullPointerException

最近,我意识到我是不是我的AdView调用destroy(),所以我说这是正在使用它的Activities

如果
@Override 
public void onDestroy() 
{ 
    if (adView != null) 
     adView.destroy(); 

    super.onDestroy(); 
    } 

不知道会造成问题。

这是我proguard.cfg文件:

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-libraryjars C:\Workspace\JARs\GoogleAdMobAdsSdk-6.0.0.jar 
-libraryjars C:\Workspace\JARs\android-support-v4.jar 

-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 

-dontwarn **CompatHoneycomb 
-dontwarn **CompatHoneycombMR2 
-dontwarn **CompatCreatorHoneycombMR2 

-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.app.Fragment 

-keep class android.support.v4.app.** { *; } 
-keep interface android.support.v4.app.** { *; } 
-keep class com.actionbarsherlock.** { *; } 
-keep interface com.actionbarsherlock.** { *; } 
-keep class com.app.base.KeywordsFragment 
-keep class com.app.base.ListingFragment 

-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*(...); 
} 

# This will avoid all the onClick listeners referenced from XML Layouts from being removed 
-keepclassmembers class * extends android.app.Activity { 
     public void *(android.view.View); 
} 

-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 android.support.** 

UPDATE:

看着Proguard的手册后,我发现这是在故障排除部分:

“MissingResourceException异常或NullPointerException异常 您的处理后的代码可能无法找到某些资源文件。ProGuard只是将资源文件从输入jar复制到输出ja RS“。

想知道如果我需要使用keepdirectories

更新2:

我想知道如果加入这将解决我的问题。我无法测试这个,因为我无法自己重新创建错误。它只发生随机用户:

-keep class com.google.ads.** {*;} 

更新3:

追溯其他错误,我得到开发者控制台后,他们似乎都涉及到com.google.ads,例如:

java.lang.NullPointerException 
at com.google.ads.InterstitialAd.a(Unknown Source) 

回答

0

我认为使用以下应该工作:

-keepattributes *Annotation* 
-keep public class com.google.ads.** 

注释件可能已经存在。我认为问题在于SDK有它自己的proguard,并且依靠它的公共类不被开发人员计算。

0

第二proguard的说法应该是:

-keep public class com.google.ads.** {*;} 

没有{*;}它不适合我

0

工作,我一个晚上花搞清楚的是反省会导致使用ProGuard一个NullPointerException。回想起来很明显。

例如,我不得不删除的行:

Log.i(TAG, new Object(){}.getClass().getEnclosingMethod().getName());