from scripts.task import Task import re import os import hashlib from utils import FileUtils def string_to_md5(text): # 将字符串编码为UTF-8字节 text_bytes = text.encode('utf-8') # 创建MD5哈希对象并更新字节数据 md5_hash = hashlib.md5(text_bytes) # 返回十六进制哈希字符串 return md5_hash.hexdigest() class ProjectInterface(Task): def __init__(self, context): super().__init__(context) self.target_code_package_name = "" self.unity_proxy_api_file = "" self.i_android_callback_unity_file = "" self.target_unity_proxy_api_file = "" self.target_i_android_callback_unity_file = "" def generate_encryption_key(self, key: str, s_len: int = -1) -> str: # if game_editor == "Cocos": # return key handle_key = self.context.package_name + key + self.context.package_name processed_key = string_to_md5(handle_key) while processed_key[0].isdigit(): processed_key = processed_key[1:] # 移除首字符 # 计算目标长度 if s_len > 0: target_length = s_len else: target_length = len(key) # 取前N位(根据原始key长度),不足则全部保留 # 如果处理后的key为空(极小概率),则返回空字符串 proguard_value = processed_key[:target_length] if processed_key else "" self.context.proguard_key[key] = proguard_value return proguard_value def handle_common_proguard_game_mapping(self, path: str): pattern = re.compile(r'const val (\w+) = "([^"]+)"') lines = open(path, 'r', encoding='utf-8').readlines() with (open(path, 'w', encoding='utf-8') as f_out): for line in lines: match = pattern.match(line.strip()) # print(line, match) if match: # 提取变量名和原始值 var_name, original_value = match.groups() # 生成MD5并替换 encrypted_value = self.generate_encryption_key(original_value) new_line = f'const val {var_name} = "{encrypted_value}"\n' f_out.write(new_line) else: # 保留非匹配行 f_out.write(line) def execute(self): self.unity_proxy_api_file = os.path.join(self.context.temp_project_path, "launcher-game/src/com/game/hachisdk/unity/UnityProxyApi.java".replace( "/", os.sep)) self.i_android_callback_unity_file = os.path.join(self.context.temp_project_path, "launcher-game/src/com/game/hachisdk/unity/IAndroidCallbackUnity.java".replace( "/", os.sep)) self.target_code_package_name = self.context.package_name + "." + self.generate_encryption_key( self.context.package_name, len(self.context.package_name.split('.')[-1])) self.handle_common_proguard_game_mapping( os.path.join(self.context.temp_project_path, "launcher-game/src/com/game/hachisdk/game/ApiKeys.kt".replace("/", os.sep))) self.handle_common_proguard_game_mapping( os.path.join(self.context.temp_project_path, "launcher-game/src/com/game/hachisdk/game/RespKeys.kt".replace("/", os.sep))) self.handle_common_proguard_game_mapping( os.path.join(self.context.temp_project_path, "launcher-game/src/com/game/launcher/GLMaping.kt".replace("/", os.sep))) target_unity_proxy_api_class = self.target_code_package_name + "." + self.generate_encryption_key( "UnityProxyApi") target_android_callback_unity_class = self.target_code_package_name + "." + self.generate_encryption_key( "IAndroidCallbackUnity") self.target_unity_proxy_api_file = os.path.join(self.context.temp_project_path, "launcher-game", "src", target_unity_proxy_api_class.replace(".", os.sep) + ".java") FileUtils.move(self.unity_proxy_api_file, self.target_unity_proxy_api_file) self.target_i_android_callback_unity_file = os.path.join(self.context.temp_project_path, "launcher-game", "src", target_android_callback_unity_class.replace(".", os.sep) + ".java") FileUtils.move(self.i_android_callback_unity_file, self.target_i_android_callback_unity_file) text = open(self.target_unity_proxy_api_file, "r", encoding="utf-8").read() text = text.replace("com.game.hachisdk.unity", self.target_code_package_name) text = text.replace("UnityProxyApi", self.generate_encryption_key("UnityProxyApi")) text = text.replace("proxyApi", self.generate_encryption_key("proxyApi")) text = text.replace("initCallback", self.generate_encryption_key("initCallback")) text = text.replace("IAndroidCallbackUnity", self.generate_encryption_key("IAndroidCallbackUnity")) text = text.replace("callback", self.generate_encryption_key("callback")) open(self.target_unity_proxy_api_file, "w", encoding="utf-8").write(text) text = open(self.target_i_android_callback_unity_file, "r", encoding="utf-8").read() text = text.replace("com.game.hachisdk.unity", self.target_code_package_name) text = text.replace("IAndroidCallbackUnity", self.generate_encryption_key("IAndroidCallbackUnity")) text = text.replace("callback", self.generate_encryption_key("callback")) open(self.target_i_android_callback_unity_file, "w", encoding="utf-8").write(text) proxy_api = self.generate_encryption_key("proxyApi") init_callback = self.generate_encryption_key("initCallback") callback = self.generate_encryption_key("callback") print("target_unity_proxy_api_class", target_unity_proxy_api_class) print("target_android_callback_unity_class", target_android_callback_unity_class) print("proxy_api", proxy_api) print("init_callback", init_callback) print("callback", callback) pass