2016-11-30 56 views
0

我目前正在构建SDK,并向SDK的用户提供.aar存档。RenderScript:在aar中不提供.so

我在我的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并没有任何问题访问功能。

然后,我只是在我的代码检查的renderScript可用:

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

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

renderscriptTargetApi 23 
renderscriptSupportModeEnabled true 

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

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

回答

2

我相信有更好的解决方案。但这里的低挂果实是使用com.android.tools.build:gradle:2.2.0或更高版本。除非你指定renderscriptSupportModeBlasEnabled true

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

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

0

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

我只是从我的电脑的Android SDK库复制的renderScript-v8.jar,并把它变成我的项目作为一个依赖。

然后,我删除的renderScript的摇篮文件配置

renderscriptTargetApi 23 
renderscriptSupportModeEnabled true 

这样的话,我可以编译感谢.jar和我没有任何沉重。所以在我.aar因为摇篮不建他们中的任何一个都会自动进行

然后,我的SDK的用户既可以选择启用的renderScript与否。

+0

它的工作原理是因为您在不需要支持库回退的设备上进行测试。但这不是一个好的答案,因为当您在较旧的设备上运行时,代码在寻找这些共享对象时会崩溃。 –

1

妙的答案为我工作,但我有几个想法。

如果你需要的是模糊的,你也许能避免support.v8一起,只是使用本机的renderScript SDK。

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

相关问题