我目前正在构建一个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。