Renderscript:请勿在AAR中提供.SO



我目前正在构建一个SDK,我为SDK的用户提供了.AAR存档。

我在SDK中获得了一个可选的功能,从而基本上模糊了图像。但是,此功能需要使用RenderScript,该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,并访问该功能而没有任何问题。

然后,如果RenderScript可用,我只需要检查我的代码:

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

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

renderscriptTargetApi 23
renderscriptSupportModeEnabled true

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

有什么方法可以反对:能够编译rederScript功能,但要过滤.so文件,以使它们不包含在.AAR存档中?

我相信有更好的解决方案。但是这里的低悬挂水果是使用com.android.tools.build:2.2.0或更高。

dependencies {
    classpath 'com.android.tools.build:gradle:2.2.1'
    // ...
}

gradle插件2.2.0 不会捆绑libblasv8。因此,除非您指定renderscriptSupportModeBlasEnabled true。这样,您的AAR文件可能会减轻50%的重量。

miao的答案对我有用,但是我还有一些想法。

如果您需要的只是模糊,则可以避免支持。

这取决于您的Minsdkverison和需求。ScriptIntrinsicblur在17中添加,或者您也可以使用自定义.RS内核。它的性能要比ScriptIntrinsic少,但是它会让您支持旧版本。

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

我只是从我的计算机的Android SDK库中复制了Renderscript-V8.jar,然后将其作为依赖项放入项目中。

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

renderscriptTargetApi 23
renderscriptSupportModeEnabled true

这样,我可以根据.jar和我的.AAR汇编。

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

最新更新