diff --git a/.gitignore b/.gitignore index 761bec3..f412ff3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ tools decompiled dist __pycache__ -keystore.jks \ No newline at end of file +keystore.jks +help \ No newline at end of file diff --git a/main.py b/main.py index f3482fb..566e16f 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,14 @@ from config import log, console from time import time import math +import argparse +parser = argparse.ArgumentParser(prog='anixart patcher') +parser.add_argument("--no-decompile", action='store_true') +parser.add_argument("--no-compile", action='store_true') + if __name__ == "__main__": + args = parser.parse_args() + check_and_download_all_tools() check_java_version() @@ -15,11 +22,15 @@ if __name__ == "__main__": if not apks: log.fatal(f"apks folder is empty") exit(1) - apk = select_apk(apks) + if not apk: + log.info('cancelled') + exit(0) start_time = time() - decompile_apk(apk) + + if not args.no_decompile: + decompile_apk(apk) patches = get_patches() patches = select_patches(patches) @@ -35,8 +46,10 @@ if __name__ == "__main__": console.print(f"{status['name']}: ✘", style="bold red") statuses_err.append(status["name"]) - compile_apk(f"{apk.removesuffix(".apk")}-patched.apk") - sign_apk(f"{apk.removesuffix(".apk")}-patched.apk") + if not args.no_compile: + compile_apk(f"{apk.removesuffix(".apk")}-patched.apk") + sign_apk(f"{apk.removesuffix(".apk")}-patched.apk") + end_time = time() log.info("Finished") diff --git a/patches/disable_beta_banner.py b/patches/disable_beta_banner.py new file mode 100644 index 0000000..83a8af8 --- /dev/null +++ b/patches/disable_beta_banner.py @@ -0,0 +1,45 @@ +"""Remove beta banner""" + +priority = 0 +import os +from tqdm import tqdm +from lxml import etree + +from typing import TypedDict + + +class PatchConfig_DisableBetaBanner(TypedDict): + src: str + + +def apply(config: PatchConfig_DisableBetaBanner) -> bool: + xml_ns = { + "android": "http://schemas.android.com/apk/res/android", + "app": "http://schemas.android.com/apk/res-auto", + } + attributes = [ + "paddingTop", + "paddingBottom", + "paddingStart", + "paddingEnd", + "layout_width", + "layout_height", + "layout_marginTop", + "layout_marginBottom", + "layout_marginStart", + "layout_marginEnd" + ] + + beta_banner_xml = f"{config['src']}/res/layout/item_beta.xml" + if os.path.exists(beta_banner_xml): + parser = etree.XMLParser(remove_blank_text=True) + tree = etree.parse(beta_banner_xml, parser) + root = tree.getroot() + + for attr in attributes: + tqdm.write(f"set {attr} = 0.0dip") + root.set(f"{{{xml_ns['android']}}}{attr}", "0.0dip") + + tree.write(beta_banner_xml, pretty_print=True, xml_declaration=True, encoding="utf-8") + + return True diff --git a/scripts/select_patches.py b/scripts/select_patches.py index c86fed5..c1e0969 100644 --- a/scripts/select_patches.py +++ b/scripts/select_patches.py @@ -69,19 +69,25 @@ def apply_patches(patches: list[str]) -> list[PatchStatus]: ) modules.append(Patch(name, module)) modules.sort(key=lambda x: x.package.priority, reverse=True) - - for patch in tqdm(modules, colour="green", desc="patching apk"): - tqdm.write(f"patch apply: {patch.name}") - conf = {} - if os.path.exists(f"{config['folders']['patches']}/{patch.name}.config.json"): - with open( - f"{config['folders']['patches']}/{patch.name}.config.json", - "r", - encoding="utf-8", - ) as conf: - conf = json.loads(conf.read()) - conf["src"] = config["folders"]["decompiled"] - status = patch.apply(conf) - statuses.append({"name": patch.name, "status": status}) + + with tqdm( + total=len(modules), + unit="patch", + unit_divisor=1, + ) as bar: + for patch in modules: + bar.set_description(f"{patch.name}") + conf = {} + if os.path.exists(f"{config['folders']['patches']}/{patch.name}.config.json"): + with open( + f"{config['folders']['patches']}/{patch.name}.config.json", + "r", + encoding="utf-8", + ) as conf: + conf = json.loads(conf.read()) + conf["src"] = config["folders"]["decompiled"] + status = patch.apply(conf) + statuses.append({"name": patch.name, "status": status}) + bar.update() return statuses