Renderscript 破坏了 AndroidX?

Renderscript broken with AndroidX?

自从我迁移到 androidx 后,我无法制作 Renderscript 运行。我收到以下异常:

2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.ClassNotFoundException: Didn't find class "android.support.v8.renderscript.RenderScript" on path: DexPathList[[zip file "/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk"],nativeLibraryDirectories=[/data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/lib/arm64, /data/app/pl.qus.xenoamp2-xHJAddeg9oM-uGSxlvMp7A==/base.apk!/lib/arm64-v8a, /system/lib64, /system/vendor/lib64]] 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:93) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:379) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:1099) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at void java.lang.Runtime.loadLibrary0(java.lang.ClassLoader, java.lang.String) (Runtime.java:1014) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at void java.lang.System.loadLibrary(java.lang.String) (System.java:1657) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at androidx.renderscript.RenderScript androidx.renderscript.RenderScript.internalCreate(android.content.Context, int, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1408) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, int, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1599) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, androidx.renderscript.RenderScript$ContextType, int) (RenderScript.java:1549) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context, androidx.renderscript.RenderScript$ContextType) (RenderScript.java:1525) 2018-10-12 16:27:58.328 27195-27195/pl.qus.xenoamp2 A/zygote64: java_vm_ext.cc:504] at androidx.renderscript.RenderScript androidx.renderscript.RenderScript.create(android.content.Context) (RenderScript.java:1512)

我在 gradle 中有常用条目:

    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true

我还需要更改什么吗?

我有同样的问题,我切换到不支持的 renderscript 版本

在项目中gradle

renderscriptTargetApi 17
renderscriptSupportModeEnabled false

并在 class 中使用 renderscript

import android.renderscript.RenderScript

而不是

import androidx.renderscript.RenderScript

它为我完成了工作,但我不喜欢这个解决方案,待完成

标记的答案确实使它起作用,但正如@Zee 提到的,non-support 常规渲染脚本似乎删除了 64 位兼容性。现在,当我尝试发布我的应用程序时,我从 Google Play 控制台收到了一条警告消息。所以我想如果我们还在使用 renderscript,我们将不得不继续使用支持版本,而不是暂时迁移到 AndroidX。

构建工具(确切地说是预构建 librsjni_androidx.so)存在问题,现已在版本 29.0.2 中修复。

我已经通过将编译 sdk 升级到 API 29 并将构建工具升级到 29.0.2 来验证这一点。

编辑: 这是我在 build.gradle:

中配置的
    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true

我可以通过将 buildToolsVersion 的版本更改为 29.0.2 并将 renderscriptTargetApi 的版本更改为 29 来解决问题:

android {
    // ...
    buildToolsVersion '29.0.2'
    defaultConfig {
        // ...
        renderscriptTargetApi 29
        renderscriptSupportModeEnabled true
    }
    // ...
}

在我的 gradle 模块文件中我有:

renderscriptTargetApi 19
renderscriptSupportModeEnabled true

而且,在迁移到 AndroidX 之前,我有以下导入:

import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.Matrix4f;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.support.v8.renderscript.ScriptIntrinsicColorMatrix;
import android.support.v8.renderscript.ScriptIntrinsicConvolve3x3;

迁移到AndroidX后,就像文档说的那样:

我在我的 gradle 模块文件中保留了相同的语句,但我升级到 buildToolsVersion 29.0.2 和我的 compileSdkVersion 到 28

我把之前的导入改成了下面的,一切正常。

import androidx.renderscript.Matrix4f;
import androidx.renderscript.RenderScript;
import androidx.renderscript.Allocation;
import androidx.renderscript.Element;
import androidx.renderscript.ScriptIntrinsicBlur;
import androidx.renderscript.ScriptIntrinsicColorMatrix;
import androidx.renderscript.ScriptIntrinsicConvolve3x3;

我遇到了同样的问题。唯一对我有用的东西(在尝试了其中一些之后)是更新到最新的构建工具版本 (29.0.3),我不确定这些问题最初发布时是否存在:

buildToolsVersion '29.0.3'

我通过添加 proguard 来修复: 我得到了 google 支持者 here

的答复
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# RenderScript to be safe on "native callback" side
-keep class androidx.renderscript.** { *; }
android {
    //...
    defaultConfig {
        //...

        renderscriptTargetApi 21
        renderscriptSupportModeEnabled true
    }
}