android - transferencia - mega:#! 1xsdxlza ym_b gscd9vml2pv1q3a2mug2s8ayhcuprnipcjvbtw
¿El tiempo de ejecución de Android ART tiene las mismas limitaciones de límite de método que Dalvik? (2)
Anwar Ghuloum dijo en this episodio de Android Developers Backstage que no van a arreglar el bytecode en el futuro cercano.
En cambio, a partir de Android L, admitirán de forma nativa multi-dex al colapsar todos los archivos dex (desde un APK) en un solo archivo de avena.
¿El tiempo de ejecución de Android ART tiene las mismas limitaciones de límite de método que Dalvik? Actualmente, hay un límite de 64k métodos en el archivo dex primario
El problema no está en el tiempo de ejecución de Dalvik ni en el formato de archivo DEX, sino con el conjunto actual de instrucciones de Dalvik . Específicamente, los diversos métodos de invocación de métodos, que se ven así:
invoke-kind {vC, vD, vE, vF, vG}, meth@BBBB
B: method reference index (16 bits)
Puede hacer referencia a una gran cantidad de métodos en un archivo DEX, pero solo puede invocar el primer 65536, porque esa es toda la sala que tiene en las instrucciones de invocación de métodos.
Me gustaría señalar que la limitación está en la cantidad de métodos a los que se hace referencia , no en la cantidad de métodos definidos . Si su archivo DEX tiene solo unos pocos métodos, pero juntos llaman a 70,000 métodos diferentes definidos externamente, usted va a exceder el límite.
Una forma de solucionar esto es agregar instrucciones adicionales que toman referencias de método más amplias. Se implementó y lanzó un enfoque llamado "códigos de operación jumbo" en Android 4.0 (ICS), pero nunca se puso en práctica por completo y luego se eliminó del árbol . (De vez en cuando veo publicaciones aquí con mensajes de error de "dx" que hacen referencia a jumbo ops, o de desarrolladores que tropezaron con ellos ).
Tenga en cuenta que este no es el problema resuelto por el hack de Facebook . Esto se debe a un búfer de tamaño fijo para contener metadatos de clase / método / campo. No hay un límite específico del método allí; puedes eliminar el buffer teniendo muchos campos.
Tengo entendido que la implementación actual de ART maneja el mismo conjunto de instrucciones que Dalvik, por lo que la situación no será diferente.