2012-05-23 1 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 моя служба, которая затем показывает, от того, что я могу сказать, NullPointerException, связанные с com.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.** 

UPDATE:

После просмотра инструкции Proguard, я нашел это в разделе Устранение:

«MissingResourceException или NullPointerException Ваш обработанный код может оказаться не в состоянии найти некоторые файлы ресурсов. ProGuard просто копирует файлы ресурсов с входных банок на выход ja RS «.

Wonder, если мне нужно использовать keepdirectories

UPDATE 2:

Я интересно, если это добавление будет исправить мою проблему. Я не могу это проверить, потому что я не могу сам воссоздать ошибку. Это происходит только для случайных пользователей:

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

UPDATE 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 имеет свою собственную защитную оболочку и полагается на ее публичные классы, чтобы не быть проактивным разработчиком.

0

Второе утверждение ProGuard должно быть:

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

без {*;} он не работает для меня

0

я провел вечер выяснить, что интроспекция может вызвать NullPointerException с ProGuard.Оглядываясь назад, это очевидно.

Например, мне пришлось удалить строку:

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