2017-01-26 7 views
1

Ich habe eine Android-App, deren Debug-Builds perfekt funktionieren. Sein Release-Build aber, die Verschleierung mit ProGuard enthält (config ist unten dargestellt), funktioniert nicht und stürzt immer beim Start mit dem folgende Protokoll:SuperNotCalledException nach Verschleierung mit Proguard

01-26 15:33:34.048 E/AndroidRuntime: FATAL EXCEPTION: main 
           Process: com.alxdroiddev.cameragear, PID: 6551 
           co: Fragment FragmentIntro{13af572c id=0x7f100177 android:switcher:2131755383:0} did not call through to super.onAttach() 
            at android.support.v4.app.FragmentManagerImpl.a(SourceFile:1232) 
            at android.support.v4.app.FragmentManagerImpl.v(SourceFile:2323) 
            at android.support.v4.app.FragmentManagerImpl.a(SourceFile:2136) 
            at android.support.v4.app.FragmentManagerImpl.b(SourceFile:2092) 
            at android.support.v4.app.FragmentManagerImpl.b(SourceFile:1969) 
            at bu.commitNowAllowingStateLoss(SourceFile:620) 
            at android.support.v4.app.FragmentPagerAdapter.finishUpdate(SourceFile:143) 
            at android.support.v4.view.ViewPager.populate(SourceFile:1268) 
            at android.support.v4.view.ViewPager.populate(SourceFile:1116) 
            at android.support.v4.view.ViewPager.onMeasure(SourceFile:1642) 
            at android.view.View.measure(View.java:17430) 
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:727) 
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:463) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
            at android.support.v7.widget.ContentFrameLayout.onMeasure(SourceFile:139) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) 
            at android.view.View.measure(View.java:17430) 
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) 
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166) 
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372) 
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
            at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
            at android.view.Choreographer.doFrame(Choreographer.java:550) 
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

