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は私のサービスであり、私が言えることから、にNullPointerException関連するものを示していcom.google.ads.internal.AdViewます。

最近、AdViewを呼び出していないことに気付いたので、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.**

アップデート:

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

2 番目のプロガード ステートメントは次のようになります。

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

それなし{*;}では私にはうまくいきません

于 2012-06-04T21:04:30.503 に答える
0

イントロスペクションがプロガードで NullPointerException を引き起こす可能性があることを理解するために夜を過ごしました。振り返ってみると、それは明らかです。

たとえば、次の行を削除する必要がありました。

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

以下を使用するとうまくいくと思います:

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

アノテーション ピースは既にそこにある可能性があります。問題は、SDK に独自のプロガードがあり、開発者がプロ​​ガードしないようにそのパブリック クラスに依存していることだと思います。

于 2012-05-25T20:57:13.240 に答える