2012-06-29 15 views
6

Al compilar e implementar un ejecutable en Android sin ejecutar ProGuard, ¿se incluyen métodos sin referencias en el ejecutable final?¿Se incluyen métodos sin referencias en el ejecutable final?

¿Se incluyen también métodos sin referencias de archivos de biblioteca externos?

¿Este comportamiento depende del compilador de Java, o dex hace todo el recorte, si hay alguno?

+0

No es una estafa exacta, pero vea esto para mucha información muy útil: http://stackoverflow.com/questions/4912695/what-optimizations-can-i-expect-from-dalvik-and-the-android- toolchain –

+0

@GrahamBorland Gracias, eché un vistazo y no pude encontrar ninguna información en la pregunta o respuesta sobre si se incluye o no el código sin referencia. –

Respuesta

5

Probé con una clase simple (todos estos métodos son sin referencias):

public class Test 
{ 
    private void privateMethod() 
    { 
     System.out.println("private"); 
    } 

    protected void protectedMethod() 
    { 
     System.out.println("protected"); 
    } 

    public void publicMethod() 
    { 
     System.out.println("public"); 
    } 

    void method() 
    { 
     System.out.println("method"); 
    } 
} 

I compilado la APK, se extrajo Test.class y descompilado que (con javap -c). Obtuve los siguientes resultados. También probé con un jar en vez de un APK, y el resultado es exactamente el mismo. Usé Java 1.6.0_29.

protected void protectedMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #47    // String protected 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    public void publicMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #48    // String public 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    void method(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #49    // String method 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

Lo que significa funciones sólo privados están excluidos en tiempo de compilación.

También traté de declarar la clase final, pero el resultado fue el mismo.

+2

Esto también puede depender del compilador real utilizado. Además, estamos en Android, por lo tanto, el paso de dexificación también puede optimizar el código. – Robert

+0

@Robert ¿cómo pudo Dalmas compilarse para una aplicación y evitar el dexing? –

+1

Sí, extraje la clase de classes.dex en el APK (con dex2jar). Sin embargo, no sé si esta optimización proviene del compilador de Java o de la dexificación. – Dalmas

Cuestiones relacionadas