不应该为TAG使用.class.getSimpleName()吗?

时间:2019-02-15 23:29:51

标签: android obfuscation

我读到一个人不应该使用像

这样的TAG
private static final String TAG = ThisClassName.class.getSimpleName();

但是

private static final String TAG = "MCLSN";

因为ProGaurd将创建错误和/或无法正确混淆代码。这些是正当理由吗?

参考文献:

http://www.drewhannay.com/2016/02/android-logcat-tag-best-practices.html https://blog.mindorks.com/applying-proguard-in-an-android-application

2 个答案:

答案 0 :(得分:3)

老实说,这是一个优先事项,但是我更喜欢简单的String选项。

使用mock()选项的唯一好处是因为它支持重构。因此,只有在更改类的名称(这种情况很少发生)或复制/粘贴文件以用作模板时,它才有用。

因此,如果您经常这样做,我会明白为什么您会偏爱第一种选择。它只是使不必手动更改TAG变得更加容易。

我最初还使用getSimpleName()作为TAG,直到最近遇到一个小问题。

使用MVVM体系结构时,每个视图实际上只有一个ViewModel,因此我创建了一个ViewModelFactory,该ViewModelFactory为该视图创建并返回正确的ViewModel。由于它是唯一的,因此我决定将TAG用作我所需的ViewModel的标识符。

因此,通过在TAG上使用简单的Switch-case语句,我应该能够获得正确的ViewModel。但是,使用getSimpleName()时,根本不能将TAG用作大小写表达式。我收到错误:getSimpleName()

因此,如果您仅打算在某些情况下使用TAG(例如Logcat),则只需使用Constant Expression Required就可以了。但是,如果您打算将它们用作特定类组的唯一类标识符,则需要使用纯String选项。

答案 1 :(得分:2)

这肯定是一个问题。我正在使用当前使用getSimpleName()作为TAG的代码,并且如上所述,使用proguard可以将这些代码从“ FragmentA”混淆为“ a”。

如果使用这些标签进行识别,则很容易以这种方式引入错误,因为可能会有多个名称混淆为“ a”。

我们还有一个额外的问题,因为这些混淆的TAG用于数据库ID和字段。因此,解决此问题将破坏客户的数据库行为。

坏东西,如果可能的话,最好尽早避免。