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

Dalvik tiene esta conocida limitación en el número 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 sobrepuestos) cuentan contra este límite o no.

Para hacer las cosas concretas, supongo 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 propósitos del límite del método 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 un método o 52 métodos, teniendo en cuenta que java.lang.Object trae 12 métodos a lo largo de demasiado).

Como antecedente, tengo un número no trivial de clases generadas con algo de comúnidad, y también estoy golpeando contra el límite de método, así que me pregunto si vale la pena tratar de abstraer algunos de esos en una clase Jerarquía con el fin de comprar algún tiempo.

Un método heredado pero no sobreescrito sólo cuenta con el límite de método si alguna vez se hace referencia (llamado).

En su ejemplo, supongamos que tiene 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 su lugar, supongamos que tiene 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 está realmente referenciado, contarán en función de 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 recuento no es muy preciso, no tiene en cuenta los métodos de constructor que se agregan a cada clase detrás de las escenas. 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, dando un recuento de métodos de 8 y 11, respectivamente.


En caso de duda, puede probar varios escenarios y utilizar la función de volcado crudo de baksmali para ver lo que realmente contiene 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 "sección method_id_item". Esta es la lista de referencias de método a las que se aplica el límite de 64k.

  • Cómo probar interfaz de escucha se llama dentro de pruebas de unidad de Android
  • Compruebe si un dispositivo Android tiene un determinado botón de hardware en el código
  • ¿Cuál sería una simple expresión regular para la comprobación de contraseña durante la suscripción?
  • Reemplazar el nuevo método dexlib2 fallando
  • Causado por: java.lang.IllegalStateException: ParsePlugins ya está inicializado
  • Crashing debido a Integer.parseInt
  • Cómo pausar una Httpurlconnection en android en el botón de clic
  • API de calendario de Android vs API de proveedor de calendario
  • android: <soportes-pantallas> Etiqueta
  • Descripción de la arquitectura de los contactos de Android
  • Path () - segmentos de color inteligentes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.