Proguard NoClassDefFoundError

Posted

技术标签:

【中文标题】Proguard NoClassDefFoundError【英文标题】: 【发布时间】:2016-02-10 09:37:22 【问题描述】:

今天我更新了我的 gradle 以使用最新的播放服务:

build.gradle

classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.google.gms:google-services:1.5.0-beta2'

app.gradle

compile 'com.google.android.gms:play-services-analytics:8.3.0'
compile 'com.google.android.gms:play-services-gcm:8.3.0'

我使用 proguard 混淆代码,我得到以下错误:

java.lang.NoClassDefFoundError: my.package.adapters.MyPagerAdapter

我尝试将其添加到 proguard 文件中:

-keep class my.package.adapters.MyPagerAdapter  *; 

但没有运气。用以前的版本玩服务没问题。 对于从包 android.support.v13.app.FragmentPagerAdapter.

扩展 FragmentPagerAdapter 的每个类,我都会收到此错误。

有什么帮助吗?非常感谢。

【问题讨论】:

【参考方案1】:

为了防止FragmentPageAdapter派生类被混淆,你需要以下proguard规则:

-keep class * extends android.support.v13.app.FragmentPagerAdapter  *; 

【讨论】:

您确定您使用的是正确的 proguard 配置吗?您是否设置为真正的“缩小”属性?您的 proguard 配置部分是否像 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'C:/blblabla/proguard-rules-1.5.2.pro'【参考方案2】:

如果您对应用程序进行多重索引,请考虑在项目级 build.gradle 中使用 multiDexKeepFile 属性或 multiDexKeepProguard 属性。

更多信息在这里https://developer.android.com/studio/build/multidex.html

基本上,您需要指定要在主 dex 文件中保留哪些类,以便应用正确启动而不会崩溃。在确定 proguard 不是问题后,我个人最终使用了 multiDexKeepProguard。

【讨论】:

以上是关于Proguard NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章

使用属性打开/关闭 Proguard

proguard.ParseException:proguard.cfg 中的未知选项“-encryptstrings”

ProGuard惯用法

Proguard Maven 插件不使用指定的 Proguard 版本

Proguard 查询,正在使用哪一个

Proguard 返回错误 1 ​​- 项目 bin 文件夹中没有 proguard.txt 文件?