Требования RenderScript и PlayStore к 64-разрядной версии

ОБНОВИТЬ: Итак, я изучил это немного дальше. Удалось использовать 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.

7
0
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, получается, что мне нужно было сделать две вещи:

  1. Используйте более новую версию Renderscript. Я выбрал таргетинг на 22 и установил для renderscriptSupportModeEnabled значение true. ТАКЖЕ, мне нужно было убедиться, что я использую android.support.v8.renderscript.RenderScript, а не android.Renderscript.

  2. Верните 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 не сможет загрузиться, и произойдет сбой ....? Ищу исправление :'(

Zee 21.06.2019 16:02

Другие вопросы по теме