ClassLookupException:如果使用没有proguard

时间:2016-03-25 14:54:47

标签: android android-gradle android-proguard jexl

我在我的应用程序中使用JEXL库,似乎新的Android类收缩器无法处理它。

这是我的依赖:

compile 'org.apache.commons:commons-jexl:2.1.1'

我的构建类型定义如下:

    debug {
        versionNameSuffix "-dev"
        minifyEnabled true
        useProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

当我尝试构建它时,我收到此错误:

What went wrong: Execution failed for task ':app:transformClassesWithNewClassShrinkerForDebug'.
com.android.build.gradle.shrinker.ClassLookupException: Invalid class reference: javax/script/AbstractScriptEngine

如果我启用 useProguard 选项或将 minifyEnabled useProguard 设置为false

,则构建没有任何问题

我知道JEXL内部使用的 javax.script 在Android上不可用但我使用的部件工作得很好所以我使用这个库没有问题,除此之外。由于这个原因,Lint还引发了 InvalidPackage 类型的错误,但它可以很容易地被禁用,并且不会损害构建过程。

是否有可能让新的收缩器忽略它并继续执行Lint之类的后续步骤?

1 个答案:

答案 0 :(得分:0)

JEXL库是指javax.script.AbstractScriptEngine和许多其他不属于Android运行时(android.jar)的类,因此ProGuard会警告某些内容可能会被破坏。如果您确定您的应用程序仍然有效,您可以在proguard-android.txt中指定以下行

-dontwarn javax.script.**
-dontwarn org.apache.commons.logging.**
-dontwarn java.beans.**

现在,大多数警告已经消失,但经过大量搜索后,我仍然不知道如何修复最后警告:

[proguard] Warning: org.apache.commons.jexl3.scripting.JexlScriptEngine: can't find referenced field 'javax.script.ScriptContext context' in class org.apache.commons.jexl3.scripting.JexlScriptEngine