【问题标题】:Avoid single instance variable from being obfuscated in android避免单个实例变量在android中被混淆
【发布时间】:2016-12-01 14:23:23
【问题描述】:

我有一个实例变量TAG,它只是我使用方法MainActivity.class.getsimpleName() 获取的类名。

例如。 public static final String TAG=MainActivity.class.getsimpleName();

我正在使用这个TAG 变量进行我的谷歌分析跟踪。事实上,由于pro guard,我的变量是obfuscated,我得到一些无用的字符串作为我的类名进行跟踪,因此无法进行分析,我有100个类来硬编码所有TAG变量每个班级(我将作为我最后的手段)。

我还想混淆代码以维护我的应用程序的一些安全性。有没有办法我只能排除 TAG 变量被混淆或任何可以让我的分析有意义的方法。

我怎样才能有效地解决这个问题?

【问题讨论】:

  • 我有TAG 变量是我所有的活动和片段我不能排除所有的类,因为我也想要混淆。

标签: java android proguard android-proguard


【解决方案1】:

public static final String TAG = "MainActivity";

如果你想改变TAG的值,让AndroidStudio为你重构。

这是唯一的可能性,因为TAG 没有被混淆。这是您的 TAG 所有者,已被混淆。

如果我是对的,那么您的 Activity 就可以了(因为 AndroidManifest 需要确切的语法)。但你的片段是。重构的价值仍然较小。

尝试使用正则表达式的 replaceAll AndroidStudio 函数来节省您的时间,例如:

找到:TAG = (.+).class.getSimpleName\(\); 替换:TAG = "$1";

【讨论】:

  • 我真的很喜欢你的解决方案,但我怎样才能将不同类的 TAG 变量更改为它们特定的类名。即MainActivitySplashActivity 等。
  • 使用我建议的正则表达式,您可以在(.+) 中捕获类名并将其与$1 一起使用。 Ctrl + Shift + R(或 cmd + shift + R for mac)来管理一个 replaceAll(不要忘记越过Regular expression 复选框)。如果你想用已经写好的标签自动生成新的类,只需编辑类的模板。在 mac 上:首选项 > 编辑器 > 文件和代码模板 >> 类 => 在类块中添加 `public static final TAG = "${NAME}";`。
  • 如果该行被格式化为空格,这个正则表达式可能会派上用场来保持格式化:查找:TAG( *) = (.+).class.getSimpleName\(\); 替换:TAG$1 = "$2";
【解决方案2】:

不利的一面是,这样的解决方案在很大程度上抵消了大小/混淆改进,因为代码现在再次包含原始类名,尽管是间接的。

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2021-05-20
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多