ОБНОВИТЬ: Итак, я изучил это немного дальше. Удалось использовать bundletool, чтобы попробовать и протестировать разные apk, и нашел это:
«App Bundle содержит 32-битный файл битового кода RenderScript (.bc), который отключает 64-битную поддержку в Android».
Я пытаюсь сделать свое приложение 64-битным совместимым с новым требованием PlayStore. Мы используем 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 Developer указано, что использование любого кода C или C++ может сделать ваше приложение несовместимым. Но я не смог найти решение конкретно для RenderScript.
Итак, получается, что мне нужно было сделать две вещи:
Используйте более новую версию Renderscript. Я выбрал таргетинг на 22 и установил для renderscriptSupportModeEnabled значение true. ТАКЖЕ, мне нужно было убедиться, что я использую android.support.v8.renderscript.RenderScript, а не android.Renderscript.
Верните AndroidX. Это была миссия! Пришлось убрать androidX, так как по какой-то причине он просто отказывался хорошо работать с Renderscript. Например, он вылетал на Android5 и просто отказывался быть совместимым с 64-битной версией.
Я надеюсь, что это поможет кому-то там!
O, и в качестве последнего лакомого кусочка: вы можете проверить, совместим ли ваш пакет с 64-битной версией, с помощью bundletool. Я нашел этот сайт чрезвычайно полезным: https://www.raywenderlich.com/9043-android-app-bundles-getting-started
-- он сообщит вам, если не сможет собрать 64-битные apks.
ОБНОВЛЕНИЕ: Еще одно открытие! Итак, выполнив все эти шаги, вы заметите, что все 64-битные папки генерируются в вашем APK. Однако, если вы используете внешнюю библиотеку, которая не соответствует всем 64-битным требованиям: GOOGLE НЕ ПОДНИМЕТ ЭТО! Кажется, он только проверяет наличие папок и не проверяет наличие всего содержимого, необходимого в каждой папке. Это привело к тому, что мой проект с renderscript стал «совместимым», хотя он использовал библиотеку, в которой x86_64 отсутствовал! (Короче говоря: мои другие проекты не хотели работать как 64-битные совместимые, и я, наконец, отследил их в библиотеке, а НЕ с использованием рендерскрипта. Мое решение состояло в том, чтобы удалить поддержку x86, поскольку у нас нет таких устройств в моей стране. в любом случае.)
ОБНОВЛЕНИЕ: использование последней версии BuildToolsVersion (29.0.3) вместе с androidX работает нормально: D!
Также есть
renderscriptTargetApi 22
renderscriptSupportModeEnabled true
хорошо, так что все работает нормально - ЗА ИСКЛЮЧЕНИЕМ Android6 решил, что ЕСЛИ вы устанавливаете с помощью пакета приложений вместо простого apk, тогда Renderscript не сможет загрузиться, и произойдет сбой ....? Ищу исправление :'(