2016-07-27 5 views
1

У меня есть ситуация, когда у меня есть переменная экземпляра TAG, которая является ничем иным, как моим именем класса, которое я извлекаю с помощью метода MainActivity.class.getsimpleName().Избегайте одиночной переменной экземпляра из-за обфускации в android

Например. public static final String TAG=MainActivity.class.getsimpleName();

Я использую эту переменную TAG для отслеживания Google Analytics. На самом деле из-за pro guard моя переменная имеет значение obfuscated, и я получаю какую-то бесполезную строку в качестве имени моего класса для отслеживания, поэтому анализ невозможен, и у меня есть 100 классов для жесткого кодирования всех переменных TAG каждого класса (который я будет в качестве моего последнего средства).

Я также хочу запутать код, чтобы сохранить определенную безопасность для моего приложения. Есть ли способ, которым я могу исключить только переменную TAG из-за обфускации или каким-либо образом я могу получить мой анализ.

Как я могу решить эту проблему эффективно?

+0

Возможный дубликат [Proguard сохранить имена классов?] (Http://stackoverflow.com/questions/10971810/proguard-keep-class-names) –

+0

У меня есть переменная 'TAG' - это все мои действия и фрагменты, которые я могу 't исключать все классы, поскольку я также хочу обфускацию. –

ответ

3

public static final String TAG = "MainActivity";

И если вы хотите, чтобы изменить значение TAG, пусть AndroidStudio реорганизовать это для вас.

Это единственная возможность, так как TAG не запутывается. Это ваш TAG владелец, который запутан.

Если я прав, ваша деятельность в порядке с этим (потому что AndroidManifest требует точного синтаксиса). Но ваши Фрагменты. Это еще меньше для рефакторинга.

Попробуйте функцию replaceAll AndroidStudio с регулярным выражением, чтобы сэкономить ваше время, как:

находка: TAG = (.+).class.getSimpleName\(\); заменить: TAG = "$1";

+0

Мне очень нравится, что вы - решение, но как я могу изменить переменную TAG из разных классов в их конкретное classname.ie 'MainActivity',' SplashActivity' и т. Д. –

+0

С помощью регулярного выражения, которое я предлагаю, вы записываете имя класса в '(. +) 'и использовать его с' $ 1'. Ctrl + Shift + R (или cmd + shift + R для mac) для управления replaceAll (не забудьте пересечь флажок «Регулярное выражение»). Если вы хотите автоматически генерировать новые классы с уже написанной TAG, juste отредактируйте шаблон класса. На mac: Предпочтения> Редактор> Шаблоны файлов и кодов >> Класс => Добавить 'public static final TAG =" $ {NAME} ";' в блоке класса. –

+0

Если строка отформатирована с пустым пространством, этот reg-ex может пригодиться для форматирования: find: 'TAG (*) = (. +). Class.getSimpleName \ (\);' replace: 'TAG $ 1 = "$ 2"; ' – jayeffkay

0

В нижней стороне, такое решение в значительной степени сводит на нет улучшения размер/запутывания, так как теперь код снова содержит исходные имена классов, хотя и косвенно.