Java 带有RenderScript支持库的IllegaAccessError

Java 带有RenderScript支持库的IllegaAccessError,java,android,unit-testing,gradle,renderscript,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 renderscr

我正在开发一个应用程序,它将使用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中,由androidstudio标识为src目录。我还可以使用真实的设备成功地启动测试用例。测试用例本身只是验证了几个视图的存在。但是,由于以下原因,测试失败:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
在堆栈跟踪的更深处,我看到它在第一次renderscript调用之前不久被触发。查看生成的(未混淆的)apk内部,可以发现插装测试apk包含android.support.v8.renderscript包

因此出现异常是因为测试中的apk和测试都包含renderscript包

我的问题是:如何预防

我使用了几个库,它们没有出现在测试apk中。只有renderscript库可以处理dex文件和共享对象。我认为这是由于它本身的复杂性,它的处理方式与库(如NineodelDroids等)不同

我的Google Fu透露,只有一些变通办法,其中之一就是 这也提到了继承问题

但是这里提到的修复没有一个适用于renderscript库


我感谢你的任何暗示。谢谢。

根据stackoverflow的回答(etsy的一名开发人员),renderscript不适用于gradle。
我不知道为什么,几天前刚刚读过这篇文章。

这似乎是对当前处理support renderscript库的gradle逻辑的限制。 我通过将renderscript-v8.jar和预打包的*.so文件从/build tools/19.0.3/renderscript复制到适当的项目来解决这个问题

*.so文件添加在main/jniLibs下,自动检测并部署到相应的构建变量(arm7、mips、x86)

jar需要在gradle文件中声明,因为buildsystem默认忽略jar文件:

dependencies{
    compile files('libs/renderscript-v8.jar')
}
这种方法的好处是,在构建测试apk时,renderscript支持包没有部署在测试apk中,因此测试运行时不会受到问题中提到的错误的干扰(java.lang.IllegalacessError:Class ref in pre-verified Class resolved to unexpected implementation)

使用它会更明智

renderscriptTargetApi 19
renderscriptSupportMode true
因为这样,当前的性能增强将应用于适当的应用程序,并且它看起来更干净,因此更易于维护。但就我而言,可测试性>更新行为的开销更少


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

如果您使用下面的gradle片段作为模板,甚至不必在代码中加载本机部分,库就会这样做,gradle会添加mips、arm和x86的风格。并构建它们(也是本地的)。我在x86模拟器和arm设备上对此进行了测试。我只是将abi过滤器设置为arm7而不是arm,因为目前还没有arm5/6支持