带有RenderScript支持库的IllegalAccessError

时间:2014-04-07 09:12:57

标签: java android unit-testing gradle renderscript

我正在开发一个旨在使用Renderscript支持库的应用程序。 对于开发,使用Android Studio 0.5.4和Gradle 1.11。

要配置renderscript我使用

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 19
        renderscriptTargetApi 19
        renderscriptSupportMode true

    }
}

这适用于2.3和4.4.2。

在我的第一个屏幕之后,我想写一些测试文档。 Atm我使用ActivityUnitTestCase作为测试的祖先。 我的测试代码在src / androidTest / java中,并由Android Studio标识为src目录。我还可以使用真实设备成功启动测试用例。测试用例本身只验证了几个视图的存在。但是由于以下原因导致测试失败:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

在堆栈跟踪中,我看到它在第一个renderscript调用之前不久触发。查看生成的(未混淆的)apk,显示Instrumentation Test apk包含android.support.v8.renderscript包。

因此出现异常是因为正在测试的apk和测试包括renderscript包。

我的问题:如何预防?

我使用了几个库,它们没有出现在测试apk中。只是renderscript库与dex文件和共享对象一起使用。我认为它由于其深刻的原生复杂性而被处理的不同于像九龙等等的库。

我的Google-Fu透露,只有解决方法,其中一个是http://www.sinking.in/blog/android-dependency-double-trouble/ 其中还提到了遗传问题http://issues.gradle.org/browse/GRADLE-784

但是这里提到的修补程序中没有一个适用于renderscript lib。

我感谢任何提示。谢谢。

2 个答案:

答案 0 :(得分:2)

对于处理支持renderscript lib的当前gradle逻辑似乎是一个限制。 我通过将renderscript-v8.jar和预先打包的* .so文件从/build-tools/19.0.3/renderscript复制到相应的项目来解决它。

* .so文件添加在main / jniLibs下,并自动检测并部署到适当的构建变体(arm7,mips,x86)。

需要在gradle文件中声明jar,因为构建系统默认忽略jar文件:

dependencies{
    compile files('libs/renderscript-v8.jar')
}

这种方法的好处是,当构建测试apk时,renderscript支持包未部署在测试apk中,因此测试运行时不会干扰问题中提到的错误(java.lang.IllegalAccessError:Class ref in预先验证的类已解决为意外实现)

使用

会更聪明
renderscriptTargetApi 19
renderscriptSupportMode true

因为这样,当前的性能增强功能将应用于相应的应用程序,并且看起来更干净,因此更易于维护。但是对于我的部分可测试性>更新行为的开销减少。

一旦renderscriptSupportMode指令正常工作,我就会切换回来。

答案 1 :(得分:0)

根据这个stackoverflow答案(etsy的开发人员),renderscript不能用于gradle。 Blur effect like in the app Etsy? 我不知道为什么,就在几天前读完这篇文章。