using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using UnityEditor;
|
using System.Reflection;
|
using System;
|
using System.IO;
|
using System.Text.RegularExpressions;
|
using System.Linq;
|
|
public class ConfusionEditorWindow : EditorWindow
|
{
|
[MenuItem("Tools/Confusion")]
|
static void Init()
|
{
|
var _win = CreateInstance<ConfusionEditorWindow>();
|
_win.minSize = new Vector2(420, 400);
|
_win.maxSize = _win.minSize;
|
_win.Show();
|
}
|
|
private string LS_KEY_CONFIG_PATH;
|
|
private string m_MapFilePath = "";
|
private List<string> removePathList = new List<string>();
|
|
private Vector2 m_ScrollVec2;
|
private Color m_LabelColor = new Color(.9f, .9f, .8f, 1);
|
|
public static ConfusionSetting Setting { get; private set; }
|
|
void OnEnable()
|
{
|
ConfusionController.Reset();
|
LS_KEY_CONFIG_PATH = Application.dataPath + "LS_KEY_CONFIG_PATH";
|
BuildConfig();
|
}
|
|
private void BuildConfig()
|
{
|
// 确认配置位置
|
string _configPath = EditorPrefs.GetString(LS_KEY_CONFIG_PATH, "");
|
|
// 有配置地址,读取配置地址
|
if (string.IsNullOrEmpty(_configPath))
|
{
|
var _files = Directory.GetFiles(Application.dataPath, "*.cs", SearchOption.AllDirectories);
|
foreach (var _file in _files)
|
{
|
if (_file.Contains("ConfusionEditorWindow"))
|
{
|
_configPath = Path.GetDirectoryName(_file).Replace("\\", "/");
|
break;
|
}
|
}
|
|
_configPath += "/config.json";
|
}
|
|
// 判断配置地址下是否有配置文件
|
if (File.Exists(_configPath))
|
{
|
string _json = null;
|
using (StreamReader _sr = new StreamReader(_configPath))
|
{
|
_json = _sr.ReadToEnd();
|
}
|
|
if (!string.IsNullOrEmpty(_json))
|
{
|
Setting = JsonUtility.FromJson<ConfusionSetting>(_json);
|
}
|
}
|
|
if (Setting == null)
|
{
|
Setting = new ConfusionSetting();
|
EditorPrefs.SetString(LS_KEY_CONFIG_PATH, _configPath);
|
File.Create(_configPath);
|
}
|
|
if (Setting.confusionDirectorys != null)
|
{
|
foreach (var _info in Setting.confusionDirectorys)
|
{
|
ConfusionController.SelectDirectory(_info.path, _info.includeChild);
|
}
|
}
|
}
|
|
private void SaveConfig()
|
{
|
ConfusionSetting _setting = new ConfusionSetting();
|
_setting.confuseField = Setting.confuseField;
|
_setting.confuseMethod = Setting.confuseMethod;
|
|
int _count = ConfusionController.SelectDirectoryCount();
|
_setting.confusionDirectorys = new ConfusionDirectoryInfo[_count];
|
int _index = 0;
|
ConfusionController.ForeachSelectDirectory((_path, _info) =>
|
{
|
_setting.confusionDirectorys[_index] = new ConfusionDirectoryInfo();
|
_setting.confusionDirectorys[_index].path = _path;
|
_setting.confusionDirectorys[_index].includeChild = _info.includeChild;
|
_index++;
|
});
|
|
string _json = JsonUtility.ToJson(_setting);
|
Debug.Log(_json);
|
|
string _configPath = EditorPrefs.GetString(LS_KEY_CONFIG_PATH, "");
|
if (string.IsNullOrEmpty(_configPath))
|
{
|
Debug.LogErrorFormat("找不到配置地址!");
|
return;
|
}
|
|
using (StreamWriter _sw = new StreamWriter(_configPath))
|
{
|
_sw.Write(_json);
|
}
|
}
|
|
void OnGUI()
|
{
|
Color _defaultColor = GUI.color;
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUI.color = m_LabelColor;
|
GUILayout.Label("ConfusionDiretory", EditorStyles.toolbarButton, GUILayout.Width(110));
|
GUI.color = _defaultColor;
|
if (GUILayout.Button("ADD +", EditorStyles.toolbarButton, GUILayout.ExpandWidth(true)))
|
{
|
var _path = EditorUtility.OpenFolderPanel("选择要被混淆的脚本文件夹",
|
Application.dataPath, "");
|
if (!string.IsNullOrEmpty(_path))
|
{
|
ConfusionController.SelectDirectory(_path);
|
}
|
}
|
|
EditorGUILayout.EndHorizontal();
|
|
if (ConfusionController.SelectDirectoryCount() == 0)
|
{
|
EditorGUILayout.HelpBox("点击[ADD+]按钮添加一个想要被混淆的脚本文件夹,可以多次添加\r\n"
|
+ "添加完毕以后点击Confusion按钮进行混淆\r\n"
|
+ "混淆后会生成一个混淆列表文件,可以将混淆的文件恢复回来.", MessageType.Info);
|
}
|
|
removePathList.Clear();
|
|
m_ScrollVec2 = EditorGUILayout.BeginScrollView(m_ScrollVec2);
|
|
int _i = 1;
|
|
ConfusionController.ForeachSelectDirectory((key, info) =>
|
{
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUILayout.Label("└", GUILayout.Width(18));
|
GUILayout.Label(_i.ToString(), EditorStyles.toolbarButton, GUILayout.Width(20));
|
GUILayout.Label(key, EditorStyles.textField, GUILayout.ExpandWidth(true));
|
info.includeChild = GUILayout.Toggle(info.includeChild,
|
"IncludeChild",
|
EditorStyles.toolbarButton,
|
GUILayout.Width(80));
|
if (GUILayout.Button("DEL -", EditorStyles.toolbarButton, GUILayout.Width(70)))
|
{
|
removePathList.Add(key);
|
}
|
EditorGUILayout.EndHorizontal();
|
_i++;
|
});
|
|
EditorGUILayout.EndScrollView();
|
|
for (int i = 0; i < removePathList.Count; ++i)
|
{
|
ConfusionController.RemoveSelectDirectory(removePathList[i]);
|
}
|
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUI.color = m_LabelColor;
|
GUILayout.Label("Confuse Field", EditorStyles.toolbarButton);
|
GUI.color = _defaultColor;
|
bool _toggle = Setting.IsConfusePrivateField;
|
var _newToggle = GUILayout.Toggle(_toggle, "Private", EditorStyles.toolbarButton, GUILayout.Width(100));
|
if (_toggle != _newToggle)
|
{
|
Setting.IsConfusePrivateField = _newToggle;
|
}
|
|
_toggle = Setting.IsConfuseProtectedField;
|
_newToggle = GUILayout.Toggle(_toggle, "Protected", EditorStyles.toolbarButton, GUILayout.Width(100));
|
if (_toggle != _newToggle)
|
{
|
Setting.IsConfuseProtectedField = _newToggle;
|
}
|
|
_toggle = Setting.IsConfusePublicField;
|
_toggle = GUILayout.Toggle(_toggle, "Public", EditorStyles.toolbarButton, GUILayout.Width(100));
|
Setting.IsConfusePublicField = _toggle;
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUI.color = m_LabelColor;
|
GUILayout.Label("Confuse Method", EditorStyles.toolbarButton);
|
GUI.color = _defaultColor;
|
_toggle = Setting.IsConfusePrivateMethod;
|
_toggle = GUILayout.Toggle(_toggle, "Private", EditorStyles.toolbarButton, GUILayout.Width(100));
|
Setting.IsConfusePrivateMethod = _toggle;
|
|
_toggle = Setting.IsConfuseProtectedMethod;
|
_toggle = GUILayout.Toggle(_toggle, "Protected", EditorStyles.toolbarButton, GUILayout.Width(100));
|
Setting.IsConfuseProtectedMethod = _toggle;
|
|
_toggle = Setting.IsConfusePublicMethod;
|
_toggle = GUILayout.Toggle(_toggle, "Public", EditorStyles.toolbarButton, GUILayout.Width(100));
|
Setting.IsConfusePublicMethod = _toggle;
|
EditorGUILayout.EndHorizontal();
|
|
if (GUILayout.Button("Confusion", GUILayout.Height(100)))
|
{
|
SaveConfig();
|
Confusion();
|
}
|
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUI.color = m_LabelColor;
|
GUILayout.Label("MapFileSavePath", EditorStyles.toolbarButton, GUILayout.Width(110));
|
GUI.color = _defaultColor;
|
GUILayout.TextField(ConfusionController.DataModel.ReConfuseMapFileDir, EditorStyles.toolbarTextField, GUILayout.Width(222));
|
if (GUILayout.Button("SELECT", EditorStyles.toolbarButton, GUILayout.Width(70)))
|
{
|
var _path = EditorUtility.OpenFolderPanel("选择混淆替换对应文件存放路径",
|
Application.dataPath, "");
|
if (!string.IsNullOrEmpty(_path))
|
{
|
ConfusionController.DataModel.ReConfuseMapFileDir = _path.Replace("\\", "/");
|
}
|
}
|
EditorGUILayout.EndHorizontal();
|
|
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
|
GUI.color = m_LabelColor;
|
GUILayout.Label("ReConfusionMapFile", EditorStyles.toolbarButton, GUILayout.Width(110));
|
GUI.color = _defaultColor;
|
GUILayout.TextField(m_MapFilePath, EditorStyles.toolbarTextField, GUILayout.Width(222));
|
if (GUILayout.Button("SELECT", EditorStyles.toolbarButton, GUILayout.Width(70)))
|
{
|
m_MapFilePath = EditorUtility.OpenFilePanel("选择要反混淆的文件",
|
ConfusionController.DataModel.ReConfuseMapFileDir, "json");
|
}
|
GUILayout.FlexibleSpace();
|
EditorGUILayout.EndHorizontal();
|
|
if (GUILayout.Button("ReConfusion", GUILayout.Height(100)))
|
{
|
ConfusionController.ReConfusion(m_MapFilePath);
|
}
|
}
|
|
private void Confusion()
|
{
|
if (ConfusionController.SelectDirectoryCount() == 0)
|
{
|
EditorUtility.DisplayDialog("警告", "未指定要混淆的文件夹\r\n请点击 [ADD +] 按钮进行添加", "返回");
|
return;
|
}
|
|
ConfusionController.CollectConfusionDirectory();
|
ConfusionController.DecideClassType();
|
ConfusionController.BuildAssembleRelation();
|
//ConfusionController.ReplaceFieldAndMethod();
|
//ConfusionController.BuildConfusionRelation();
|
|
EditorUtility.ClearProgressBar();
|
}
|
|
}
|