Кнопка Android ImageButton не отображает изображение при запуске в режиме выпуска

Я пытаюсь использовать ImageButton для отображения ресурса, а .png в качестве кнопки, на которую можно нажать. Когда я запускаю свое приложение в режиме отладки, ImageButton правильно передает изображение.

введите здесь описание изображения

Однако, когда я запускаю приложение в режиме выпуска, ImageButton не отображает возможность рисования:

введите здесь описание изображения

Я создаю и программно заполняю свои ImageButtons:

    private void setupButtons() {

        FlexboxLayout layout = view.findViewById(R.id.telcosLayout);
        final Activity activity = getActivity(); 

        // Telcom is an enum
        for (final Telcom t : Telcom.values()) {
            ImageButton b = new ImageButton(activity);

            int id = getId(t.toString().toLowerCase().replace(" ", "_") + "_logo", R.drawable.class);
            Log.i(TAG, "id is " + id);
            b.setImageResource(id);

            layout.addView(b);

            b.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    scanButtonListener.onShowScanButton(t);
                }
            });

        }
    }

И вывод моих журналов при запуске в режиме выпуска:

2019-10-13 11:07:49.500 25757-25757/? I/select telcome: id is 2131165284
2019-10-13 11:07:49.501 25757-25757/? I/select telcome: id is 2131165320

А вот логи запуска приложения в режиме отладки:

2019-10-13 11:12:22.575 26146-26146/com.glan.input I/select telcome: id is 2131165284
2019-10-13 11:12:22.583 26146-26146/com.glan.input I/select telcome: id is 2131165320

Кажется, что в обоих режимах находятся одни и те же чертежи, но по какой-то причине они не отображаются в режиме выпуска. Что здесь происходит?

Я проверил, что drawable существует для всех плотностей экрана от drawable-ldpi до drawable-xxxhdpi.

Я также обнаружил, что если я жестко кодирую b.setImageResource(2131165284); на основе строк журнала, ImageButton отображает одно и то же изображение для обеих кнопок как в режиме отладки, так и в режиме выпуска, что является ожидаемым поведением.

введите здесь описание изображения

Почему динамическая настройка ресурса не работает в режиме выпуска?

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что нашел проблему. Мой режим сборки выпуска имеет следующие свойства:

        release {
            minifyEnabled true
            shrinkResources true
            debuggable true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
            signingConfig = signingConfigs.release
        }

Когда я отключил shrinkResources, закомментировав его, изображения снова появились. Похоже, что, основываясь на minifyEnabled vs shrinkResources - какая разница? и как получить сэкономленное пространство?, ProGuard обнаруживает, что ресурсы, от которых я зависим, .png drawables, не используются, потому что они запрашиваются динамически, и поэтому shrinkResources полностью их удаляет.

Кто-нибудь знает, как обойти это?


person Paymahn Moghadasian    schedule 13.10.2019    source источник


Ответы (2)


Хорошо, я нашел ответ. Решение, которое сработало для меня, состояло в том, чтобы использовать tools:keep из https://developer.android.com/studio/write/tool-attributes#toolskeep, чтобы целенаправленно сохранять эти ресурсы, даже если shrinkResources установлено на true.

См. также https://stackoverflow.com/a/50703322/1489726

person Paymahn Moghadasian    schedule 13.10.2019

Вы проверили, не происходит ли это из-за того, что изображение занимает слишком много ресурсов? Насколько великом файл изображения? Это тот же размер, что и кнопка?

Android не позволит приложению в режиме выпуска, чтобы взять так много ресурсов. Я бы предложил вам использовать библиотеку, такую ​​как Picasso для установки ресурса изображения на ImageButton. Picasso будет обрабатывать размер ресурса для самого экрана и самого размера кнопки.

И он также очень прост в использовании.

Picasso.get (). Загрузить (r.drawable.your_image_resource) .into (yourimagebutton);

https://square.github.io/picasso/

person Chiranjeev Jain    schedule 13.10.2019