0

我正在将 Proguard 与我的应用程序一起使用,并且我会被NullPointerExceptions随机发送到我的开发者控制台。当我进行 ReTrace 时,这似乎是AdView我正在使用的问题。令人困惑的是,错误发生在我Service的显然不使用广告的地方。不知道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是我的服务,据我所知,它显示了NullPointerExceptioncom.google.ads.internal.AdView.

我最近意识到我没有调用destroy()我的 AdView,所以我将它添加到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.**

更新:

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

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

想知道我是否需要使用keepdirectories

更新 2:

我想知道添加它是否会解决我的问题。我无法对此进行测试,因为我自己无法重新创建错误。它只发生在随机用户身上:

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

更新 3:

在追溯我在开发者控制台中遇到的其他错误后,它们似乎都与 com.google.ads 有关,例如:

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

3 回答 3

0

我认为使用以下内容应该有效:

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

注释片可能已经在那里了。我认为问题在于 SDK 有它自己的 proguard,并且依赖于它的公共类不被开发人员保护。

于 2012-05-25T20:57:13.240 回答
0

第二个 proguard 声明应该是:

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

没有{*;}它对我不起作用

于 2012-06-04T21:04:30.503 回答
0

我花了一个晚上弄清楚内省可能会导致带有 proguard 的 NullPointerException。回想起来很明显。

例如,我必须删除该行:

Log.i(TAG, new Object(){}.getClass().getEnclosingMethod().getName());
于 2015-01-30T06:13:02.487 回答