fix(hacks): add tflitefix to prevent SIGSEGV crash in games using TensorFlow Lite under ARM translation
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
import glob
|
||||
import os
|
||||
import shutil
|
||||
from stuff.general import General
|
||||
from tools.logger import Logger
|
||||
|
||||
|
||||
class TfliteFix(General):
|
||||
id = "tflitefix"
|
||||
partition = "system"
|
||||
TARGET_OFFSET = 0x2E9204
|
||||
PATCH_BYTES = b"\xc0\x03\x5f\xd6" # ret in AArch64 little-endian
|
||||
|
||||
def __init__(self, android_version="13") -> None:
|
||||
super().__init__()
|
||||
|
||||
def download(self):
|
||||
pass
|
||||
|
||||
@property
|
||||
def skip_extract(self):
|
||||
return True
|
||||
|
||||
def copy(self):
|
||||
pass
|
||||
|
||||
def extra1(self):
|
||||
"""Applies binary patch to libtensorflowlite.so in installed apps"""
|
||||
search_paths = [
|
||||
os.path.expanduser("~/.local/share/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so"),
|
||||
"/var/lib/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so",
|
||||
]
|
||||
found = []
|
||||
for p in search_paths:
|
||||
found.extend(glob.glob(p))
|
||||
|
||||
if not found:
|
||||
Logger.warning("No installed apps with libtensorflowlite.so found in Waydroid data.")
|
||||
return
|
||||
|
||||
for lib_path in found:
|
||||
try:
|
||||
with open(lib_path, "rb") as f:
|
||||
data = bytearray(f.read())
|
||||
|
||||
if len(data) > self.TARGET_OFFSET + 4:
|
||||
if bytes(data[self.TARGET_OFFSET:self.TARGET_OFFSET+4]) == self.PATCH_BYTES:
|
||||
Logger.info(f"Patch already applied to {lib_path}")
|
||||
continue
|
||||
|
||||
backup = lib_path + ".orig"
|
||||
if not os.path.exists(backup):
|
||||
shutil.copy2(lib_path, backup)
|
||||
|
||||
data[self.TARGET_OFFSET:self.TARGET_OFFSET+4] = self.PATCH_BYTES
|
||||
with open(lib_path, "wb") as f:
|
||||
f.write(data)
|
||||
os.chmod(lib_path, 0o755)
|
||||
Logger.info(f"Successfully patched {lib_path}")
|
||||
except Exception as e:
|
||||
Logger.error(f"Failed to patch {lib_path}: {e}")
|
||||
|
||||
def extra2(self):
|
||||
"""Restores original libtensorflowlite.so from backup"""
|
||||
search_paths = [
|
||||
os.path.expanduser("~/.local/share/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so.orig"),
|
||||
"/var/lib/waydroid/data/app/~~*==/*/lib/arm64/libtensorflowlite.so.orig",
|
||||
]
|
||||
for p in search_paths:
|
||||
for orig in glob.glob(p):
|
||||
target = orig[:-5]
|
||||
try:
|
||||
shutil.copy2(orig, target)
|
||||
os.remove(orig)
|
||||
os.chmod(target, 0o755)
|
||||
Logger.info(f"Restored {target}")
|
||||
except Exception as e:
|
||||
Logger.error(f"Failed to restore {target}: {e}")
|
||||
Reference in New Issue
Block a user