Ответ
Один из запоминающихся багов — утечка памяти из-за неправильной работы с RecyclerView.Adapter. В onBindViewHolder я сохранял ссылку на ViewHolder в статический список для "быстрого доступа", что привело к удержанию всех View и их контекстов. Приложение падало после прокрутки нескольких экранов.
Исправление:
// Было (плохо):
static List<ViewHolder> holders = new ArrayList();
// Стало:
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
// Чистим ссылки
}
Вывод: никогда не храните ссылки на View или Context в статике.