ich versucht habe, die erforderlichen Anrufe Hinzufügen (zwingenden onAttach() in der fehlerhaftes Fragment), aber das machte keinen Unterschied. Das fragliche Fragment befindet sich in dem folgenden Code und wird mit der Bibliothek AppIntro verwendet. Dies ist der Code für FragmentIntro.java:

 

    public class FragmentIntro extends Fragment implements ISlideBackgroundColorHolder { 

     /* Static stuff  */ 
     private static final String ARG_LAYOUT_TITLE_ID = "titleId"; 
     private static final String ARG_LAYOUT_MESSAGE_ID = "messageId"; 
     private static final String ARG_LAYOUT_DRAWABLE_ID = "drawableId"; 
     private static final String ARG_LAYOUT_COLOR_ID = "colorId"; 
     //private static final int layoutResId = R.layout.intro_fragment; 

     /* Private instance variables  */ 
     private int titleRedId, messageResId, drawableId, colorResId, colorCode; 
     private RelativeLayout mainLayout; 

     public static FragmentIntro newInstance(@StringRes int titleId, @StringRes int messageId, @DrawableRes int drawableId, @ColorRes int colorId) { 

      FragmentIntro fragSlide = new FragmentIntro(); 

      Bundle args = new Bundle(); 
      args.putInt(ARG_LAYOUT_TITLE_ID, titleId); 
      args.putInt(ARG_LAYOUT_MESSAGE_ID , messageId); 
      args.putInt(ARG_LAYOUT_DRAWABLE_ID , drawableId); 
      args.putInt(ARG_LAYOUT_COLOR_ID, colorId); 

      fragSlide.setArguments(args); 

      return fragSlide; 
     } 

     @Override 
     public void onCreate(@Nullable Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      if (getArguments() != null) { 
       this.titleRedId = getArguments().getInt(ARG_LAYOUT_TITLE_ID); 
       this.messageResId = getArguments().getInt(ARG_LAYOUT_MESSAGE_ID); 
       this.drawableId = getArguments().getInt(ARG_LAYOUT_DRAWABLE_ID); 
       this.colorResId = getArguments().getInt(ARG_LAYOUT_COLOR_ID); 
      } 
     } 

     @Nullable 
     @Override 
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
      //super.onCreateView(inflater, container, savedInstanceState); 
      //if (container == null) return null; 

      View view = inflater.inflate(R.layout.intro_fragment, container, false); 

      Utils.globalAppContext = getContext().getApplicationContext(); 

      colorCode = ContextCompat.getColor(getContext().getApplicationContext(), colorResId); 

      mainLayout = (RelativeLayout) view.findViewById(R.id.introLayout); 
      mainLayout.setBackgroundColor(colorCode); 
      ((TextView) view.findViewById(R.id.textViewIntroTitle)).setText(titleRedId); 
      ((TextView) view.findViewById(R.id.textViewIntroMessage)).setText(messageResId); 
      ((ImageView) view.findViewById(R.id.imageViewIntro)).setImageDrawable(Utils.getDrawableFromResource(drawableId)); 

      return view; 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      outState.putInt(ARG_LAYOUT_TITLE_ID, titleRedId); 
      outState.putInt(ARG_LAYOUT_MESSAGE_ID, messageResId); 
      outState.putInt(ARG_LAYOUT_DRAWABLE_ID, drawableId); 
      outState.putInt(ARG_LAYOUT_COLOR_ID, colorResId); 
      super.onSaveInstanceState(outState); 
     } 

     @Keep 
     @TargetApi(23) 
     @Override 
     public void onAttach(Context context) { 
      super.onAttach(context); 
     } 

     @Keep 
     @SuppressWarnings("deprecation") 
     @Override 
     public void onAttach(Activity activity) { 
      super.onAttach(activity); 
     } 

     @Override 
     public void onDestroy() { 
      super.onDestroy(); 
     } 

     @Override 
     public void onPause() { 
      super.onPause(); 
     } 

     @Override 
     public void onResume() { 
      super.onResume(); 
     } 

     @Override 
     public void onStart() { 
      super.onStart(); 
     } 

     @Override 
     public void onStop() { 
      super.onStop(); 
     } 


     // Implementation of ISlideBackgroundColorHolder 

     @Override 
     public int getDefaultBackgroundColor() { 
      return colorCode; 
     } 

     @Override 
     public void setBackgroundColor(@ColorInt int backgroundColor) { 
      mainLayout.setBackgroundColor(backgroundColor); 
     } 
    } 

