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".
- Autorización para Android de Facebook - no puede iniciar sesión cuando se instala la aplicación oficial de Facebook
- No se pudo encontrar com.parse.bolts: bolts-android: 1.1.2. En el proyecto de la brecha del teléfono (estudio del androide)?
- Sesión proporcionada a una solicitud en estado no abierto
- Cómo integrar facebook, twitter y google plus a una aplicación para Android
- Diálogo de Facebook de Android
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?
- Mostrar los próximos cumpleaños de amigos de Facebook
- Obtener lista de amigos facebook 3.0
- Facebook Deep Linking no funciona en Android
- Facebook Share video Exception "ShareVideo debe hacer referencia a un video que está en el dispositivo" en Android
- StatusCallback no se llama después de requestNewReadPermissions entonces requestNewPublishPermissions
- Login Facebook registerCallback no llamado
- Android obtiene amigos de Facebook que han descargado la aplicación
- Inicio de sesión móvil de Facebook y validación del servidor
El límite es el número total de referencias de método:
- https://code.google.com/p/android/issues/detail?id=7147#c6
- https://code.google.com/p/android/issues/detail?id=20814#c6
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:
- ¿Es eso realmente?
- ¿Tiene algún problema? ¿Afecta al rendimiento?
- ¿Como funciona?
- ¿Qué se debe hacer con ContentProvider, ya que se está llamando antes de que la aplicación se inicialice?
- 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?
- ¿Esta solución funcionará también en Eclipse?