2016-07-27 7 views
1

Ich habe eine Situation, in der ich eine Instanzvariable , die nichts als meine Klasse ist, die ich mit Methode MainActivity.class.getsimpleName() holen.Vermeiden Sie einzelne Instanz Variable verschleiert werden in Android

Eg. public static final String TAG=MainActivity.class.getsimpleName();

Ich verwende diese TAG Variable für meine Google Analytics-Tracking. In der Tat wegen pro guard meine Variable ist obfuscated und ich bekomme einige nutzlose Zeichenfolge als mein Klassenname für die Verfolgung, also Analyse ist nicht möglich, und ich habe 100 von Klassen zu hart Code alle TAG Variablen jeder Klasse (die ich wird als mein letzter Ausweg).

ich möchte auch den Code verschleiern, um ein wenig Sicherheit für meine App zu erhalten. Gibt es eine Möglichkeit, dass ich TAG Variable nur von Verschleierung ausgeschlossen oder irgendeine Weise kann ich meine Analyse sinnvoll.

Wie kann ich dieses Problem effizient lösen?

+0

Mögliche Duplikate von [Proguard Keep Klassennamen?] (Http://stackoverflow.com/questions/10971810/proguard-keep-class-names) –

+0

Ich habe 'TAG' Variable ist all meine Aktivitäten und Fragmente kann ich schließe nicht alle Klassen aus, da ich auch eine Verschleierung benötige. –

Antwort

3

public static final String TAG = "MainActivity";

Und wenn Sie den Wert von TAG ändern möchten, lassen Sie Android Studio es für Sie Refactoring.

Das ist die einzige Möglichkeit, da TAG nicht verschleiert ist. Dies ist Ihr TAG Besitzer, der verschleiert ist.

Wenn ich Recht habe, sind Ihre Aktivitäten in Ordnung (weil AndroidManifest die genaue Syntax erfordern). Aber deine Fragmente sind. Das ist immer noch weniger wichtig als Refaktor.

Versuchen Sie, die replaceAll Android Studio-Funktion mit regex für Ihre Zeit zu sparen, wie:

Fund: TAG = (.+).class.getSimpleName\(\); ersetzen: TAG = "$1";

+0

Ich mag wirklich deine Lösung, aber wie kann ich die TAG-Variable von verschiedenen Klassen in ihren jeweiligen Klassennamen ändern.ie 'MainActivity',' SplashActivity' usw. –

+0

Mit der Regex schlage ich vor, dass Sie den Klassennamen im '(. +) 'und benutze es mit' $ 1'. Strg + Shift + R (oder Cmd + Shift + R für Mac), um einen replaceAll zu verwalten (vergiss nicht, das Kontrollkästchen "Regular expression" zu kreuzen). Wenn Sie die neuen Klassen automatisch mit einem bereits geschriebenen TAG generieren möchten, bearbeiten Sie die Vorlage der Klasse. Auf dem Mac: Einstellungen> Editor> Datei- und Code-Templates >> Klasse => Hinzufügen 'public static final TAG =" $ {NAME} "; im Klassenblock. –

+0

Wenn die Zeile mit Leerzeichen formatiert ist, könnte diese reg-ex nützlich sein, um die Formatierung beizubehalten: find: 'TAG (*) = (. +). Class.getSimpleName \ (\);' ersetzen: 'TAG $ 1 = "$ 2"; ' – jayeffkay

0

Als Nachteil, eine solche Lösung weitgehend zunichte macht die Größe/Verschleierungs Verbesserungen, da Der Code enthält jetzt wieder die ursprünglichen Klassennamen, wenn auch indirekt.

Verwandte Themen