Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Dónde está el estudio multidex?

¿Dónde está el estudio multidex?

En el sistema Android, todo el código de una App está en un archivo Dex. Dex es un archivo tipo Jar que almacena muchos códigos de bytes compilados en Java. Debido a que el sistema Android utiliza la máquina virtual Dalvik, los archivos de clase compilados por el compilador de Java deben convertirse en archivos de clase que Dalvik pueda ejecutar. Lo que hay que enfatizar aquí es que Dex, como Jar, es un archivo de almacenamiento y sigue siendo un archivo de código de bytes correspondiente al código Java. Cuando el sistema Android inicia una aplicación, un paso es optimizar Dex. Este proceso lo maneja una herramienta especial llamada DexOpt. El proceso de ejecución de DexOpt se ejecuta cuando el archivo Dex se carga por primera vez. Este proceso generará un archivo ODEX, que está optimizado. La eficiencia de ejecutar ODex es mucho mayor que la de ejecutar archivos Dex directamente. Pero en los primeros sistemas Android, DexOpt tenía un problema. Este artículo quiere explicar y resolver este problema. DexOpt recuperará la identificación del método de cada clase y la almacenará en una estructura de lista vinculada. Sin embargo, la longitud de esta lista vinculada se almacena en un tipo corto, lo que da como resultado que el número de ID de método no exceda 65536. Cuando un proyecto es lo suficientemente grande, el límite superior en el número de métodos obviamente no es suficiente. Aunque DexOpt ha solucionado este problema en la nueva versión del sistema Android, todavía necesitamos ser compatibles con versiones inferiores del sistema Android.

Los métodos más utilizados actualmente son: (1) Aplicar complementos, como utilizar el marco de complementos en el que participo. Si tiene alguna sugerencia o pregunta relacionada, bienvenido a participar activamente; en Github (2) Split Dex, múltiples proyectos: necesarios para la compilación. Archivo de clase o archivo Jar, genera un archivo Jar con algún código fuente. Luego use la herramienta dx proporcionada por el SDK de Android para convertir el archivo Jar en un archivo Dex. Podemos realizar operaciones ODex con anticipación, de modo que al cargarlo con DexClassLoader, podamos omitir parte del trabajo de DexOpt, acelerando así el proceso de carga. No hay conflicto entre estos dos métodos y los complementos tienen muchas otras ventajas además de resolver la explosión de aplicaciones. Consulte mi artículo anterior y no lo repita.

Por supuesto, Google parece ser consciente de la actual explosión de métodos de aplicación. Se ha proporcionado una solución general en API 21, a saber, Android-support-multidex.jar. Este paquete jar puede admitir al menos la versión API 4 (Android L y superiores admitirán multidex de forma predeterminada).

Echemos un vistazo a cómo aplicar android-support-multidex.jar (los siguientes son ejemplos en Anroid Studio):

Primero, puede configurarlo a través de - multi-dex (build.gradle), el Apk generado contendrá varios archivos dex, como clases.dex, clases2.dex de la siguiente manera, build.gradle debe modificarse:

afterEvaluate {

Task.Match {

it.name.startsWith('dex ')

}.Cada { dx ->

if(dx . parámetros adicionales = = null){

dx.additionalParameters = []

}

dx parámetros adicionales+= '-multi-dex '//Habilitar multidex

/ /opcional

//dx parámetros adicionales+=-main-dex-list = $ directorio del proyecto/. toString() //Habilitar la lista de índice principal

}

}

Sin embargo, el cargador de clases predeterminado de Dalvik solo busca clases.dex, por lo que deben fusionarse para ser reconocido.

Por supuesto, con el soporte de android.support.multidex.jar, todo será muy sencillo. Primero echemos un vistazo al directorio del código fuente relevante. Explicaré el análisis del principio específico en el siguiente artículo:

Android/support/multi dex/build config

Android/ soporte/multi dex/multi dex $ v 14 clase

Android/support/multi dex/multi dex $ v 19 . clase multi dex $ v4

Android/soporte/multi dex/clase multi dex

aplicación Android/soporte/multi dex/multi dex. Android/support/multi dex/multi dex extractor $ 1 clase

Android/support/multi dex/multi dex extractor

Android/support/multi dex/ZipUtil$central. directorio . class

Android/support/multi dex/ziputil . class

Integración específica:

Agregue la siguiente configuración a la ruta de clase de su proyecto.

Repositorio {

jcenter()

}

Dependencias {

Compilar "com.Google . Android :multi dex:0.1”

}

La siguiente integración tiene dos pasos:

1. Eliminar android-support-multidex.jar de sdkextrasandroidsupport Importar multidexlibraryibs. directorio en el proyecto.

2. Si tu proyecto ya contiene una clase de aplicación, deja que herede Android. soporte de clase de aplicación multi dex.

Si tu aplicación ya hereda otras clases y no quieres hacer cambios, hay otra forma de usarla, que es anular el método adjuntoBaseContext():

Público class MyApplication extiende FooApplication {

@override

protected void addBaseContext(Context base){

super .attachbasecontext(base);

multi dex .install(this);

}

}

Finalmente, la configuración completa se proporciona en build.gradle:

Construir script {

Repositorio{

jcenter()

}

Dependencias {

Classpath' com . Herramientas de Android . build:gradle:0.13.3 '

Classpath' jp .

}

Complemento de aplicación: "com.android.application"

Complemento de aplicación: "jp.leafytree.android-scala"

repositorio {

jcenter()

}

android {

compileSdkVersion 21

buildToolsVersion '21.0. 2 '

defaultConfig {

ApplicationId 'some.app '

minSdkVersion 19

targetSdkVersion 19

Versión código 1

Nombre de la versión ' 1.0 '

}

}

Dependencias {

Compilar "com . Google Android:multi dex:0.1"

Compilar "Android". :play-services:5 . 0 . 77"

Compilar 'org . Scala-lang:Scala-library:2.11.2'

Compilar 'org . scalo id :scalo id _ 2.11:3.4-10”

}

La idea de usar múltiples indicadores

1. Si heredas MutiDexApplication o reescribes el método adjuntoBaseContext(). .

Notas sobre la lógica de clases de la aplicación:

Las variables globales estáticas en la aplicación se cargarán antes que el método install() de MutiDex, por lo que se recomienda evitar el uso de clases principales que puedan ser en la clase Aplicación Las variables estáticas utilizadas en archivos .dex se pueden modificar de la siguiente manera:

@override

public void onCreate() {

super oncreate(. );

Contexto final mContext = this

Nuevo Runnable() {

@Override

Public void Runnable(){< / p>

//¡Pon tu lógica aquí!

//Utiliza mContext aquí en lugar de esto

}

}.run();

}

Preguntas frecuentes

Dexexcepción: los archivos de índice de la biblioteca no son compatibles con el modo de índice múltiple; es posible que vea el siguiente error:

Error: Error en la ejecución de la tarea: Aplicación: dexDebug.

& gtcom . ide común . loggedErrorException: No se puede ejecutar el comando:

$ANDROID_SDK/build-tools/ANDROID-4.4W/dx-dex-num - hilos = 4-multi-dex

...

Código de error:

2

Salida:

Excepción inesperada de nivel superior:

com.Android.dex.dexException: los archivos de índice de la biblioteca no son compatibles con el modo de índice múltiple

en com.Android.dx.command.dexer . principal . runmultidex(main . Java:322)

en com .dx . .dx .comando dx .main(principal .Java:103)