Я развиваюсь для Android уже несколько месяцев, и этот вопрос возникает снова и снова: какова мотивация добавления абсолютно новых функций (API) для поддержки библиотек без их доступности в стандартном SDK?
Пример:
FragmentTabHost API доступен только через android.support.v4.app.FragmentTabHost
. Это нормально в большинстве случаев, но если вы хотите использовать разложение фрагментов и PreferenceFragment вместе, вы мертвы в водах - nesting требует, чтобы вы переключились на android.support.v4.app.Fragment
(для поддержки ниже 4.2), но в этой поддержке lib нет реализации PreferenceFragment. Как следствие, вы либо реализуете пользовательские обходные пути, либо используете сторонние библиотеки, которые уже реализовали их (см. этот вопрос)
Изменить: как указал @eugen в своем ответе, я сам ссылался на FragmentTabHost из support-v13, который поддерживает собственные фрагменты. Однако эта информация не меняет общий вопрос. На самом деле, если бы я использовал этот API с вложением фрагментов, мое приложение не запускалось бы на ~ 30% устройств сегодня (встроенные фрагменты поддерживают вложенность с 4.2 и далее).
Пример:
Еще одна проблема, с которой я столкнулся сегодня (и потратил слишком много времени), - это ActionBarDrawerToggle, доступный через android.support.v7.app.ActionBarDrawerToggle
. Я хотел использовать эту функциональность, поэтому я добавил все зависимости com.android.support:appcompat-v7:21.0.+
к зависимостям проекта. Я догадался, что это будет сделано, но я ошибся - мое приложение не скомпилировало (недостающие ресурсы, на которые ссылается библиотека поддержки). Попробовав несколько трюков из Интернета, я нашел этот вопрос, который, наконец, предоставил решение. Короче: библиотека поддержки v7 имеет зависимость от SDK, поэтому мне пришлось определить compileSdkVersion 21
.
Последствия:
Теперь я говорю себе: FragmentTabHost еще не добавлен ни в одну версию SDK, а это означает, что даже через 4-5 лет разработчики будут продолжать использовать поддержку-v4 lib для обеспечения этой функциональности (потому что даже если этот API добавляется сегодня, потребуется несколько лет, прежде чем вы сможете смело предположить, что все целевые устройства поддерживают его изначально), правильно? Тот же аргумент применяется к android.support.v4.widget.DrawerLayout
и другим API, представленным только в библиотеках поддержки.
Если разработчики обязались использовать библиотеки поддержки в течение многих лет, это также означает, что они должны испытывать вышеупомянутые проблемы несоответствия/зависимости долго после того, как эти проблемы могут быть уже решены, правильно?
Вопрос:
Почему Google хочет хранить эти библиотеки навсегда? Не будет ли лучше для всех, если бы все новые API были добавлены в SDK параллельно с библиотеками совместимости, чтобы библиотеки совместимости могли возрасти и "уйти в отставку" в какой-то момент?
Изменить: после ответа @eugen. Я теперь озадачен еще больше - некоторые API "развиваются" с новыми библиотеками поддержки, но не попадают в основной SDK (например, FragmentTabHost, который развился из поддержки-v4 в поддержку-v7), В чем причина не добавления их в SDK?