Aplicaciones en ejecución que contienen gran cantidad de código

Fondo

Parece que algunos viejos sistemas operativos de Android (y tal vez incluso los más recientes) tienen una limitación en la cantidad de código que puede soportar cada aplicación.

Como he encontrado, la limitación está en un búfer llamado "LinearAlloc".

En 2.2 o 2.3 es alrededor de 5-8 MB, y creo que es 16 o más en otros.

El problema

Si tienes un código demasiado grande (y las aplicaciones pueden llegar a este estado), no podrás instalar la aplicación en todos los dispositivos antiguos, obteniendo el siguiente error (también informado aquí ):

Installation error: INSTALL_FAILED_DEXOPT Please check logcat output for more details. Launch canceled! 

Lo que he encontrado

Una solución es simplemente quitar el mayor número de código y bibliotecas como sea posible, pero en algunos proyectos enormes tal cosa es muy difícil de hacer.

He encontrado los siguientes enlaces hablando de cómo Facebook resolvió esto, de alguna manera aumentando el límite:

  • Http://www.slashgear.com/how-facebook-fixed-its-gingerbread-dalvik-problem-04272478/
  • Http://arstechnica.com/business/2013/03/how-facebook-dug-deep-within-android-to-fix-its-mobile-app/
  • Https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

Además, Google ha publicado cómo resolverlo cargando código dinámicamente:

 http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html 

La pregunta

¿Cómo lo hizo Facebook?

¿Es posible superar esto de otras maneras también?

¿Existe alguna biblioteca gratuita que aumente o elimine la limitación de este búfer?

¿Cuál es la limitación de las nuevas versiones de Android, si las hay?

¿Cómo otras aplicaciones enormes (y juegos) manejan este problema? ¿Ponen su código en C / C ++?

¿Cargar los archivos dex de forma dinámica resolver esto?

El límite es el número total de referencias de método:

Un punto medio entre no hacer nada y el enfoque multidex descrito en los artículos de FB / Google es usar una herramienta como ProGuard para quitar referencias a código no utilizado en el nivel de Java. Ver:

Hay una nueva solución, hecha por Google:

Parece que todo lo que tienes que hacer es cualquiera de las siguientes cosas: – extender desde "MultiDexApplication" en lugar de desde "Application" – llame a MultiDex.install (context) en el archivo attachBaseContext de su aplicación

Pero ahora me pregunto:

  1. ¿Es eso realmente?
  2. ¿Tiene algún problema? ¿Afecta al rendimiento?
  3. ¿Como funciona?
  4. ¿Qué se debe hacer con ContentProvider, ya que se está llamando antes de que la aplicación se inicialice?
  5. El mensaje dice "le da soporte MultiDex en todos los dispositivos API 4 + (bueno, hasta v21, donde se obtiene este nativamente)". ¿Significa que desde v21 será el comportamiento predeterminado, o simplemente que la clase se construirá en y no necesitará usar la clase de la biblioteca de soporte?
  6. ¿Esta solución funcionará también en Eclipse?
  • Averigua si la aplicación está instalada
  • ¿Cómo sortea Facebook Messenger un chathead? (Androide)
  • Hash de clave no válida el hash de clave no coincide con ningún hash de clave almacenada
  • ¿Cómo verifica facebook la autenticidad de la aplicación con hash clave?
  • Manipulación de imágenes JPEG progresivas en Libgdx
  • Facebook en android: no puede iniciar sesión después de closeAndClearTokenInformation
  • ¿Es posible extender los tokens de Facebook con extendAccessTokenIfNeeded en una aplicación para Android?
  • ¿Hay de todos modos para abrir una URL de facebook en la aplicación de Facebook de un teléfono?
  • Obtener la foto de la portada utilizando la API de Facebook
  • Error al intentar compartir enlace en facebook desde android
  • Cómo deshabilitar el inicio de sesión único de Facebook para Android - Facebook-android-sdk
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.