Подтвердить что ты не робот

Идентификаторы ресурсов Android внезапно не окончательны, переключатель() сломан

У меня был проект Java Android некоторое время. Сегодня я обновил инструменты Android dev до последней версии Google. И проект сломался - я получаю кучу сообщений об ошибках компиляции "case expression должны быть постоянными выражениями".

Оказывается, что файл R.java теперь генерируется по-разному. Раньше у него была бы куча

public static final int MyID=0x12340000;

выражение; теперь он выглядит (после очистки/восстановления) следующим образом:

public static int MyID=0x12340000;

final исчез. Таким образом, все переключатели идентификаторов ресурсов, которые у меня были (и у меня было несколько), ошибочны. Что случилось, пожалуйста? Это только я? Какое здесь обоснование? Документировано ли это где угодно? Можно ли как-нибудь вернуть final?

4b9b3361

Ответ 1

Это произошло вчера, когда был выпущен SDK/ADT 14:

Начиная с ADT 14, константы ресурсов в библиотечных проектах больше не окончательный. Это более подробно объясняется в http://tools.android.com/tips/non-constant-fields

В нем есть quickfix, доступный из ADT 14: http://tools.android.com/recent/switchstatementconversion

Процитировать по логике:

При объединении нескольких проектов библиотеки фактические значения поля (которые должны быть уникальными) могут столкнуться. До ADT 14 все поля были окончательными, поэтому в результате все библиотеки должны были иметь все свои ресурсов и связанного Java-кода, перекомпилированного вместе с основным когда они были использованы. Это было плохо для производительности, поскольку он делал сборку очень медленно. Это также препятствовало распространению библиотеки проекты, которые не включают исходный код, ограничивающие область использования проектов библиотеки.

Причина, по которой поля больше не являются окончательными, заключается в том, что это означает, что банки библиотеки могут быть скомпилированы один раз и повторно использованы в других проектах. Помимо возможности распространения бинарной версии библиотечных проектов (приходящих на r15), это делает гораздо более быстрые сборки.