versiones support studio library instalar features como android android-gradle mobile-application dynamic-class-loaders

android - support - cómo construir un APK y bibliotecas separadas que la aplicación carga dinámicamente



support v7 android (2)

El breve resumen es: ¿Cómo construyo un APK y bibliotecas separadas (con lo que me refiero a conjuntos de clases (e idealmente, recursos también) de alguna forma, como archivos JAR, AAR o DEX), pero no se incluyen esas bibliotecas en APK; en cambio, la aplicación los carga en tiempo de ejecución?

Detalle

Así que mi pregunta principal es cómo crear una aplicación de este tipo (por ejemplo, la configuración de Gradle). ¿Cómo especifico qué clases entran en qué archivos JAR o DEX? ¿Creo un módulo de Android Studio para cada archivo DEX con el que quiero terminar?

Una pregunta estrechamente relacionada es cómo el código Java debe cargar las bibliotecas externas y acceder a sus clases en tiempo de ejecución. Para este último, espero que el enfoque mostrado al acceder a las clases de aplicaciones desde el archivo dex por el cargador de clases funcione.

He intentado las instrucciones en https://developer.android.com/studio/projects/android-library.html , pero eso construye un APK que incluye la biblioteca de dependencias.

También probé Multidex ( https://developer.android.com/studio/build/multidex.html ), pero eso no parece dejar al desarrollador ningún control sobre qué clases van en qué archivo DEX, y además, los paquetes todos en un solo APK. AFAICT no hay forma de controlar la carga de estos archivos DEX en tiempo de ejecución.

Fondo

Existe la posibilidad del " problema XY " aquí, así que mejor explico los antecedentes.

Estoy construyendo una aplicación para un cliente. No se distribuirá a través de una tienda de aplicaciones, por lo que no tendrá acceso al mecanismo normal para las actualizaciones. En su lugar, el cliente desea que la aplicación pueda actualizarse a sí misma mediante la descarga de nuevos componentes de sí misma para reemplazar los componentes antiguos, sin necesidad de descargar manualmente un nuevo APK. El motivo principal aquí es que las actualizaciones deben ser fáciles para los usuarios no técnicos. Si la aplicación puede controlar el proceso de actualización, puede hacerlo sin problemas y guiar al usuario.

Además, la aplicación se utilizará en áreas donde el acceso a Internet es escaso y costoso, por lo que el cliente desea poder emitir actualizaciones de la aplicación en partes más pequeñas (por ejemplo, 2 MB) en lugar de obligar al usuario a volver a descargar la aplicación completa para recibir una pequeña actualización

Un aspecto de los requisitos que debo mencionar, en caso de que sea importante, es que las bibliotecas que se cargarán en el tiempo de ejecución se supone que viven en una tarjeta microSD. Esto también puede ayudar con la distribución de actualizaciones sin acceso a Internet.

El estado actual de la aplicación es que está escrito aproximadamente en un 50%: es decir, se han lanzado un par de versiones anteriores, pero ahora la aplicación necesita ser modificada (reestructurada) para cumplir con los requisitos anteriores y otros.


Este tutorial es un buen comienzo para la carga externa de archivos DEX. Solo tres archivos pequeños de origen (MainActivity.java, LibraryInterface.java, LibraryProvider.java) y copia el archivo secondary_dex.jar de la carpeta de activos, en el almacenamiento interno de la aplicación [outdex / dex] (Internet también se indica como posible en el tutorial ). Tienes que compilarlo con ant , porque usa pasos de compilación personalizados. Lo probé, funciona bien. Digno de una mirada.
carga personalizada de clase en Dalvik y ART


ACTUALIZAR este código se ha portado a Android Studio gradle (sin necesidad de hormiga). https://github.com/timrae/custom-class-loader
Probado bien . Copia com.example.toastlib.jar de la tarjeta SD en el almacenamiento interno de la aplicación [outdex / dex], (no en la carpeta de activos). (debe leer el archivo README.md en el proyecto para compilarlo).

P: ¿Cómo agrego una actividad, no puedo agregarla al manifiesto?
R: Use Fragmentos, no necesitan entradas en el manifiesto.

P: Un Frasco con recursos que debe agregarse a un proyecto existente debe poder combinar sus recursos con los recursos propios del proyecto (R).
A: Hacks están disponibles, archivo de datos ...
Empaquetar archivos de recursos de Android dentro de un archivo Jar distribuible

P: El archivo externo tiene permisos incorrectos.
A: Importarlo.

P: Necesito agregar usos-permiso.
R: Use API23, puede agregar permisos de uso mediante programación (pero aún deben declararse en el Manifiesto, por lo que el nuevo modelo de permisos probablemente no nos sea de mucha utilidad).

Esta sección es para usuarios más generales (@LarsH tiene requisitos más específicos sobre actualizaciones), el ejemplo anterior es 17kb apk y 1 kb jar. Podría poner la mayor parte de su código en el contenedor único, y las actualizaciones implicarían simplemente cargar un nuevo Apk (y luego importar el contenedor de código masivo, para minimizar la transferencia de datos). Cuando el Apk sea demasiado grande, comience de nuevo con un Apk pequeño y todo migrará a otro tarro (importe de 2 tarros). Debe equilibrar el esfuerzo de codificación, la experiencia del usuario, la capacidad de mantenimiento, la compatibilidad, el ancho de banda, las reglas de Android, las reglas de la tienda de juegos (si estas palabras existen, O).

NOTA Dalvik se interrumpe.

El sucesor de Dalvik es Android Runtime (ART), que utiliza los mismos archivos de bytecode y .dex (pero no los archivos .odex), con la sucesión de mejoras de rendimiento transparentes para los usuarios finales. El nuevo entorno de tiempo de ejecución se incluyó por primera vez en Android 4.4 "KitKat" como una versión preliminar de la tecnología, y reemplazó a Dalvik por completo en versiones posteriores; Android 5.0 "Lollipop" es la primera versión en la que ART es el único tiempo de ejecución incluido.


Podrías intentar crear múltiples apk con el mismo sharedUserId y el mismo process .

Este es el mecanismo de plugin utilizado por Threema

Edición: Más sobre Theema

Threema tiene una aplicación principal y dos complementos:

Al hacerlo, la aplicación principal no necesita los permisos para acceder a la cámara o al micrófono.