Eventuali duplicati:
Removing unused strings during ProGuard optimisationRimozione registrazione con ProGuard non rimuovere le corde essere registrati
Ho un'applicazione Android con decine di dichiarazioni di registrazione. Preferirei che non apparirebbero nella versione, quindi ho usato Proguard con qualcosa di simile nel file proguard.cfg
:
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
ma il problema è che ci sono un sacco di Log.d("something is " + something)
, e anche se la Log.d()
la dichiarazione viene rimossa dal bytecode, , le stringhe sono ancora presenti.
Così, seguendo this risposta, ho creato una semplice classe wrapper, qualcosa sulla falsariga di:
public class MyLogger {
public static void d(Object... msgs) {
StringBuilder log = new StringBuilder();
for(Object msg : msgs) {
log.append(msg.toString());
}
Log.d(TAG, log.toString());
}
}
Poi ho modificato il mio proguard.cfg
:
-assumenosideeffects class my.package.MyLogger {
public static *** d(...);
}
Ma le corde si trovano ancora nel bytecode generato!
Oltre a ciò, sto utilizzando lo standard proguard.cfg
fornito dall'SDK di Android. Sto facendo qualcosa di sbagliato?
Edit: dopo aver esaminato il bytecode generato, ho visto che le corde erano lì, ma non erano di essere aggiunto uno all'altro, come pensavo. Erano memorizzati in un array. Perché? Passarli come parametri variabili al mio metodo. Sembra ProGuard non piace che, così ho modificato la mia classe logger in questo modo:
public static void d(Object a) {
log(a);
}
public static void d(Object a, Object b) {
log(a, b);
}
(... I had to put like seven d() methods ...)
private static void log(Object... msgs) {
(same as before)
}
E 'brutto, ma ora le stringhe sono nessuna parte nel bytecode.
È una specie di bug/limitazione di ProGuard? O semplicemente non capisco come funziona?
Si potrebbe voler evitare gli hack proguard e basta usare una costante: http://stackoverflow.com/questions/4199563/android-util-log-when-publishing-what-can-i-do-not-do If allora usi un proguard costante rimuoverà le linee di codice quando == false. – Blundell
È vero che questo è un hack, e un brutto, ma penso che sia meglio che mettere "if (DEBUG)" ovunque. Il codice risultante è più pulito e il risultato è lo stesso nell'applicazione esportata. Inoltre, per qualche ragione, Eclipse si lamenta del codice morto se la costante di debug è falsa e non mi piace. Grazie per l'idea, però :) –
Si noti che potrebbe esserci ancora un codice morto se si superano i tipi di dati di base. Proguard non rimuove il tipo di dati di base alla corrispondente conversione 'Object'. Per esempio. se passi un 'int', Proguard lascerà nella riga' Integer.valueOf (someVar); ' – crazymaik