Java 带有RenderScript支持库的IllegaAccessError
我正在开发一个应用程序,它将使用Renderscript支持库。 对于开发,使用Android Studio 0.5.4和Gradle 1.11 要配置renderscript,我使用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
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支持