Мы создаем приложение для Android, в котором мы используем Timber для Log-output.Мы определили наши собственные функции .e, .d, .v и т. Д. И используем if (BuildConfig.DEBUG)
, чтобы посмотреть, нужно ли выводить журнал.Это решает проблему, заключающуюся в том, что мы не хотим выводить журналы отладки в наших выпусках, но все строковые литералы, используемые в наших вызовах функций, все еще присутствуют в скомпилированном исходном коде.Кроме того, мы используем ProGuard для запутывания.Например, в классе мы можем иметь:
somObj.normalFunction(variable)
Log.d("This secret class achieved its secret mission!");
В нашем выпуске это не будет видно в журналах приложений, но если вы перепроектируете APK, вы увидите что-то вроде:
q.b(m)
z.a("This secret class achieved its secret mission!");
, который может дать подсказку хакерам о том, на какой класс они смотрят.Так что нам нужно либо иметь возможность УДАЛИТЬ все вызовы функций Log во время компиляции (используя некоторую предварительную обработку, аннотации или что-то еще, но, надеюсь, без необходимости добавлять что-либо перед КАЖДЫМ вызовом функции) ИЛИ скрывать всестроковые литеральные параметры для этих вызовов функций.Итак, два идеальных решения были бы, если бы источник, непосредственно перед компиляцией, выглядел так:
q.b(m);
или
q.b(m);
z.a("jgasoisamgp23mmwaföfm,ak,ä")
Просто думая, что я вижу два плохих способа добиться этого,Либо мы окружаем ВСЕ вызовы Log.d
if(BuildConfig.DEBUG)
, что заставит компилятор удалить их перед компиляцией.Но это очень приливно.ИЛИ, мы уверены, что каждый раз, когда вы хотите добавить распечатку журнала, вам нужно сделать
Log.d(LogClass.getLog(1234))
, а затем вы определяете ВСЕ эти журналы внутри LogClass, а затем удаляете их с помощью if(BuildConfig.DEBUG)
и возвращаете нуль вgetLog, если это так.Но каждый раз, когда вы хотите добавить журнал, это делает его более приличным.
Итак, наконец, есть ли ХОРОШЕЕ решение для этого?