Я пытаюсь использовать ImageButton
для отображения ресурса, а .png
в качестве кнопки, на которую можно нажать. Когда я запускаю свое приложение в режиме отладки, ImageButton
правильно передает изображение.
Однако, когда я запускаю приложение в режиме выпуска, ImageButton
не отображает возможность рисования:
Я создаю и программно заполняю свои ImageButton
s:
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
полностью их удаляет.
Кто-нибудь знает, как обойти это?