2017-01-26 1 views
1

У меня есть приложение для Android, чьи отладочные сборки отлично работают. Его выпуск сборка, однако, который включает в себя запутывание с ProGuard (конфигурация показана ниже), не работает, и всегда падает на старте со следующим журналом:SuperNotCalledException после обфускации с помощью 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) 

Я пытался добавить необходимые звонки (переопределяя onAttach() в дефектный фрагмент), но это не имело никакого значения. Этот фрагмент находится в коде ниже и используется с библиотекой AppIntro. Это код 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); 
     } 
    } 

Файл ProGuard конфигурации Я использую это (и только это):

 

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

Я потерял, сколько часов я потратил, пытаясь для решения этой проблемы, особенно потому, что все работает в режиме отладки и без жалобы на super.onAttach(). Это происходит только после обфускации с помощью приведенной выше конфигурации.

Большое спасибо за внимание, и любая помощь приветствуется.

С уважением.

ответ

0

Я получил это работает. Как предположил Дорон, это, вероятно, было связано с запутыванием, а не с самим кодом.

Я отправлю свою методологию здесь и в окончательный файл proguard.cfg, чтобы служить в качестве ссылки для людей, сталкивающихся с одной и той же проблемой, и как [потенциально] решить ее (будьте осторожны: это связано с большим количеством смазки локтя!) ,

Поскольку я также подозревал, что это не имеет ничего общего с классами или кодом, первое, что я сделал, это удалить все ненужные переопределения, позволить обеим классам запутываться и отключать все оптимизации. Это было сделано с этими настройками в моем ProGuard конфигурации:

-optimizations no_optimizations 

Объяснение: no_optimizations это просто пустой заполнитель. Это ничего не значит для ProGuard. Вы можете очень хорошо использовать слово «огурец» там, и это будет иметь тот же эффект. Это просто означает, что никакие optmizations не будут запущены. Он отличается от указания инструкции -optimizations, что означает, что все оптимизации будут выполняться.

Я также прокомментировал все -keep для класса FragmentIntro и ActivityIntro. Я сделал компиляцию и тестирование. Он прошел грациозно! Все остальные опции обфускации, указанные в файле выше (в OP), были включены и оставлены как есть.

Затем жир локтя начала: я создал линию, каждый, и каждый Proguard оптимизаций было отказано явно:

-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 

Затем я начал позволяя 1 оптимизации в то время, и каждый раз, когда я сделал сборку выпуска, установлен на эмуляторе и увидел, работает ли приложение.

Если эта оптимизация привела к запуску приложения, я оставил его без восклицательного знака (!), Что означает, что это будет разрешено, иначе я вернул восклицательный знак и перешел к следующей оптимизации: удалите отметку , выпустить сборку, установить, протестировать.

Я сделал это 29 раз, по одному на каждую оптимизацию, чтобы выяснить, какие оптимизации делали мой кодекс.

В конце концов, я получил все нежелательные оптимизации поняли, и получили это:

-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 

Линия выше, убирала и только отрицание (восклицательный знак) нежелательные optmizations, эквивалентна:

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

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

Это как мои очищено, рабочий файл proguard.cfg кончался:

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

У меня нет окончательного представления, почему отмеченные оптимизаций упомянутых сломали мой код, хотя я подозреваю, что он оптимизирован что-то в v4.app.Fragment связанные классы (особенно v4.app.FragmentManager, в строке 1230, что помешало ему правильно вызвать onAttach() и установить f.mCalled в true). BTW, я использую Android support library 25.1.0.

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

1

Как ваши работы в отладке, проблема, вероятно, связана только с обфускацией, а не с вашим фактическим кодом.

ли вы пытаетесь держать весь класс в ProGuard:

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

Вы пробовали просто устранить эти строки:

@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

Эти строки были неудачной попыткой избавиться от ошибки. Поскольку сообщение журнала жаловалось на их отсутствие, я просто помещаю их туда (наряду с другими переопределениями, которые просто называют их супер методы). Я полагаю, что они не причинят вреда. – AlxDroidDev

Смежные вопросы