Die proguard Konfigurationsdatei ich verwende ist diese (und nur diese):

 

    #################################################################### GENERAL OPTIONS 

    -optimizationpasses 5 
    -dontusemixedcaseclassnames 
    -dontskipnonpubliclibraryclasses 
    -dontskipnonpubliclibraryclassmembers 
    -verbose 
    -dontpreverify 
    -repackageclasses '' 
    -allowaccessmodification 
    -mergeinterfacesaggressively 
    -overloadaggressively 
    -keepattributes *Annotation*,Signature,EnclosingMethod,InnerClasses 


    -assumenosideeffects class com.alxdroiddev.cameragear.FragmentQueryRunner { *; } 
    -assumenosideeffects class com.alxdroiddev.cameragear.FragmentCards { *; } 
    -assumenosideeffects class com.alxdroiddev.cameragear.db.InitialSampleData { *; } 

    # Required for Firebase Database (Models and POJOs) 
    -keepclassmembers class com.alxdroiddev.cameragear.models.** { 
     *; 
    } 


    #################################################################### REMOVE LOGGING 

    -assumenosideeffects class android.util.Log { 
     public static *** e(...); 
     public static *** w(...); 
     public static *** wtf(...); 
     public static *** d(...); 
     public static *** v(...); 
     public static *** i(...); 
    } 

    -assumenosideeffects class com.alxdroiddev.utils.CLog { *; } 


    #################################################################### IMAGECROPPER 

    -keepnames class com.theartofdev.edmodo.cropper.** { *; } 

    #################################################################### APPINTRO 

    -keep class com.github.paolorotolo.** {*;} 
    -keep public class com.alxdroiddev.cameragear.utils.FragmentIntro 
    -keepclassmembers public class com.alxdroiddev.cameragear.utils.FragmentIntro {*;} 
    -keep public class com.alxdroiddev.cameragear.ActivityIntro 
    -keepclassmembers public class com.alxdroiddev.cameragear.ActivityIntro {*;} 

    #################################################################### METADATA-EXTRACTOR 

    -keep class com.drew.imaging.** { *; } 
    -keep class com.drew.metadata.** { *; } 
    -keep class com.drew.lang.** { *; } 

    #################################################################### MISC STUFF 


    -keep class * extends java.util.ListResourceBundle { 
     protected java.lang.Object[][] getContents(); 
    } 

    # Needed for Parcelable/SafeParcelable Creators to not get stripped 
    -keepnames class * implements android.os.Parcelable { 
     public static final ** CREATOR; 
    } 

    -keepclassmembers class * implements android.os.Parcelable { 
     static ** CREATOR; 
    } 

    # Needed when building against pre-Marshmallow SDK. 
    -dontwarn android.security.NetworkSecurityPolicy 


    -keep class android.support.customtabs.** { *; } 
    -dontwarn android.support.customtabs.** 

    -keep class com.google.android.gms.** { *; } 
    -dontwarn com.google.android.gms.** 

    #################################################################### IN-APP BILLING 

    -keep public interface com.android.vending.licensing.ILicensingService 
    -keep public class com.google.vending.licensing.ILicensingService 
    -keep public class com.android.vending.licensing.ILicensingService 

    #################################################################### KEEP ANDROID SUPPORT V7 AND DESIGN 

    -dontwarn android.support.design.** 
    -keep class android.support.design.** { *; } 
    -keep interface android.support.design.** { *; } 
    -keep public class android.support.design.R$** { *; } 

    -keep public class android.support.v7.widget.** { *; } 
    -keep public class android.support.v7.internal.widget.** { *; } 
    -keep public class android.support.v7.internal.view.menu.** { *; } 

    -keep public class * extends android.support.v4.view.ActionProvider { 
     public (android.content.Context); 
    } 

    -keep public class android.support.v14.preference.** { *; } 
    -keep public class android.support.v7.app.** { *; } 
    -keep public class android.support.v7.preference.** { *; } 
    -keep public class android.support.v4.app.** { *; } 



    -dontwarn android.support.** 
    -keep interface android.support.v4.** { *; } 
    -keep interface android.support.v7.** { *; } 
    -keep interface android.support.v13.** {*; } 
    -keep interface android.support.v14.** {*; } 

    #################################################################### ORG.APACHE.HTTP 

    -keep class org.apache.http.** { *; } 
    -keep interface org.apache.http.** 
    -dontwarn org.apache.** 

    #################################################################### GOOGLE PLAY SERVICES LIB - ADS 

    -keep public class com.google.android.gms.** { public *; } 
    #-keep class com.google.android.gms.** 

    # For Google Play Services 
    -keep public class com.google.android.gms.ads.**{ 
     public *; 
    } 

    #################################################################### FIREBASE 

    -keep public class com.google.firebase.** { *; } 
    -keep public class com.google.firebase.analytics.** { *; } 
    -keep public class com.google.firebase.provider.** { *; } 
    -keep public class com.google.firebase.auth.** { *; } 
    -keep interface com.google.firebase.** {*; } 
    -keep class com.firebase.** { *; } 


    #################################################################### SUGGESTED OPTIMIZATIONS BY GOOGLE 


    # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 
    -keepclasseswithmembernames class * { 
     native ; 
    } 

    # keep setters in Views so that animations can still work. 
    # see http://proguard.sourceforge.net/manual/examples.html#beans 
    -keepclassmembers public class * extends android.view.View { 
     void set*(***); 
     *** get*(); 
    } 

    # We want to keep methods in Activity that could be used in the XML attribute onClick 
    -keepclassmembers class * extends android.app.Activity { 
     public void *(android.view.View); 
    } 

    # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
    -keepclassmembers enum * { 
     public static **[] values(); 
     public static ** valueOf(java.lang.String); 
    } 

    -keepclassmembers class **.R$* { 
     public static ; 
    } 

    # Understand the @Keep support annotation. 
    -keep class android.support.annotation.Keep 

    -keep @android.support.annotation.Keep class * {*;} 

    -keepclasseswithmembers class * { 
     @android.support.annotation.Keep ; 
    } 

    -keepclasseswithmembers class * { 
     @android.support.annotation.Keep ; 
    } 

    -keepclasseswithmembers class * { 
     @android.support.annotation.Keep (...); 
    } 

