【发布时间】:2017-06-12 03:58:23
【问题描述】:
我有一个 Android 应用,它的调试版本运行良好。然而,它的发布版本,包括对 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的代码:
我正在使用的 proguard 配置文件是这个(并且只有这个):
################################################# ################## 常规选项 -优化通过 5 -dontusemixedcase类名 -dontskipnonpubliclibraryclasses -dontskipnonpubliclibrary 类成员 -详细 -dontpreverify -重新包装类'' -允许访问修改 -mergeinterfacesaggressively - 积极超载 -keepattributes *Annotation*,Signature,EnclosureMethod,InnerClasses -assumenosideeffects 类 com.alxdroiddev.cameragear.FragmentQueryRunner { *; } -假设副作用类 com.alxdroiddev.cameragear.FragmentCards { *; } -假设副作用类 com.alxdroiddev.cameragear.db.InitialSampleData { *; } # Firebase 数据库必需(模型和 POJO) -keepclassmembers 类 com.alxdroiddev.cameragear.models.** { *; } ################################################# ################## 删除日志 -assumenosideeffects 类 android.util.Log { 公共静态 *** e(...); 公共静态 *** w(...); 公共静态 *** wtf(...); 公共静态 *** d(...); 公共静态 *** v(...); 公共静态 *** i(...); } -assumenosideeffects 类 com.alxdroiddev.utils.CLog { *; } ################################################# ################## IMAGECROPPER -keepnames 类 com.theartofdev.edmodo.cropper.** { *; } ################################################# ##################APPINTRO -keep class com.github.paolorotolo.** {*;} -保持公共类 com.alxdroiddev.cameragear.utils.FragmentIntro -keepclassmembers 公共类 com.alxdroiddev.cameragear.utils.FragmentIntro {*;} -保持公共类 com.alxdroiddev.cameragear.ActivityIntro -keepclassmembers 公共类 com.alxdroiddev.cameragear.ActivityIntro {*;} ################################################# ################## 元数据提取器 -keep class com.drew.imaging.** { *; } -keep class com.drew.metadata.** { *; } -keep class com.drew.lang.** { *; } ################################################# ################## 杂项 -keep 类 * 扩展 java.util.ListResourceBundle { 受保护的 java.lang.Object[][] getContents(); } # Parcelable/SafeParcelable 创建者需要不被剥离 -keepnames 类 * 实现 android.os.Parcelable { 公共静态最终**创建者; } -keepclassmembers 类 * 实现 android.os.Parcelable { 静态**创作者; } # 针对预棉花糖 SDK 构建时需要。 -dontwarn android.security.NetworkSecurityPolicy -keep class android.support.customtabs.** { *; } -dontwarn android.support.customtabs.** -keep class com.google.android.gms.** { *; } -不要警告 com.google.android.gms.** ################################################# ################## 应用内计费 -保持公共接口 com.android.vending.licensing.ILicensingService -保持公共类 com.google.vending.licensing.ILicensingService -保持公共类 com.android.vending.licensing.ILicensingService ################################################# ################## 保持安卓支持 V7 和设计 -不要警告 android.support.design.** -keep class android.support.design.** { *; } -保持界面 android.support.design.** { *; } -保持公共类 android.support.design.R$** { *; } -保持公共类 android.support.v7.widget.** { *; } -保持公共类 android.support.v7.internal.widget.** { *; } -保持公共类 android.support.v7.internal.view.menu.** { *; } -保持公共类 * 扩展 android.support.v4.view.ActionProvider { 公共(android.content.Context); } -保持公共类 android.support.v14.preference.** { *; } -保持公共类 android.support.v7.app.** { *; } -保持公共类 android.support.v7.preference.** { *; } -保持公共类 android.support.v4.app.** { *; } -不要警告 android.support.** -保持界面 android.support.v4.** { *; } -保持界面 android.support.v7.** { *; } -keep interface android.support.v13.** {*; } -keep interface android.support.v14.** {*; } ################################################# ################## ORG.APACHE.HTTP -保持类 org.apache.http.** { *; } -保持接口 org.apache.http.** -不要警告 org.apache.** ################################################# ################## GOOGLE PLAY 服务库 - 广告 -保持公共类 com.google.android.gms.** { public *; } #-keep 类 com.google.android.gms.** # 对于 Google Play 服务 -保持公开课 com.google.android.gms.ads.**{ 民众 *; } ################################################# ################## FIREBASE -keep public class com.google.firebase.** { *; } -保持公共类 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.** { *; } ################################################# ################## GOOGLE 建议的优化 # 原生方法见 http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames 类 * { 本国的 ; } # 在 Views 中保留 setter 以便动画仍然可以工作。 # 见 http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers 公共类 * 扩展 android.view.View { 无效集*(***); *** 得到*(); } # 我们希望在 Activity 中保留可以在 XML 属性 onClick 中使用的方法 -keepclassmembers 类 * 扩展 android.app.Activity { 公共无效*(android.view.View); } # 枚举类见http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers 枚举 * { 公共静态 **[] 值(); 公共静态 ** valueOf(java.lang.String); } -keepclassmembers 类 **.R$* { 公共静态; } # 理解@Keep 支持注解。 -keep 类 android.support.annotation.Keep -keep @android.support.annotation.Keep 类 * {*;} -keepclasseswithmembers 类 * { @android.support.annotation.Keep; } -keepclasseswithmembers 类 * { @android.support.annotation.Keep; } -keepclasseswithmembers 类 * { @android.support.annotation.Keep (...); }我已经忘记了我花了多少小时试图解决这个问题,特别是因为一切都在调试模式下运行,并且没有任何关于 super.onAttach() 的投诉。只有在混淆了上面的配置后才会失败。
非常感谢您的关注,感谢您的帮助。
最好的问候。
【问题讨论】:
标签: android android-fragments exception proguard obfuscation