El lamentable estado de la fragmentación de Android: un ejemplo para comprender la difícil situación de los desarrolladores

El usuario promedio de Android probablemente hace tiempo que dejó de preocuparse por el "problema de fragmentación" de Android. Pero el problema sigue atormentando a los desarrolladores.

La fragmentación ha sido un tema polémico en Android, literalmente, desde que se anunció el sistema operativo móvil.

Además de ser un garrote para que los trolls lo utilicen en guerras incendiarias en línea, la diversidad que conlleva la fragmentación ahora se considera en gran medida como una positivo neto para los consumidores de dispositivos Android. Después de todo, tenemos tanta libertad para elegir el tipo de dispositivo con el tipo de software que queremos que al consumidor medio le resulta difícil preocuparse por la fragmentación. Visualizar la increíble variedad de dispositivos Android produce un hermoso mosaico de la diversa representación de Android.

Un ejemplo de fragmentación de dispositivos Android basado en instalaciones de aplicaciones de la aplicación OpenSignal. Fuente: señal abierta

Pero la fragmentación de hardware y software no hace feliz al desarrollador de software. De hecho, todo lo contrario. Desarrollar una aplicación con tantas configuraciones diferentes de hardware y software puede resultar una gran molestia a la hora de depurar. Los OEM pueden realizar cambios importantes o sutiles que deben tenerse en cuenta al desarrollar una aplicación, pero en realidad no existe una manera fácil para que el desarrollador individual se asegure de que su aplicación funcionará universalmente. Si bien el consumidor medio hace tiempo que se olvidó del debate sobre la fragmentación, el problema todavía persigue a Android. desarrolladores de aplicaciones y aparentemente no hay nada que hacer al respecto excepto aguantar y lidiar con los errores a medida que aparecen. aparecer.


El lamentable estado de fragmentación

Un OEM en particular recibe una gran cantidad de odio por los dolores de cabeza que causan al desarrollar una aplicación: Samsung. Los desarrolladores han estado despotricando contra Samsung durante años, algunos incluso escribiendo artículos tan mordaces como "Hay un lugar especial para Samsung en el infierno de Android" que describe un error particularmente frustrante derivado de Dispositivos Samsung y la biblioteca de compatibilidad de aplicaciones. Me gustaría llamar la atención sobre un párrafo en particular del discurso del Sr. Ambri, que describe de manera excelente por qué los desarrolladores todavía se preocupan por la fragmentación:

Si eres desarrollador de Android, tu odio por los dispositivos Samsung probablemente sea ilimitado. Más que un usuario medio, para quien Samsung es sinónimo tonto touchwiz y bloatware excesivo, desprecias a Samsung porque no tienes otra opción. Debido a Samsung cuota de mercado masiva, simplemente no puedes optar por no admitir dispositivos Samsung. Y eso es lo que más duele; ¡El hecho de que te quiten esta elección!

Esto tampoco es una perorata de los viejos años de existencia de Android: esta publicación se publicó a mediados de diciembre del año pasado. Seré sincero y diré que no estoy seguro de si este problema se ha solucionado oficialmente todavía; sin embargo, Sr. Ambri ha proporcionado una solución en su publicación para cualquiera que se tope con su perorata a través de una búsqueda en Google del bicho. Todo lo que tienes que hacer es usar ProGuard con la siguiente única línea de código:

# Samsung ruining all nice things-keep class !android.support.v7.view.menu.**, !android.support.design.internal.NavigationMenu, !android.support.design.internal.NavigationMenuPresenter, !android.support.design.internal.NavigationSubMenu, android.support.** {*;}

Eso no es tan malo, ¿verdad? Sin embargo, el problema es que esta solución se eliminó de Stack Overflow. No me malinterpretes, Stack Overflow es un gran sitio web. Pero en realidad no es una fuente ideal para descubrir soluciones para sus aplicaciones. Encontrar algo en Stack Overflow a menudo implica profundizar en los enlaces después de muchas búsquedas de prueba y error en Google. A veces, incluso encontrarás que otro usuario menciona el mismo error que tú has tenido, pero sin una solución a la vista. O incluso más frustrantes son los momentos en los que encuentras un hilo en el que el autor original afirma han encontrado una solución, pero hace tiempo que abandonaron su hilo sin instruir a otros sobre cómo solucionar el problema. asunto.

Fuente: XKCD

Un ejemplo de un problema de fragmentación sutil

Yo no soy desarrollador, pero estoy lo suficientemente familiarizado con las capacidades de Android después de años de experimentar con Tasker que comencé a pseudoprogramar mis propias soluciones a los problemas que he enfrentado. Y cuando no puedo entender algo, lo busco en Google, como hacen todos los demás. Mientras estaba en el proceso de escribir mi artículo anterior sobre Buscando actividades ocultas en la aplicación de configuración de su teléfono, me encontré con un error bastante extraño que no pude explicar. Un error exclusivo de los dispositivos Huawei.