Ich habe den Überblick verloren, wie viele Stunden ich habe damit verbracht, um dies zu lösen, vor allem, weil alles im Debug-Modus läuft, und ohne Beschwerde über die super.onAttach(). Es schlägt nur nach dem Verschleiern mit der obigen Konfiguration fehl.

Vielen Dank für Ihre Aufmerksamkeit und jede Hilfe wird geschätzt.

Mit freundlichen Grüßen.

Antwort

0

Ich habe es funktioniert. Wie Doron vermutete, war es wahrscheinlich mit der Verschleierung und nicht mit dem Code selbst verbunden.

Ich poste meine Methodik hier und die finale proguard.cfg Datei, nur um als Referenz für Leute zu dienen, die das gleiche Problem haben und wie man es [potentiell] lösen kann (Vorsicht: es beinhaltet viel Ellenbogenfett!) .

Da ich auch vermutete, dass es nichts mit den Klassen oder dem Code zu tun hatte, war das erste, was ich getan habe, alle unnötigen Überschreibungen zu entfernen, beide Klassen zu verschleiern und alle Optimierungen zu deaktivieren. Dies wurde mit diesen Einstellungen in meinem ProGuard Config getan:

-optimizations no_optimizations 

Erläuterung: no_optimizations ist nur ein leerer Platzhalter. Es bedeutet nichts für ProGuard. Du könntest sehr gut das Wort "Gurke" darin verwenden und es würde den gleichen Effekt haben. Es bedeutet nur, dass keine Optimierungen ausgeführt werden. Es unterscheidet sich davon, dass die Anweisung -optimizations nicht angegeben wird, was bedeutet, dass alle Optimierungen ausgeführt werden.

Ich habe auch alle -keep für die FragmentIntro Klasse und ActivityIntro auskommentiert. Ich habe einen Release kompiliert und getestet. Es lief anmutig! Alle anderen in der obigen Datei (im OP) gezeigten Verschleierungsoptionen wurden aktiviert und belassen.

Dann begann das Fett Ellenbogen: Ich erstellt wurden, eine Linie, jede und alle ProGuard Optimierungen explizit verweigert wurden:

-optimizations !class/marking/final,!class/unboxing/enum,!class/merging/vertical,!class/merging/horizontal,!field/removal/writeonly,!field/marking/private,!field/propagation/value,!method/marking/private,!method/marking/static,!method/marking/final,!method/removal/parameter,!method/propagation/parameter,!method/propagation/returnvalue,!method/inlining/short,!method/inlining/unique,!method/inlining/tailrecursion,!code/merging,!code/simplification/variable,!code/simplification/arithmetic,!code/simplification/cast,!code/simplification/field,!code/simplification/branch,!code/simplification/string,!code/simplification/advanced,!code/removal/advanced,!code/removal/simple,!code/removal/variable,!code/removal/exception,!code/allocation/variable 

Ich begann dann 1 Optimierung zu einer Zeit ermöglicht und jedes Mal, wenn ich einen Release-Build haben, installiert auf dem Emulator und sah, ob die App lief.

