2012-08-24 17 views
10

Estoy usando el último Android SDK (4.1) e intenté exportar un jar firmado con Proguard habilitado. Sin embargo, después de descompilar la APK optimizada, noté que los métodos que esperaba que estuvieran incluidos no lo eran.Android Proguard no está en línea

Sé que Proguard se ejecutó porque el código estaba ofuscado correctamente. Así que para confirmar esto, añadí este método a mi Actividad:

private void testInlining() 
{ 
    mConfig = null; 
} 

Este método privado se llama una sola vez en mi actividad, y porque es privada, debería ser muy evidente para el optimizador que sólo se llama una vez y que debe estar en línea.

La documentación dice que todas las optimizaciones están habilitadas por defecto, y que Proguard "Métodos en línea que son cortos o solo se llaman una vez".

¿Hay alguna bandera específica que le deba dar a Proguard para habilitar la alineación?

EDITAR

Mi fichero de configuración contiene Proguard

-optimizationpasses 5 
-allowaccessmodification 
-overloadaggressively 
-repackageclasses '' 
-dontskipnonpubliclibraryclasses 

EDITAR

Después de usar

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;} 

tengo la razón por la cual no se colocarán en línea el método:

[proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21) 
[proguard] is invoked by com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15) 
[proguard] implements  com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig() 
[proguard] is invoked by com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175) 
[proguard] implements  android.app.Activity: void onCreate(android.os.Bundle) 
[proguard] is a library method. 

pero no estoy seguro de ver cómo el hecho de que el método testInlining se utiliza en el método getIvConfig que a su vez utilizado por otro método previene la alineación en testInlining en getIvConfig.

+0

¿Has probado esto? -optimizationpasses 5 Más sobre http://stackoverflow.com/questions/5068251/android-what-are-the-recommended-configurations-for-proguard?rq=1 – user1154664

+0

que en realidad eran capaces de obtener Proguard hacer que cualquier método llame en línea? Usando proguard-android-optimize.txt y escribiendo un método privado simple que devuelve un int, no pude ver que funcionara: http://paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3 – brAzzi64

Respuesta

15

Esta reciente SDK de Android se desactivan todas las optimizaciones por defecto, ver $ {} sdk.dir /tools/proguard/proguard-android.txt:

-dontoptimize 

La configuración alternativa optimizar única desactiva unos optimizaciones, ver $ {} sdk.dir /tools/proguard/proguard-android-optimize.txt:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* 

puede especificar el archivo de configuración preferida en project.properties.

Puede verificar qué configuración completa utiliza ProGuard agregando la opción -printconfiguration.

Se han desactivado algunas optimizaciones para evitar errores en versiones anteriores de la máquina virtual Dalvik (! Código/simplificación/aritmética,! Código/simplificación/molde), y algunas optimizaciones pueden haberse desactivado para evitar errores en versiones anteriores de ProGuard (! field/* ,! class/merging/*).

Tenga en cuenta que -whyareyoukeeping se refiere al paso de reducción, que elimina las clases/campos/métodos innecesarios en su conjunto. Los métodos que no se eliminan pueden incluirse en el paso de optimización (a menos que se especifique explícitamente lo contrario con -keep).

+0

Eso tiene sentido, no sabía que Google inhabilitó las optimizaciones de forma predeterminada. Muchas gracias, voy a intentar que daccept la respuesta si lo soluciona. –

1

En el expediente de su módulo de build.gradle, usted debe buscar en:

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

y reemplazar proguard-android.txt con proguard-android-optimize.txt, que no incluye la línea -dontoptimize, manteniendo los problemas Dalvik distancia (véase la respuesta de Eric Lafortune) .

Cuestiones relacionadas