Возможный дубликат:
Удаление неиспользуемых строк во время оптимизации ProGuard
У меня есть приложение Android с десятками протоколирующих операторов. Я бы предпочел, чтобы они не появлялись в версии выпуска, поэтому я использовал Proguard с чем-то вроде этого в файле proguard.cfg
:
-assumenosideeffects class android.util.Log {
public static *** d(...);
}
Но проблема в том, что существует много Log.d("something is " + something)
, и хотя оператор Log.d()
удаляется из байт-кода, строки все еще существуют.
Итак, после ответа this я создал простой класс-оболочку, что-то вроде строк:
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());
}
}
Затем я редактировал свой proguard.cfg
:
-assumenosideeffects class my.package.MyLogger {
public static *** d(...);
}
Но строки все еще находятся в сгенерированном байт-коде!
Кроме этого, я использую стандартный proguard.cfg
, предоставляемый Android SDK. Я что-то делаю неправильно?
Изменить: после изучения сгенерированного байт-кода я увидел, что строки были там, но они не добавлялись друг к другу, как я думал. Они были сохранены в массиве. Зачем? Передавать их в качестве переменных параметров для моего метода. Похоже, ProGuard это не нравится, поэтому я изменил свой класс регистратора следующим образом:
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)
}
Это уродливо, но теперь строки нигде в байт-коде.
Это какая-то ошибка/ограничение ProGuard? Или я просто не понимаю, как это работает?