добавление вспомогательных функций, исправление добавления всплывающего окна первого запуска

This commit is contained in:
2025-09-01 10:14:51 +03:00
parent f24cce328c
commit aff292fd8b
17 changed files with 159 additions and 40 deletions
+14 -3
View File
@@ -1,10 +1,12 @@
"""Compress PNGs""" """Compress PNGs"""
priority = 1
priority = -1
from tqdm import tqdm from tqdm import tqdm
import os import os
import subprocess import subprocess
def compress_pngs(root_dir): def compress_pngs(root_dir):
compressed_files = [] compressed_files = []
for dirpath, _, filenames in os.walk(root_dir): for dirpath, _, filenames in os.walk(root_dir):
@@ -14,14 +16,23 @@ def compress_pngs(root_dir):
tqdm.write(f"Сжимаю: {filepath}") tqdm.write(f"Сжимаю: {filepath}")
try: try:
subprocess.run( subprocess.run(
["pngquant", "--force", "--ext", ".png", "--quality=65-90", filepath], [
check=True, capture_output=True "pngquant",
"--force",
"--ext",
".png",
"--quality=65-90",
filepath,
],
check=True,
capture_output=True,
) )
compressed_files.append(filepath) compressed_files.append(filepath)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
tqdm.write(f"Ошибка при сжатии {filepath}: {e}") tqdm.write(f"Ошибка при сжатии {filepath}: {e}")
return compressed_files return compressed_files
def apply(config: dict) -> bool: def apply(config: dict) -> bool:
files = compress_pngs("./decompiled") files = compress_pngs("./decompiled")
return len(files) > 0 and any(files) return len(files) > 0 and any(files)
+2 -1
View File
@@ -50,5 +50,6 @@
"xml_ns": { "xml_ns": {
"android": "http://schemas.android.com/apk/res/android", "android": "http://schemas.android.com/apk/res/android",
"app": "http://schemas.android.com/apk/res-auto" "app": "http://schemas.android.com/apk/res-auto"
} },
"speeds": [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 9.0]
} }
+16
View File
@@ -0,0 +1,16 @@
"""Change application icon"""
priority = 0
from tqdm import tqdm
import struct
def float_to_hex(f):
b = struct.pack(">f", f)
return b.hex()
def apply(config: dict) -> bool:
assert float_to_hex(1.5) == "0x3fc00000"
return False
+4 -6
View File
@@ -1,22 +1,20 @@
"""Insert new files""" """Insert new files"""
priority = 0 priority = 0
from tqdm import tqdm from tqdm import tqdm
import shutil import shutil
import os import os
def apply(config: dict) -> bool: def apply(config: dict) -> bool:
# Mod first launch window # Mod first launch window
shutil.copytree( shutil.copytree(
"./patches/resources/smali_classes4/", "./patches/resources/smali_classes4/", "./decompiled/smali_classes4/"
"./decompiled/smali_classes4/"
) )
# Mod assets # Mod assets
shutil.copy( shutil.copy("./patches/resources/avatar.png", "./decompiled/assets/avatar.png")
"./patches/resources/wowlikon.png",
"./decompiled/assets/wowlikon.png"
)
shutil.copy( shutil.copy(
"./patches/resources/OpenSans-Regular.ttf", "./patches/resources/OpenSans-Regular.ttf",
"./decompiled/assets/OpenSans-Regular.ttf", "./decompiled/assets/OpenSans-Regular.ttf",
+39 -1
View File
@@ -1,13 +1,16 @@
"""Change package name of apk""" """Change package name of apk"""
priority = -1 priority = -1
from tqdm import tqdm from tqdm import tqdm
import os import os
def rename_dir(src, dst): def rename_dir(src, dst):
os.makedirs(os.path.dirname(dst), exist_ok=True) os.makedirs(os.path.dirname(dst), exist_ok=True)
os.rename(src, dst) os.rename(src, dst)
def apply(config: dict) -> bool: def apply(config: dict) -> bool:
assert config["new_package_name"] is not None, "new_package_name is not configured" assert config["new_package_name"] is not None, "new_package_name is not configured"
@@ -27,7 +30,6 @@ def apply(config: dict) -> bool:
"com/swiftsoft/anixartd", "com/swiftsoft/anixartd",
config["new_package_name"].replace(".", "/"), config["new_package_name"].replace(".", "/"),
) )
with open(file_path, "w", encoding="utf-8") as file: with open(file_path, "w", encoding="utf-8") as file:
file.write(new_contents) file.write(new_contents)
except: except:
@@ -47,6 +49,42 @@ def apply(config: dict) -> bool:
config["new_package_name"].replace(".", "/"), config["new_package_name"].replace(".", "/"),
), ),
) )
# rename_dir(
# "./decompiled/smali_classes3/com/swiftsoft/anixartd",
# os.path.join(
# "./decompiled",
# "smali_classes3",
# config["new_package_name"].replace(".", "/"),
# ),
# )
if not os.path.exists("./decompiled/smali_classes4/"):
return True
rename_dir(
"./decompiled/smali_classes4/com/swiftsoft/anixartd",
os.path.join(
"./decompiled",
"smali_classes4",
config["new_package_name"].replace(".", "/"),
),
)
for root, dirs, files in os.walk("./decompiled/smali_classes4/"):
for filename in files:
file_path = os.path.join(root, filename)
if os.path.isfile(file_path):
try:
with open(file_path, "r", encoding="utf-8") as file:
file_contents = file.read()
new_contents = new_contents.replace(
"com/swiftsoft",
"/".join(config["new_package_name"].split(".")[:-1]),
)
with open(file_path, "w", encoding="utf-8") as file:
file.write(new_contents)
except:
pass
os.rmdir("./decompiled/smali_classes2/com/swiftsoft") os.rmdir("./decompiled/smali_classes2/com/swiftsoft")

