Cómo quitar android.Log.d?

Supuestos generales

Así que encontré mucho sobre el uso de proguard para borrar las declaraciones de registro de código. Básicamente todos dicen -assumenosideeffects junto con el uso de la configuración de $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt haría el truco. Mi entendimiento era obtener bytecode que es igual a hacer algunos

if(Consts.DEBUG) Log.d("",""); 

Aka asumí para conseguir la llamada a doSomeExpensiveStuff () eliminado de mi apk:

 android.util.Log.d("Hello","World"+(new Foo().doSomeExpensiveStuff())); 

Mi código

 public class MainActivity extends Activity { private class Slooow { @Override public String toString() { // being slow try { Thread.sleep(5000); } catch(InterruptedException e) { } return "bla"; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("tag", "onCreate: " + (new Slooow().toString())); } } 

Proguard-project.txt:

 -repackageclasses '' -optimizationpasses 5 -dontobfuscate -assumenosideeffects class android.util.Log { public * ; } 

Archivo dex descompilado

 .method public onCreate(Landroid/os/Bundle;)V .limit registers 5 ; this: v3 (Lcom/example/test/MainActivity;) ; parameter[0] : v4 (Landroid/os/Bundle;) .line 18 invoke-super {v3,v4},android/app/Activity/onCreate ; onCreate(Landroid/os/Bundle;)V .line 19 const/high16 v0,32515 invoke-virtual {v3,v0},com/example/test/MainActivity/setContentView ; setContentView(I)V .line 20 new-instance v0,java/lang/StringBuilder const-string v1,"onCreate: " invoke-direct {v0,v1},java/lang/StringBuilder/<init> ; <init>(Ljava/lang/String;)V new-instance v1,com/example/test/MainActivity$Slooow const/4 v2,0 invoke-direct {v1,v2},com/example/test/MainActivity$Slooow/<init> ; <init>(B)V invoke-virtual {v1},com/example/test/MainActivity$Slooow/toString ; toString()Ljava/lang/String; move-result-object v1 invoke-virtual {v0,v1},java/lang/StringBuilder/append ; append(Ljava/lang/String;)Ljava/lang/StringBuilder; .line 21 return-void .end method 

Problema

Ahora, si implemento esto en mi dispositivo, no obtengo ninguna salida de registro, pero aún así el sueño 5s (o cualquier otro retraso o bloqueo del código que no debería molestar a mis usuarios). ¿Qué estoy haciendo mal?

Investigaciones más profundas

 Log.d("t", "h" + "w"); // would get stripped just fine. if(DEBUG) Log.d("t", "h: " + (new Slooow().toString())); // would get optimized away, too. Log.d("t", "h" + bundle.toString()); // has just the same problem as described above. 

Parece que proguard todavía considera que la creación de la nueva instancia de Slooow tiene / tiene un efecto secundario. En el nivel de bytecode en el que trabaja proguard, no hay esencialmente ninguna diferencia entre:

 Log.d("tag", "onCreate: " + (new Slooow().toString())); 

y

 String temp = new Sloooow().toString(); Log.d("tag", "onCreate: " + temp); 

Así que proguard ve el Log.d , y lo quita, pero no está eliminando la creación de la nueva instancia de Sloooow , porque no se ha dicho que eso no tiene efectos secundarios.

No puedo pensar en ninguna buena manera de eliminar genéricamente la creación de Sloooow (), sin decir específicamente proguard que no tiene ningún efecto secundario. (No sé de improviso si eso es posible incluso para un constructor)

Aunque no conozco la respuesta, creo que tener un final static boolean DEBUG = false resultará en if(D) { Log.d(...) } es completamente despojado por el compilador

  • Proguard Aws número 3
  • ¿Cómo utilizar las anotaciones de Java para guiar Proguard de Android?
  • Usar Proguard sólo para deshabilitar el registro y para reducir recursos
  • FileNotFoundException en el archivo proguard-rules.pro
  • Proguard con la colección parametrizada orrmlite
  • Proguard hace reflexionar con la clase R en la aplicación android ya no funciona
  • Android form build.xml con proguard no se construye en la versión
  • ¿Cómo mantener los nombres de métodos de clase que anulan \ implementa otro método de ser ofuscado?
  • Proguard obfusca nombres de actividad en un manifiesto de biblioteca fusionada
  • Proguard causa un accidente en los servicios de Google Play 'ActivityRecognitionResult getMostProbableActivity
  • Proguard mientras que la biblioteca Butterknife y otras advertencias
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.