Cada vez que intentaba iniciar ciertas actividades (como el menú "Prueba" que contiene estadísticas de uso de la aplicación) dentro de la aplicación Configuración, siempre me encontraba con un error de permiso. En particular, la aplicación que estaba usando para iniciar la actividad carecía del permiso permiso.huawei.android. HW_SIGNATURE_OR_SYSTEM. Ningún otro dispositivo que probé requirió permisos únicos para iniciar estas actividades de Configuración, solo los teléfonos que ejecutan la versión de Android de Huawei (EMUI). Un análisis de com.android.configuración reveló que ciertas actividades dentro de la aplicación Configuración estaban efectivamente bajo un nivel de protección que requería el firma o permiso del sistema.

Desafortunadamente para mí, esto significa que solo las aplicaciones instaladas en /system o las aplicaciones firmadas con el mismo firma ya que la aplicación Configuración podría abrir estas actividades usando el método que estaba intentando. Cuando busqué en Google una respuesta para este error, (lo adivinaste) encontré una Hilo de desbordamiento de pila. El desarrollador que publicó su problema se encontró con el mismo problema que yo (aunque estaba en el proceso de desarrollar una aplicación). Su problema surgió cuando intentó ejecutar el siguiente código:

<span >Intentspan><span > mainIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_MAINspan><span >,span><span >nullspan><span >);span><span >mainIntentspan><span >.span><span >addCategoryspan><span >(span><span >Intentspan><span >.span><span >CATEGORY_LAUNCHERspan><span >);span><span >Intentspan><span > pickIntent span><span >=span><span >newspan><span >Intentspan><span >(span><span >Intentspan><span >.span><span >ACTION_PICK_ACTIVITYspan><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_TITLEspan><span >,span><span >"Pick App to Play in"span><span >);span><span >pickIntentspan><span >.span><span >putExtraspan><span >(span><span >Intentspan><span >.span><span >EXTRA_INTENTspan><span >,span><span > mainIntentspan><span >);span><span >thisspan><span >.span><span >startActivityForResultspan><span >(span><span >pickIntentspan><span >,span><span > REQUEST_PICK_APPLICATIONspan><span >);span>

A juzgar por las cadenas de la intención y la página web del desarrollador, probablemente estaba intentando permitir al usuario elegir una aplicación de terceros para reproducir algunos medios. La solución, proporcionada por un desarrollador veterano Artículos comunes, era bastante simple: usar Intención. CrearSelector en lugar de ACTION_PICK_ACTIVITY. Sin embargo, por qué ¿Deberíamos implementar esta solución? Por qué ¿Huawei requiere este permiso en primer lugar? Por qué ¿Necesitábamos encontrar una respuesta en StackOverflow mediante una búsqueda de Google muy específica?


La paradoja de la elección

Para encontrar una respuesta, CommonsWare presentó un informe de error en el rastreador de errores de Android solicitando que Google investigue el problema. En particular, el desarrollador solicitó que Google prohibiera los requisitos de permisos indocumentados para impedir que aplicaciones de terceros accedan a ACTION_PICK_ACTIVITY. Al escribir estos requisitos en cts, Huawei se vería obligada a cumplir con estos cambios.

Sin embargo, para ser honesto, este error en sí no es gran cosa. Aunque ninguna otra aplicación que probé (como Tasker) pudo eludir este permiso requisito e iniciar ciertas actividades dentro de la aplicación Configuración, no me decepcionó exactamente el resultado. Pero cuando recordé la perorata del Sr. Ambri, me di cuenta de que cambios pequeños como estos deben ser muy frustrantes, especialmente porque por más pequeños que sean, sin dudaagregar, a veces lo suficiente como para causar dolor de cabeza. Un pequeño cambio en la aplicación Configuración podría resultar en una crítica negativa inmerecida contra un desarrollador. Un pequeño cambio que está bastante mal documentado y me obligó a buscar en Internet un hilo de Stack Overflow. ¿Cuántos otros pequeños errores hay en otros dispositivos?

El aumento de la competencia en el espacio móvil ha demostrado ser excelente para el consumidor, pero después de ver cómo estos cambios sutiles en tantas líneas de productos diferentes puede afectar a los desarrolladores, he llegado a apreciar la visión de los desarrolladores hacia fragmentación. No es que la elección en sí sea el problema, sino que la comunidad no está haciendo lo suficiente para catalogar estas cuestiones. Como sugirió el Sr. Ambri en su artículo, tal vez los desarrolladores de Android necesiten su propia versión de caniuse.com o sdkcritic.com para recopilar todos los errores oscuros en una base de datos. La única otra alternativa es lograr que los OEM documenten adecuadamente estos cambios o dejen de realizarlos en primer lugar, pero buena suerte con eso.

Créditos de las imágenes destacadas: señal abierta