¿Por qué AOSP agrega nuevas API para admitir bibliotecas sin agregarlas al SDK?

He estado desarrollando para Android desde hace unos meses, y esta pregunta se plantea una y otra vez: ¿cuál es la motivación detrás de la adición de características completamente nuevas (API) para admitir bibliotecas sin que estén disponibles en el SDK estándar?

Ejemplo:

FragmentTabHost API está disponible sólo a través de android.support.v4.app.FragmentTabHost . Está bien la mayoría del tiempo, pero si quieres usar fragmentos anidando y PreferenceFragment juntos, estás muerto en las aguas – anidar requiere que cambies a android.support.v4.app.Fragment (para soportar debajo de 4.2), pero no hay implementación de PreferenceFragment en esta lib de soporte. Como consecuencia, puede implementar soluciones personalizadas o utilizar bibliotecas de terceros que ya las han implementado (consulte esta pregunta )

Edit: como lo señaló @eugen en su respuesta, yo mismo referenciado FragmentTabHost de apoyo-v13, que apoya Fragmentos nativos. Sin embargo, esta información no cambia la pregunta general. De hecho, si hubiera usado esta API con fragmentos de anidación, mi aplicación no se ejecutaría en ~ 30% de los dispositivos de hoy (fragmentos nativos apoyo de anidación a partir de 4.2 en adelante).

Ejemplo:

Otro problema que he encontrado hoy (y desperdiciado demasiado tiempo en) es con ActionBarDrawerToggle disponible a través de android.support.v7.app.ActionBarDrawerToggle . Quise usar esta funcionalidad, por lo tanto agregué todo el com.android.support:appcompat-v7:21.0.+ a las dependencias del proyecto. Supongo que esto va a hacer, pero estaba equivocado – mi aplicación no compilar (falta de recursos referenciados por la biblioteca de soporte). Después de probar algunos trucos de la web, encontré esta pregunta que finalmente proporcionó la solución. En resumen: la biblioteca de soporte v7 tiene dependencia en SDK, por lo tanto tuve que definir compileSdkVersion 21 .

Consecuencias:

Ahora, me digo a mí mismo: FragmentTabHost no se han añadido a ninguna versión de SDK aún, lo que implica que incluso 4-5 años a partir de ahora los desarrolladores seguirán utilizando el soporte v4 lib para proporcionar esta funcionalidad (porque incluso si esta API se añade hoy , se necesitarán años para poder asumir con seguridad que todos los dispositivos de destino lo soportan de forma nativa), ¿verdad? El mismo argumento se aplica a android.support.v4.widget.DrawerLayout y otras API presentes sólo en bibliotecas de soporte.

Si los desarrolladores están obligados a usar bibliotecas de soporte durante años, esto también implica que están obligados a experimentar los problemas de inconsistencia / dependencia anteriores mucho después de que estos problemas ya podrían haber sido resueltos, ¿verdad?

Pregunta:

¿Por qué Google quiere mantener estas bibliotecas para siempre? ¿No será mejor para todos si todas las nuevas API se agregaran a SDK en paralelo con las librerías de compatibilidad, de modo que las bibliotecas de compatibilidad podrían envejecer y "retirarse" en algún momento?

Editar: después de la respuesta de @ eugen ahora estoy perplejo aún más – algunas API "evolucionan" con libs de soporte más recientes, pero no lo convierten en SDK principal (como FragmentTabHost, que evolucionó de soporte-v4 a support-v7). ¿Cuál es la razón para no agregarlos al SDK?

FragmentTabHost API está disponible sólo a través de android.support.v4.app.FragmentTabHost.

Incorrecto. El enlace que proporcionaste conduce a android.support.v13.app.FragmentTabHost que (en contraposición a android.support.v4.app.FragmentTabHost ) funciona con Fragment nativos s pero hace que las APIs introducidas por encima de la API 13 estén disponibles desde la API 13 .

En resumen: la biblioteca de soporte v7 tiene dependencia en SDK, por lo tanto tuve que definir compileSdkVersion 21.

Por supuesto la versión 21 de la biblioteca necesita la versión 21 de herramientas y la versión 21 de SDK. Utilice siempre las versiones correspondientes de las herramientas de compilación, compile SDK y admita bibliotecas!

A partir de hoy se recomiendan estos valores:

 compileSdkVersion 22 buildToolsVersion '22.0.1' targetSdkVersion 22 compile 'com.android.support:support-v4:22.0.0' compile 'com.android.support:appcompat-v7:22.0.0' // includes support-v4 compile 'com.android.support:support-v13:22.0.0' // includes support-v4 

Ahora, me digo a mí mismo: FragmentTabHost no se han añadido a ninguna versión de SDK todavía, lo que implica que incluso 4-5 años a partir de ahora los desarrolladores seguirán utilizando el soporte-v4 lib para proporcionar esta funcionalidad (porque incluso si esta API se añade hoy , se necesitarán años para poder asumir con seguridad que todos los dispositivos de destino lo soportan de forma nativa), ¿verdad?

Lo que significa que si lo implementas usando la biblioteca support-v13 , no tienes nada de qué preocuparte. Va a funcionar hasta la API 13.

Lea acerca de la diferencia entre support-v4 y support-v13 .

¿Por qué Google quiere mantener estas bibliotecas para siempre?

Porque es muy probable que desee soportar plataformas más antiguas. Lo que significa que necesita una biblioteca de soporte.

Incluso ahora se utiliza ActionBarActivity de appcompat-v7 (que originalmente estaba destinado a la barra de acción de backport a la API 7) con minSdkVersion 14 porque desea que el backport de diseño de material. Esto también significa que estás atrapado con fragmentos de soporte porque ActionBarActivity está utilizando.

¿No será mejor para todos si todas las API nuevas se agregaran al SDK en paralelo con las librerías de compatibilidad, de modo que las bibliotecas de compatibilidad podrían envejecer y "renunciar" en algún momento?

Las bibliotecas de soporte envejecen. Es posible que haya notado que recyclerview-v7 (y otras bibliotecas android recientes) está disponible desde API 7 y no API 4. Y también puede haber notado que RecyclerView no está en el SDK nativo. ¿Por qué lo agregaría a un SDK nativo, haciéndolo disponible sólo para la plataforma más nueva cuando pueda publicar una biblioteca de soporte que la haga disponible para todos?

  • ¿Pueden las aplicaciones Android 4.0 funcionar con dispositivos Android 2.0 y Android 3.0?
  • Yii Framework y Aplicación para Android
  • Modificación de la capa LayerDrawable en Android 2.3 .X (Gingerbread) e inferior
  • Fragmentos onResume de la pila trasera
  • Cómo utilizar appcompat-v7 con Android API 19
  • Compatibilidad del edificio PreferenceFragment en Android
  • ¿Es arm64-v8a compatible con armeabi-v7a?
  • Optimización del archivo de manifiesto de Android para el mayor número de dispositivos compatibles
  • Android Support Library ActionBar no funciona en el dispositivo 2.3
  • No se puede importar ActionBar en Android App con compatibilidad con versiones anteriores
  • IOS OpenGL ES compatible con Android OpenGL ES?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.