標籤:ext 路徑 lin 產生器 creat tools 蘋果 assets ase
蘋果提審中,被4.3重複應用打回來很常見(諸如上馬甲包等),而首先一步是面對機審,我們的處理方法是通過寫工具產生一些垃圾代碼來避開蘋果機審,以下是整個實現:
using LuaFramework;
using UnityEditor;
using System;
using System.Text;
using System.IO;
//檔案定義:垃圾代碼產生器
//一、設計要點:
//1、用目前時間+產生代碼序號產生md5字元,用md5字元命名類名、方法名、變數名等
//2、隨機一種範式,用產生的類名等作為參數產生該範式代碼
//3、產生GarbageCodeManager類調用所有產生的程式碼
//二、範式產生要點:
//1、用正常c#寫代碼
//2、用ChangeClassFile2CodeCreateTool.py http://www.cnblogs.com/ChengShuKaiShi/p/7750557.html工具將正常代碼轉成產生該代碼的代碼(類名、方法名等已替換為參數)
//三、遊戲調用
//1、在main.cs中通過UNITY_IPHONE && SDK宏控制調用GarbageCodeManager.CallAllGarbageCode()調用產生的程式碼
//青_樹
//時間:2017/10/20
public class GarbageCodeTool
{
private const string namespaceName = "LuaFramework"; //產生代碼的命名空間
private const string garbageCodeManagerName = "GarbageCodeManager"; //管理所有垃圾代碼的檔案名稱
private static string mstCreateCodeFilePath; //產生代碼路徑
private const int maxFileCount = 100; //垃圾代碼個數
private const int tplCount = 1; //產生垃圾代碼範式個數
//範式委託:命名空間,類名,入口方法名,入口方法參數1,入口方法參數2,入口方法參數3
private delegate bool GenerateCodeHandle(string namespaceName,string className,string methonName,string param1, string param2, string param3);
private static GenerateCodeHandle[] arrGenerateCodeHandle;
//產生代碼
[MenuItem("Tools/GenerateGarbageCode")]
static void GenerateGarbageCode() {
//初始化所有範式
InitAllTpl();
//刪除舊目錄代碼
if (Directory.Exists(mstCreateCodeFilePath))
{
Directory.Delete(mstCreateCodeFilePath, true);
}
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
//重新建立目錄
Directory.CreateDirectory(mstCreateCodeFilePath);
Directory.CreateDirectory(mstCreateCodeFilePath + "/Code");
string timeNow = DateTime.Now.ToLongDateString();
string[] arrClassName = new string[maxFileCount];
string[] arrMethonName = new string[maxFileCount];
//產生代碼
for (int i = 0; i < maxFileCount; i++) {
//根據目前時間+i 產生md5值
string md5 = Util.md5(timeNow + i.ToString());
md5 = "_" + md5;
//用md5值組建檔案名、方法名、參數名
string className = md5;
string methonName = md5 + "m";
string param1 = md5 + "a";
string param2 = md5 + UnityEngine.Random.Range(0, 100);
string param3 = md5 + "c";
//隨機產生一種範式檔案
int randNum = UnityEngine.Random.Range(0, tplCount);
if (arrGenerateCodeHandle[randNum] != null)
{
bool isSuccess = arrGenerateCodeHandle[randNum](namespaceName, className, methonName, param1, param2, param3);
if (isSuccess) {
arrClassName[i] = className;
arrMethonName[i] = methonName;
}
}
else
{
Util.LogError("不存在範式,索引:"+ randNum.ToString());
}
}
//根據產生的檔案產生調用所有函數的檔案
string managerFilePath = Path.Combine(mstCreateCodeFilePath, garbageCodeManagerName + ".cs");
CreateGarbageManagerClass(managerFilePath, garbageCodeManagerName,namespaceName, arrClassName, arrMethonName);
AssetDatabase.Refresh();
AssetDatabase.SaveAssets();
EditorUtility.DisplayDialog("GenerateGarbageCode","產生完畢!", "確定");
}
//初始化所有範式
static void InitAllTpl() {
mstCreateCodeFilePath = UnityEngine.Application.dataPath + "/LuaFramework/Scripts/GarbageCode";
arrGenerateCodeHandle = new GenerateCodeHandle[tplCount];
arrGenerateCodeHandle[0] = CreateTpl1;
}
//產生調用所有產生的範式代碼
public static void CreateGarbageManagerClass(string stSaveFilePath, string className1, string stNameSpace,string[] allClassName,string[] allMethonName)
{
if (string.IsNullOrEmpty(stSaveFilePath))
{
return;
}
StringBuilder stringBuilder = new StringBuilder();
if (!string.IsNullOrEmpty(stNameSpace))
{
stringBuilder.AppendFormat(string.Format("namespace {0}\n", stNameSpace));
stringBuilder.AppendLine("{");
}
stringBuilder.AppendLine("using UnityEngine;");
stringBuilder.AppendLine("using System.Collections;");
stringBuilder.AppendLine("");
stringBuilder.AppendLine("namespace LuaFramework {");
stringBuilder.AppendLine(" //垃圾代碼管理器");
stringBuilder.AppendFormat("public class {0}\n", className1);
stringBuilder.AppendLine(" {");
stringBuilder.AppendLine(" //調用所有垃圾代碼");
stringBuilder.AppendLine(" public static void CallAllGarbageCode() {");
//調用所有垃圾代碼
for (int i = 0; i < allClassName.Length; i++) {
string className = allClassName[i];
string methonName = allMethonName[i];
if (className == "" || methonName == "") {
continue;
}
int randa = UnityEngine.Random.Range(0, 1000);
int randb = UnityEngine.Random.Range(0, 1000);
int randc = UnityEngine.Random.Range(0, 1000);
stringBuilder.AppendFormat(" {0} _{1} = new {2}();\n", className, className, className);
if (randc > 500)
{
stringBuilder.AppendFormat(" _{0}.{1}({2},{3});\n", className, methonName, randa, randb);
}
else
{
stringBuilder.AppendFormat(" _{0}.{1}({2},{3},{4});\n", className, methonName, randa, randb,randc);
}
stringBuilder.AppendLine("");
}
stringBuilder.AppendLine(" }");
stringBuilder.AppendLine(" }");
stringBuilder.AppendLine("}");
stringBuilder.AppendLine("");
if (!string.IsNullOrEmpty(stNameSpace))
{
stringBuilder.AppendLine("}");
}
File.WriteAllText(stSaveFilePath, stringBuilder.ToString());
}
//模版1
public static bool CreateTpl1(string namespaceName , string className, string methonName, string param1, string param2, string param3)
{
string fileName = Path.Combine(mstCreateCodeFilePath + "/Code" , className + ".cs");
if (string.IsNullOrEmpty(fileName))
{
return false;
}
StringBuilder stringBuilder = new StringBuilder();
if (!string.IsNullOrEmpty(namespaceName))
{
stringBuilder.AppendFormat(string.Format("namespace {0}\n", namespaceName));
stringBuilder.AppendLine("{");
}
stringBuilder.AppendLine("");
stringBuilder.AppendFormat("public class {0} \n", className);
stringBuilder.AppendLine("{");
stringBuilder.AppendFormat(" public int {0}(int {1},int {2},int {3} = 1) ",methonName, param1, param2, param3);
stringBuilder.AppendLine("{");
stringBuilder.AppendFormat(" int test1 = {0}Add({1}, {2});\n", className, param1, param2);
stringBuilder.AppendFormat(" return {0}Sub(test1, {1});\n", className, param3);
stringBuilder.AppendLine(" }");
stringBuilder.AppendLine("");
stringBuilder.AppendFormat(" int {0}Add(int a{1}b, int b{2}d) ", className, param1, param2);
stringBuilder.AppendLine("{");
stringBuilder.AppendFormat(" a{0}b += UnityEngine.Random.Range(0, 100);", param1);
stringBuilder.AppendFormat(" return a{0}b + b{1}d;", param1, param2);
stringBuilder.AppendLine(" }");
stringBuilder.AppendLine("");
stringBuilder.AppendFormat(" int {0}Sub(int a{1}c, int b{2}e) ", className, param1, param2);
stringBuilder.AppendLine("{");
stringBuilder.AppendFormat(" b{0}e *= 100;", param2);
stringBuilder.AppendFormat(" return a{0}c - b{1}e;", param1, param2);
stringBuilder.AppendLine(" }");
stringBuilder.AppendLine("}");
if (!string.IsNullOrEmpty(namespaceName))
{
stringBuilder.AppendLine("}");
}
File.WriteAllText(fileName, stringBuilder.ToString());
return true;
}
}
蘋果重複應用問題(機審)