RenderScript:不要在aar

时间:2016-11-30 10:50:39

标签: android renderscript aar

我目前正在构建SDK,并为SDK用户提供.aar存档。

我的SDK中有一个可选功能,基本上模糊了图像。 但是,此功能需要使用renderScript,因为存在共享库,会使.aar存档更大。

./jni/armeabi-v7a:
total 3752
rw-rr- 1 cylix wheel 1,1M 29 nov 16:16 libblasV8.so
rw-rr- 1 cylix wheel 746K 29 nov 16:16 libRSSupport.so
rw-rr- 1 cylix wheel 46K 29 nov 16:16 librsjni.so
./jni/mips:
total 5224
rw-rr- 1 cylix wheel 1,5M 29 nov 16:16 libblasV8.so
rw-rr- 1 cylix wheel 1,0M 29 nov 16:16 libRSSupport.so
rw-rr- 1 cylix wheel 70K 29 nov 16:16 librsjni.so
./jni/x86:
total 5344
rw-rr- 1 cylix wheel 1,6M 29 nov 16:16 libblasV8.so
rw-rr- 1 cylix wheel 958K 29 nov 16:16 libRSSupport.so
rw-rr- 1 cylix wheel 54K 29 nov 16:16 librsjni.so
./jni/arm64-v8a:
total 1808
rw-rr- 1 cylix wheel 843K 29 nov 16:16 libRSSupport.so
rw-rr- 1 cylix wheel 60K 29 nov 16:16 librsjni.so

但是我注意到如果我删除了库并且没有在.aar中提供它们,那么库的客户端仍然可以启用renderScript并且可以毫无问题地访问该功能。

然后,我只需要检查我的代码是否有可用的渲染:

    try {
        Class.forName("android.support.v8.renderscript.RenderScript");
    } catch (ClassNotFoundException e) {
        //! renderScript not available
    }

但这是我的问题。 我仍然需要输入我的gradle文件:

renderscriptTargetApi 23
renderscriptSupportModeEnabled true

否则,项目无法编译。 但这会导致自动包含上面列出的.so文件......

有没有办法解决这个问题:能够编译renderScript功能但是过滤.so文件以便它们不包含在.aar存档中吗?

3 个答案:

答案 0 :(得分:2)

我相信有更好的解决方案。但这里的低调成果是使用com.android.tools.build:gradle:2.2.0或更高版本。

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.1'
    // ...
}
除非您指定renderscriptSupportModeBlasEnabled true,否则

gradle插件2.2.0+不会捆绑libblasV8.so。这样,您的AAR文件可能会减少50%的重量。

答案 1 :(得分:1)

苗的回答对我有用,但我还有一些想法。

如果你需要的只是模糊,你可以一起避免support.v8,只使用原生的RenderScript sdk。

这取决于您的minSdkVerison和需求。 17中添加了ScriptIntrinsicBlur,或者您也可以使用自定义.rs内核。它的性能不如ScriptIntrinsic,但它可以让你支持旧版本。

答案 2 :(得分:0)

好的,我找到了一个解决方案。也许不是干净的,但至少它有效。

我只是从我计算机的android SDK库中复制了renderscript-v8.jar,并将其作为依赖项放入我的项目中。

然后,我删除了renderscript的Gradle文件配置

renderscriptTargetApi 23
renderscriptSupportModeEnabled true

这样,我可以编译感谢.jar,我的.aar中没有任何重的.so因为Gradle不再自动构建它们。

然后,我的SDK的用户可以选择是否启用renderscript。