Before

Width:  |  Height:  |  Size: 26 MiB

After

Width:  |  Height:  |  Size: 26 MiB

@@ -1,4 +1,4 @@
.class public Lcom/wowlikon/about/$1; .class public Lcom/swiftsoft/about/$1;
.super Landroid/graphics/drawable/GradientDrawable; .super Landroid/graphics/drawable/GradientDrawable;
@@ -12,12 +12,12 @@
const/4 v0, -0x1 const/4 v0, -0x1
.line 8 .line 8
invoke-direct {p0, v0}, Lcom/wowlikon/about/$1;->oooooo(I)V invoke-direct {p0, v0}, Lcom/swiftsoft/about/$1;->oooooo(I)V
const/4 v0, 0x0 const/4 v0, 0x0
.line 9 .line 9
invoke-direct {p0, v0}, Lcom/wowlikon/about/$1;->oooooo(Z)V invoke-direct {p0, v0}, Lcom/swiftsoft/about/$1;->oooooo(Z)V
return-void return-void
.end method .end method
@@ -26,12 +26,12 @@
.locals 0 .locals 0
.line 21 .line 21
invoke-virtual {p0, p1}, Lcom/wowlikon/about/$1;->setTint(I)V invoke-virtual {p0, p1}, Lcom/swiftsoft/about/$1;->setTint(I)V
const/16 p1, 0xff const/16 p1, 0xff
.line 22 .line 22
invoke-virtual {p0, p1}, Lcom/wowlikon/about/$1;->setAlpha(I)V invoke-virtual {p0, p1}, Lcom/swiftsoft/about/$1;->setAlpha(I)V
return-void return-void
.end method .end method
@@ -40,7 +40,7 @@
.locals 3 .locals 3
.line 26 .line 26
invoke-virtual {p0, p1}, Lcom/wowlikon/about/$1;->setAutoMirrored(Z)V invoke-virtual {p0, p1}, Lcom/swiftsoft/about/$1;->setAutoMirrored(Z)V
const/16 p1, 0x7f const/16 p1, 0x7f
@@ -57,31 +57,31 @@
const/4 v0, 0x0 const/4 v0, 0x0
invoke-virtual {p0, v0, p1}, Lcom/wowlikon/about/$1;->setStroke(II)V invoke-virtual {p0, v0, p1}, Lcom/swiftsoft/about/$1;->setStroke(II)V
return-void return-void
.end method .end method
# virtual methods # virtual methods
.method public oooooo(II)Lcom/wowlikon/about/$1; .method public oooooo(II)Lcom/swiftsoft/about/$1;
.locals 0 .locals 0
.line 13 .line 13
invoke-virtual {p0, p1}, Lcom/wowlikon/about/$1;->setColor(I)V invoke-virtual {p0, p1}, Lcom/swiftsoft/about/$1;->setColor(I)V
int-to-float p2, p2 int-to-float p2, p2
.line 14 .line 14
invoke-virtual {p0, p2}, Lcom/wowlikon/about/$1;->setCornerRadius(F)V invoke-virtual {p0, p2}, Lcom/swiftsoft/about/$1;->setCornerRadius(F)V
.line 15 .line 15
invoke-direct {p0, p1}, Lcom/wowlikon/about/$1;->oooooo(I)V invoke-direct {p0, p1}, Lcom/swiftsoft/about/$1;->oooooo(I)V
const/4 p1, 0x1 const/4 p1, 0x1
.line 16 .line 16
invoke-direct {p0, p1}, Lcom/wowlikon/about/$1;->oooooo(Z)V invoke-direct {p0, p1}, Lcom/swiftsoft/about/$1;->oooooo(Z)V
return-object p0 return-object p0
.end method .end method
@@ -1,4 +1,4 @@
.class public Lcom/wowlikon/about/$2; .class public Lcom/swiftsoft/about/$2;
.super Ljava/lang/Object; .super Ljava/lang/Object;
@@ -143,7 +143,7 @@
move-result-object v11 move-result-object v11
const-string v12, "wowlikon.png" const-string v12, "avatar.png"
invoke-virtual {v11, v12}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream; invoke-virtual {v11, v12}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
@@ -189,16 +189,16 @@
move-result-object v3 move-result-object v3
const-string v11, "%D0%9C%D0%BE%D0%B4+%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BD+wowlikon+%D1%81+%D0%BD%D0%BE%D0%B2%D1%8B%D1%8B%D0%BC%D0%B8+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC%D0%B8%21%0A%0A%D0%A1%D0%B4%D0%B5%D0%BB%D0%B0%D0%BD%D0%BE+%D1%81+%E2%9D%A4%EF%B8%8F+%D0%BE%D1%82+wowlikon" const-string v11, "%D0%9C%D0%BE%D0%B4+%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D0%BD+wowlikon+%D1%81+%D0%BD%D0%BE%D0%B2%D1%8B%D1%8B%D0%BC%D0%B8+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC%D0%B8%21%0A%0A%D0%A1%D0%B4%D0%B5%D0%BB%D0%B0%D0%BD%D0%BE+%D1%81+%E2%9D%A4%EF%B8%8F+%D0%BE%D1%82+swiftsoft"
.line 69 .line 69
invoke-virtual {v3, v11}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder; invoke-virtual {v3, v11}, Landroid/app/AlertDialog$Builder;->setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;
move-result-object v3 move-result-object v3
new-instance v11, Lcom/wowlikon/about/$4; new-instance v11, Lcom/swiftsoft/about/$4;
invoke-direct {v11}, Lcom/wowlikon/about/$4;-><init>()V invoke-direct {v11}, Lcom/swiftsoft/about/$4;-><init>()V
const-string v12, "\u041c\u044b \u0432 Telegram" const-string v12, "\u041c\u044b \u0432 Telegram"
@@ -207,9 +207,9 @@
move-result-object v3 move-result-object v3
new-instance v11, Lcom/wowlikon/about/$3; new-instance v11, Lcom/swiftsoft/about/$3;
invoke-direct {v11}, Lcom/wowlikon/about/$3;-><init>()V invoke-direct {v11}, Lcom/swiftsoft/about/$3;-><init>()V
const-string v12, "\u041f\u043e\u043d\u044f\u0442\u043d\u043e" const-string v12, "\u041f\u043e\u043d\u044f\u0442\u043d\u043e"
@@ -229,13 +229,13 @@
move-result-object v3 move-result-object v3
.line 75 .line 75
new-instance v11, Lcom/wowlikon/about/$1; new-instance v11, Lcom/swiftsoft/about/$1;
invoke-direct {v11}, Lcom/wowlikon/about/$1;-><init>()V invoke-direct {v11}, Lcom/swiftsoft/about/$1;-><init>()V
const/16 v12, 0x14 const/16 v12, 0x14
invoke-virtual {v11, v5, v12}, Lcom/wowlikon/about/$1;->oooooo(II)Lcom/wowlikon/about/$1; invoke-virtual {v11, v5, v12}, Lcom/swiftsoft/about/$1;->oooooo(II)Lcom/swiftsoft/about/$1;
move-result-object v5 move-result-object v5
@@ -1,4 +1,4 @@
.class public Lcom/wowlikon/about/$3; .class public Lcom/swiftsoft/about/$3;
.super Ljava/lang/Object; .super Ljava/lang/Object;
# interfaces # interfaces
@@ -21,7 +21,7 @@
.locals 1 .locals 1
.line 23 .line 23
invoke-virtual {p0, p1}, Lcom/wowlikon/about/$3;->oooooo(Ljava/lang/Object;)V invoke-virtual {p0, p1}, Lcom/swiftsoft/about/$3;->oooooo(Ljava/lang/Object;)V
const-string p1, "Dialog" const-string p1, "Dialog"
@@ -1,4 +1,4 @@
.class public Lcom/wowlikon/about/$4; .class public Lcom/swiftsoft/about/$4;
.super Ljava/lang/Object; .super Ljava/lang/Object;
# interfaces # interfaces
@@ -1,2 +1,2 @@
.class public Lcom/wowlikon/authorization/AutoLogin; .class public Lcom/swiftsoft/authorization/AutoLogin;
.super Ljava/lang/Object; .super Ljava/lang/Object;
@@ -1,2 +1,2 @@
.class public Lcom/wowlikon/authorization/FirebaseDB; .class public Lcom/swiftsoft/authorization/FirebaseDB;
.super Ljava/lang/Object; .super Ljava/lang/Object;
@@ -1,2 +1,2 @@
.class public Lcom/wowlikon/authorization/Login; .class public Lcom/swiftsoft/authorization/Login;
.super Ljava/lang/Object; .super Ljava/lang/Object;
@@ -1,2 +1,2 @@
.class public Lcom/wowlikon/authorization/SaveLoginLocal; .class public Lcom/swiftsoft/authorization/SaveLoginLocal;
.super Ljava/lang/Object; .super Ljava/lang/Object;
View File
+6
View File
@@ -0,0 +1,6 @@
import struct
def float_to_hex(f):
b = struct.pack(">f", f)
return b.hex()
+49
View File
@@ -0,0 +1,49 @@
from lxml import etree
from copy import deepcopy
def insert_after(anchor_name: str, elem_name: str):
file_path = "../decompiled/res/values/public.xml"
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse(file_path, parser)
root = tree.getroot()
anchor = None
types = {}
for idx, elem in enumerate(root):
assert elem.tag == "public"
assert elem.keys() == ["type", "name", "id"]
attrs = dict(zip(elem.keys(), elem.values()))
if attrs["name"] == anchor_name:
assert anchor == None
anchor = (elem, attrs)
types[attrs["type"]] = types.get(attrs["type"], []) + [int(attrs["id"], 16)]
free_ids = set()
group = types[anchor[1]["type"]]
for i in range(min(group), max(group) + 1):
if i not in group:
free_ids.add(i)
assert len(free_ids) > 0
new_id = None
for i in free_ids:
if i > int(anchor[1]["id"], 16):
new_id = i
break
if new_id == None:
new_id = max(group) + 1
for name, group in types.items():
if name == anchor[1]["type"]:
continue
if new_id in group:
new_id = max(group)
new_elem = deepcopy(anchor[0])
new_elem.set("id", new_id)
new_elem.set("name", elem_name)
anchor[0].addnext(new_elem)
tree.write(file_path, pretty_print=True, xml_declaration=True, encoding="utf-8")
return new_id