Wenn diese Optimierung zu einer laufenden App führte, habe ich sie ohne das Ausrufezeichen (!) Gelassen, was bedeutet, dass es erlaubt wäre, sonst würde ich das Ausrufezeichen zurück setzen und mit der nächsten Optimierung fortfahren: Entfernen Sie die Markierung , Build erstellen, installieren, testen.

Ich habe dies 29 mal gemacht, einen für jede Optimierung, nur um herauszufinden, welche Optimierungen meinen Code zum Absturz brachten.

Am Ende habe ich alle habe dachte unerwünschte Optimierungen und bekam dies:

-optimizations class/marking/final,class/unboxing/enum,class/merging/vertical,class/merging/horizontal,!field/removal/writeonly,field/marking/private,field/propagation/value,method/marking/private,!method/marking/static,method/marking/final,!method/removal/parameter,method/propagation/parameter,method/propagation/returnvalue,method/inlining/short,method/inlining/unique,method/inlining/tailrecursion,code/merging,code/simplification/variable,code/simplification/arithmetic,code/simplification/cast,code/simplification/field,code/simplification/branch,code/simplification/string,code/simplification/advanced,!code/removal/advanced,code/removal/simple,code/removal/variable,code/removal/exception,!code/allocation/variable 

Die Linie oben, gereinigt und nur zu leugnen (das Ausrufezeichen), die unerwünschten optmizations, ist äquivalent zu:

Mit den oben genannten Optimierungen nicht, mein Code kompiliert und lief gut. Auf der anderen Seite, wenn ich eine der obigen Optimierungen zulasse, wird es beim Start abstürzen.

Dies ist, wie meine aufgeräumt, endete Arbeits proguard.cfg Datei auf:

#################################################################### GENERAL OPTIONS 

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-verbose 
-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-mergeinterfacesaggressively 
-overloadaggressively 
-keepattributes *Annotation*,Signature,EnclosingMethod,InnerClasses 


-optimizations !field/removal/writeonly,!method/marking/static,!method/removal/parameter,!code/removal/advanced,!code/allocation/variable 


-assumenosideeffects class com.alxdroiddev.cameragear.FragmentQueryRunner { *; } 
-assumenosideeffects class com.alxdroiddev.cameragear.FragmentCards { *; } 
-assumenosideeffects class com.alxdroiddev.cameragear.db.InitialSampleData { *; } 

# Required for Firebase Database (Models and POJOs) 
-keepclassmembers class com.alxdroiddev.cameragear.models.** { 
    *; 
} 


#################################################################### REMOVE LOGGING 

-assumenosideeffects class android.util.Log { 
    public static *** e(...); 
    public static *** w(...); 
    public static *** wtf(...); 
    public static *** d(...); 
    public static *** v(...); 
    public static *** i(...); 
} 

-assumenosideeffects class com.alxdroiddev.utils.CLog { *; } 


#################################################################### IMAGECROPPER 

-keepnames class com.theartofdev.edmodo.cropper.** { *; } 

#################################################################### APPINTRO 

-keep class com.github.paolorotolo.** {*;} 

#################################################################### METADATA-EXTRACTOR 

-keep class com.drew.imaging.** { *; } 
-keep class com.drew.metadata.** { *; } 
-keep class com.drew.lang.** { *; } 

#################################################################### MISC STUFF 


-keep class * extends java.util.ListResourceBundle { 
    protected java.lang.Object[][] getContents(); 
} 

# Needed for Parcelable/SafeParcelable Creators to not get stripped 
-keepnames class * implements android.os.Parcelable { 
    public static final ** CREATOR; 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    static ** CREATOR; 
} 

# Needed when building against pre-Marshmallow SDK. 
-dontwarn android.security.NetworkSecurityPolicy 


-keep class android.support.customtabs.** { *; } 
-dontwarn android.support.customtabs.** 

-keep class com.google.android.gms.** { *; } 
-dontwarn com.google.android.gms.** 

#################################################################### IN-APP BILLING 

