navegador maquina islandia caracteristicas cache art amnho java android dalvik dex

java - maquina - ¿Los métodos heredados cuentan contra el límite del método Dex en Android?



dalvik vs art (1)

Dalvik tiene esta limitación bien conocida sobre la cantidad de métodos que puede tener en un solo archivo .dex (aproximadamente 65,536 de ellos). Mi pregunta es si los métodos heredados (pero no anulados) cuentan con este límite o no.

Para concretar las cosas, supongamos que tengo:

public class Foo { public int foo() { return 0; } } public class A extends Foo { } public class B extends Foo { } public class C extends Foo { }

Para los fines del límite del método de 65,536, ¿esto cuenta como agregar un método o agregar 4? (O, supongo, para llevar las cosas a su conclusión lógica, ¿esto cuenta como 1 método o 52 métodos, considerando que java.lang.Object trae consigo 12 métodos también?).

Como antecedentes, tengo un número no trivial de clases generadas con algo en común, y también me estoy topando con el límite del método, así que me pregunto si vale la pena intentar extraer algunas de ellas en una clase. Jerarquía para ganar algo de tiempo.


Un método heredado pero no anulado solo cuenta contra el límite del método si alguna vez se hace referencia (llamado).

En tu ejemplo, digamos que tienes el siguiente fragmento de código

public class main { public static void main(String[] args) { Foo foo = new A(); foo.foo(); } }

En este caso, se está refiriendo a Foo.foo (), que ya tiene una referencia, debido a la definición explícita. Suponiendo que estas 5 clases son las únicas clases en el archivo dex, tendrá un total de 2 referencias de método *. Uno para main.main (String []), y uno para Foo.foo ().

En cambio, digamos que tienes el siguiente código

public class main { public static void main(String[] args) { A a = new A(); a.foo(); B b = new B(); b.foo(); C c = new C(); c.foo(); } }

En este caso, dado que el método foo para cada subclase es realmente referenciado, contarán contra su límite de método. Su archivo dex tendrá 5 referencias de método *.

  • main.main (String [])
  • Foo Foo()
  • A.foo ()
  • B.foo ()
  • C.foo ()

* Este conteo no es muy preciso, no tiene en cuenta los métodos de construcción que se agregan a cada clase detrás de escena. Cada constructor llama al constructor de su superclase, por lo que también tenemos una referencia al constructor de objetos, para un total de 6 referencias de métodos adicionales en cada caso, lo que da un número de métodos de 8 y 11 respectivamente.

En caso de duda, puede probar varios escenarios y usar la funcionalidad de volcado en bruto de baksmali para ver qué contiene realmente la lista de métodos en el archivo dex.

p.ej

javac *.java dx --dex --output=temp.dex *.class baksmali -N -D temp.dump temp.dex

Y luego, en el archivo de volcado, busque la sección "method_id_item". Esta es la lista de referencias de métodos a las que se aplica el límite de 64k.