rol*_*ndl 10 android proguard android-proguard androiddesignsupport android-support-design
我正在尝试使用Android支持设计库(版本23.0.1)和类NavigationMenu(我将此类用作布局中的XML标记).
当我在Android 4.3上的三星或Android 5.x或6.0上的Nexus上执行我的应用程序时,一切运行良好,但是当我在Android 4.2.2上的Wiko Rainbow上执行应用程序时,它会崩溃并出现以下异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{applicationId/package.MainActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
[...]
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
[...]
Caused by: java.lang.NoClassDefFoundError: android.support.design.internal.NavigationMenu
at android.support.design.widget.NavigationView.<init>(NavigationView.java:99)
at android.support.design.widget.NavigationView.<init>(NavigationView.java:92)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:687)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
[...]
Run Code Online (Sandbox Code Playgroud)
这个错误让我想起了几个月前开发人员在Android 4.2.2上使用某些Wiko和Samsung手机上的appcompat-v7库.
错误是:
java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
at android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.java:914)
at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:964)
at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1182)
at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:79)
at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:118)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5391)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
Run Code Online (Sandbox Code Playgroud)
解决方案是将以下proguard文件用于项目:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.**, ** { *; }
Run Code Online (Sandbox Code Playgroud)
这个解决方案非常棒,因为我没有-dontwarn为像Jackson这样的其他库添加特定的规则(只是一些行),或者为android组件添加特定的规则.
因为NavigationMenu类继承了MenuBuilder类,我认为我们可以像这样修改proguard文件来解决问题:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.design.internal.**, ** { *; }
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用......所以我尝试了另一个解决方案:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-keep class !android.support.v7.internal.view.menu.*MenuBuilder*, android.support.v7.** { *; }
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效但是......事实上,我没有NoClassDefFoundError例外,但我有其他例外(在所有Android版本上都有),例如:
Fragment.那么,你知道一个解决方案,允许我在Android 4.2.2上的Wiko上执行我的应用程序,并且我不需要为我使用或将来使用的每个库添加特定规则吗?
预先感谢您的帮助 !
我正在关注类似的线程并努力寻找解决方案,但我没有设备.
基于人们的评论,我在proguard配置构建类型中添加了以下内容:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'
}
}
Run Code Online (Sandbox Code Playgroud)
ProGuard的-project.txt
-repackageclasses ''
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }
-keep class android.support.v13.app.** { *; }
-keep interface android.support.v13.app.** { *; }
Run Code Online (Sandbox Code Playgroud)
你可以尝试使用以下配置吗?我对这个解决方案有一些疑问,因为当我有未定义的生成类时,我仍然在同一个包中有NavigationMenuView.由于它的包访问关系,它没有被移动.所以可能有帮助的是在proguard-project.txt配置中添加另一个标志,但风险很大:
-allowaccessmodification
Run Code Online (Sandbox Code Playgroud)
这可能是尝试解决问题的良好开端.
所以在你的情况下,proguard-project应该如下所示:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-allowaccessmodification
-repackageclasses ''
-keep class your.package.name.** { *; }
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }
-keep class android.support.v13.app.** { *; }
-keep interface android.support.v13.app.** { *; }
Run Code Online (Sandbox Code Playgroud)
rol*_*ndl -4
感谢 Szymon Klimaszewski 的帮助!这是适合我的 proguard 文件:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontobfuscate
-dontoptimize
-repackageclasses ''
#Jackson
-dontwarn com.fasterxml.jackson.databind.**
#View Pager Indicator
-dontwarn com.viewpagerindicator.**
#Android
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class android.support.v7.app.** { *; }
-keep interface android.support.v7.app.** { *; }
-keep class android.support.v13.app.** { *; }
-keep interface android.support.v13.app.** { *; }
#droid4me
-keep class com.smartnsoft.** { *; }
#my app
-keep class my.app.package.** { *; }
#Critercism
-keep public class com.crittercism.**
-keepclassmembers public class com.crittercism.* { *; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5080 次 |
| 最近记录: |