¿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:
- Obteniendo un valor único de SQLite en android
- Java - Línea aleatoria leer
- Java.lang.IllegalStateException: La aplicación PagerAdapter cambió el contenido del adaptador sin llamar a PagerAdapter # notifyDataSetChanged android
- RxJava: Averigüe si BehaviorSubject fue un valor repetido o no
- Error en la versión 6.0 de Android 6.0: EACCES (Permiso denegado)
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.
- Leer EPUB utilizando sólo Java
- Transmitir un archivo MediaRecorder durante la grabación
- Android httpclient.execute excepción
- ¡Desajuste del tarro! Corregir sus dependencias para el FacebookSDK
- Las invitaciones a los servicios de juegos de Google se pierden
- Cómo activar mediante programación GPS en Android Cupcake
- IllegalArgumentException que bloquea la superficie
- Mes en la clase SimpleDateFormat
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.
- Automatización para la versión de lanzamiento de Android
- ¿Cómo realizar este menú emergente personalizado con Material Design Android?