RenderScript 和 PlayStore 64 位要求
RenderScript and PlayStore 64-bit requirement
更新:
好的,所以我进一步研究了这一点。设法使用 bundletool 来尝试测试不同的 apk,并发现了这个:
"App Bundle contains 32-bit RenderScript bitcode file (.bc) which disables 64-bit support in Android."
有谁知道我该如何解决这个问题?渲染脚本构成了项目中非常重要的一部分。
我正在尝试让我的应用程序与 64 位兼容,以满足新的 PlayStore 要求。我们确实在应用程序中使用了 RenderScript,所以我想知道这是否会导致问题?而且,如何解决这些问题? renderscript 是一个非常小的脚本,它根据输入输出带有绿色或红色部分的位图。
#pragma version(1)
#pragma rs java_package_name(za.co.overtake)
int*reds;
int*greens;
int*blues;
int imgWidth;
uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {
bool colourme = false;
for(int col = 0; col < imgWidth; col++){
const int red = reds[col];
const int green = greens[col];
const int blue = blues[col];
if (in.r == red && in.g == green && in.b == blue){
colourme = true;
}
}
if (colourme) {
// Cannot increase red amount much as it will cause issues when capturing the image in 565
// format.
in.r = 100;
in.g = 10;
in.b = 10;
in.a = 100;
} else if (in.a > 200) {
in.r = 21;
in.g = 63;
in.b = 81;
in.a = 100;
} else {
in.r = 0;
in.g = 0;
in.b = 0;
in.a = 0;
}
return in;
}
我们在 java 中这样调用这个脚本:
final RenderScript rs = RenderScript.create(this);
final Allocation input = Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT | Allocation.USAGE_SHARED);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptC_singlesource script = new ScriptC_singlesource(rs);
Allocation red = Allocation.createSized(rs, Element.I32(rs), reds.length);
red.copyFrom(reds);
script.bind_reds(red);
Allocation green = Allocation.createSized(rs, Element.I32(rs), greens.length);
green.copyFrom(greens);
script.bind_greens(green);
Allocation blue = Allocation.createSized(rs, Element.I32(rs), blues.length);
blue.copyFrom(blues);
script.bind_blues(blue);
script.set_imgWidth(noOfColours);
script.forEach_root(input, output);
output.copyTo(bitmap);
RenderScript blur = RenderScript.create(this);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(blur, Element.U8_4(blur));
Allocation tmpIn = Allocation.createFromBitmap(blur, bitmap);
Allocation tmpOut = Allocation.createFromBitmap(blur, bitmap);
theIntrinsic.setRadius(4.0f);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(bitmap);
Android 开发人员文档指出,使用任何 C 或 C++ 代码可能会使您的应用不兼容。但是,我找不到专门针对 RenderScript 的解决方案。
好的,事实证明我必须做两件事:
使用更新版本的 Renderscript。我以 22 为目标,并将 renderscriptSupportModeEnabled 设置为 true。另外,必须确保我使用的是 android.support.v8.renderscript.RenderScript 而不是 android.Renderscript.
还原 AndroidX。这是一个使命!不得不去掉 androidX,因为出于某种原因,它拒绝与 Renderscript 很好地配合。例如,它会在 Android5 上崩溃并且拒绝与 64 位兼容。
我希望这对外面的人有帮助!
O,最后一点:您可以使用 bundletool 测试您的包是否兼容 64 位。我发现这个网站非常有用:https://www.raywenderlich.com/9043-android-app-bundles-getting-started
-- 如果无法构建 64 位 apk,它会告诉您。
更新:又一个发现!
因此,按照所有这些步骤,您会注意到所有 64 位文件夹都在您的 APK 中生成。但是,如果您使用的是不具备所有 64 位要求的外部库:GOOGLE WILL NOT PICK THIS UP!它似乎只检查文件夹是否存在,而不检查每个文件夹中所需的所有内容是否存在。这导致我的 renderscript 项目成为 'compatible',即使它使用了 x86_64 缺失的库! (长话短说:我的其他项目不想以 64 位兼容的方式工作,我最终在库中找到了它并且没有使用 renderscript。我的解决方案是删除对 x86 的支持,因为我们在我的国家/地区没有这些设备无论如何。)
更新:使用最新的 BuildToolsVersion (29.0.3) 以及 androidX,似乎工作正常:D!
还有
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
更新: 好的,所以我进一步研究了这一点。设法使用 bundletool 来尝试测试不同的 apk,并发现了这个:
"App Bundle contains 32-bit RenderScript bitcode file (.bc) which disables 64-bit support in Android."
有谁知道我该如何解决这个问题?渲染脚本构成了项目中非常重要的一部分。
我正在尝试让我的应用程序与 64 位兼容,以满足新的 PlayStore 要求。我们确实在应用程序中使用了 RenderScript,所以我想知道这是否会导致问题?而且,如何解决这些问题? renderscript 是一个非常小的脚本,它根据输入输出带有绿色或红色部分的位图。
#pragma version(1)
#pragma rs java_package_name(za.co.overtake)
int*reds;
int*greens;
int*blues;
int imgWidth;
uchar4 RS_KERNEL root(uchar4 in, uint32_t x, uint32_t y) {
bool colourme = false;
for(int col = 0; col < imgWidth; col++){
const int red = reds[col];
const int green = greens[col];
const int blue = blues[col];
if (in.r == red && in.g == green && in.b == blue){
colourme = true;
}
}
if (colourme) {
// Cannot increase red amount much as it will cause issues when capturing the image in 565
// format.
in.r = 100;
in.g = 10;
in.b = 10;
in.a = 100;
} else if (in.a > 200) {
in.r = 21;
in.g = 63;
in.b = 81;
in.a = 100;
} else {
in.r = 0;
in.g = 0;
in.b = 0;
in.a = 0;
}
return in;
}
我们在 java 中这样调用这个脚本:
final RenderScript rs = RenderScript.create(this);
final Allocation input = Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT | Allocation.USAGE_SHARED);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptC_singlesource script = new ScriptC_singlesource(rs);
Allocation red = Allocation.createSized(rs, Element.I32(rs), reds.length);
red.copyFrom(reds);
script.bind_reds(red);
Allocation green = Allocation.createSized(rs, Element.I32(rs), greens.length);
green.copyFrom(greens);
script.bind_greens(green);
Allocation blue = Allocation.createSized(rs, Element.I32(rs), blues.length);
blue.copyFrom(blues);
script.bind_blues(blue);
script.set_imgWidth(noOfColours);
script.forEach_root(input, output);
output.copyTo(bitmap);
RenderScript blur = RenderScript.create(this);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(blur, Element.U8_4(blur));
Allocation tmpIn = Allocation.createFromBitmap(blur, bitmap);
Allocation tmpOut = Allocation.createFromBitmap(blur, bitmap);
theIntrinsic.setRadius(4.0f);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(bitmap);
Android 开发人员文档指出,使用任何 C 或 C++ 代码可能会使您的应用不兼容。但是,我找不到专门针对 RenderScript 的解决方案。
好的,事实证明我必须做两件事:
使用更新版本的 Renderscript。我以 22 为目标,并将 renderscriptSupportModeEnabled 设置为 true。另外,必须确保我使用的是 android.support.v8.renderscript.RenderScript 而不是 android.Renderscript.
还原 AndroidX。这是一个使命!不得不去掉 androidX,因为出于某种原因,它拒绝与 Renderscript 很好地配合。例如,它会在 Android5 上崩溃并且拒绝与 64 位兼容。
我希望这对外面的人有帮助!
O,最后一点:您可以使用 bundletool 测试您的包是否兼容 64 位。我发现这个网站非常有用:https://www.raywenderlich.com/9043-android-app-bundles-getting-started
-- 如果无法构建 64 位 apk,它会告诉您。
更新:又一个发现! 因此,按照所有这些步骤,您会注意到所有 64 位文件夹都在您的 APK 中生成。但是,如果您使用的是不具备所有 64 位要求的外部库:GOOGLE WILL NOT PICK THIS UP!它似乎只检查文件夹是否存在,而不检查每个文件夹中所需的所有内容是否存在。这导致我的 renderscript 项目成为 'compatible',即使它使用了 x86_64 缺失的库! (长话短说:我的其他项目不想以 64 位兼容的方式工作,我最终在库中找到了它并且没有使用 renderscript。我的解决方案是删除对 x86 的支持,因为我们在我的国家/地区没有这些设备无论如何。)
更新:使用最新的 BuildToolsVersion (29.0.3) 以及 androidX,似乎工作正常:D!
还有
renderscriptTargetApi 22
renderscriptSupportModeEnabled true