-keep public interface com.android.vending.licensing.ILicensingService 
-keep public class com.google.vending.licensing.ILicensingService 
-keep public class com.android.vending.licensing.ILicensingService 

#################################################################### KEEP ANDROID SUPPORT V7 AND DESIGN 

-dontwarn android.support.design.** 
-keep class android.support.design.** { *; } 
-keep interface android.support.design.** { *; } 
-keep public class android.support.design.R$** { *; } 

-keep public class android.support.v7.widget.** { *; } 
-keep public class android.support.v7.internal.widget.** { *; } 
-keep public class android.support.v7.internal.view.menu.** { *; } 

-keep public class * extends android.support.v4.view.ActionProvider { 
    public <init>(android.content.Context); 
} 

-keep public class android.support.v14.preference.** { *; } 
-keep public class android.support.v7.app.** { *; } 
-keep public class android.support.v7.preference.** { *; } 
-keep public class android.support.v4.app.** { *; } 



-dontwarn android.support.** 
-keep interface android.support.v4.** { *; } 
-keep interface android.support.v7.** { *; } 
-keep interface android.support.v13.** {*; } 
-keep interface android.support.v14.** {*; } 

#################################################################### ORG.APACHE.HTTP 

-keep class org.apache.http.** { *; } 
-keep interface org.apache.http.** 
-dontwarn org.apache.** 

#################################################################### GOOGLE PLAY SERVICES LIB - ADS 

-keep public class com.google.android.gms.** { public *; } 

# For Google Play Services 
-keep public class com.google.android.gms.ads.**{ 
    public *; 
} 

#################################################################### FIREBASE 

-keep public class com.google.firebase.** { *; } 
-keep public class com.google.firebase.analytics.** { *; } 
-keep public class com.google.firebase.provider.** { *; } 
-keep public class com.google.firebase.auth.** { *; } 
-keep interface com.google.firebase.** {*; } 
-keep class com.firebase.** { *; } 


#################################################################### SUGGESTED OPTIMIZATIONS BY GOOGLE 


# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 

# keep setters in Views so that animations can still work. 
# see http://proguard.sourceforge.net/manual/examples.html#beans 
-keepclassmembers public class * extends android.view.View { 
    void set*(***); 
    *** get*(); 
} 

# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

# Understand the @Keep support annotation. 
-keep class android.support.annotation.Keep 

-keep @android.support.annotation.Keep class * {*;} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <methods>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <fields>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <init>(...); 
} 

Ich habe keine definitive Idee, warum die markierten erwähnten Optimierungen meinen Code brach, obwohl ich es etwas optimiert vermuten in v4.app.Fragment-bezogene Klassen (speziell v4.app.FragmentManager, in Zeile 1230, die es verhindert haben, rufen Sie onAttach() auf und setzen Sie f.mCalled auf true). BTW, ich benutze Android Support-Bibliothek 25.1.0.

Wie auch immer, ich danke Ihnen für Ihre Zeit und Aufmerksamkeit und ich hoffe, dass der obige Ansatz zur Lösung dieses lästigen Problems für jemanden hilfreich ist.

1

Da Ihr Debugger funktioniert, liegt das Problem wahrscheinlich nur an der Verschleierung und nicht an Ihrem tatsächlichen Code.

Haben Sie versucht, die gesamte Klasse in proguard halten:

-keep class com.alxdroiddev.cameragear.utils.FragmentIntro { *; } 
1

Haben Sie diese Zeilen gerade versucht zu entfernen:

@Keep 
@TargetApi(23) 
@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
} 

@Keep 
@SuppressWarnings("deprecation") 
@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 
+0

Diese Zeilen waren ein fehlgeschlagener Versuch, den Fehler loszuwerden. Da sich die Log-Nachricht über ihre Abwesenheit beschwerte, habe ich sie einfach dort abgelegt (zusammen mit den anderen Überschreibungen, die einfach ihre Super-Methoden aufrufen). Ich denke, sie würden nichts tun. – AlxDroidDev

Verwandte Themen