More stuff with dex
This commit is contained in:
parent
7229e518d3
commit
89581ccb51
6 changed files with 61 additions and 6 deletions
1
build.bat
Normal file
1
build.bat
Normal file
|
@ -0,0 +1 @@
|
||||||
|
@python buildtool/build.py %*
|
35
buildtool/task/compile_smali.py
Normal file
35
buildtool/task/compile_smali.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import subprocess
|
||||||
|
from .util import *
|
||||||
|
from . import fileutil
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from polly.patcher import process_all_patches
|
||||||
|
|
||||||
|
# Task dependencies
|
||||||
|
from .patch_smali import patch_smali
|
||||||
|
|
||||||
|
def to_dex_name(smali_name):
|
||||||
|
if smali_name == 'smali':
|
||||||
|
return 'classes.dex'
|
||||||
|
else:
|
||||||
|
num = re.match(r"smali_classes([0-9]+)", smali_name).group(1)
|
||||||
|
return f"classes{num}.dex"
|
||||||
|
|
||||||
|
def compile_smali():
|
||||||
|
_ = patch_smali()
|
||||||
|
|
||||||
|
COMPILED_SMALI_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
print("Compiling smali...")
|
||||||
|
for smali_dir in PATCHED_SMALI_DIR.glob("*"):
|
||||||
|
dest_dex = COMPILED_SMALI_DIR / to_dex_name(smali_dir.name)
|
||||||
|
|
||||||
|
# Don't compile if not necessary
|
||||||
|
# This depends on merge_into touching directories with copying
|
||||||
|
if dest_dex.exists() and smali_dir.stat().st_mtime < dest_dex.stat().st_mtime:
|
||||||
|
print(F"Skipping {dest_dex.name}")
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"Compiling {smali_dir.name} => {dest_dex.name}...")
|
||||||
|
_ = subprocess.run(["java", "-jar", "tools/smali-2.5.2.jar", "a", smali_dir, "-o", dest_dex])
|
|
@ -1,7 +1,18 @@
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
def merge_into(src: Path | str, dest: Path | str, check_date: bool = True):
|
def merge_into(src: Path | str, dest: Path | str, check_date: bool = True, touch_directories: bool = True):
|
||||||
|
"""Merges the contents of a directory into another
|
||||||
|
|
||||||
|
Args:
|
||||||
|
src (Path | str): The source directory to merge from
|
||||||
|
dest (Path | str): The destination directory to merge into
|
||||||
|
check_date (bool, optional): If true, only copies files which are newer in src than in dest. Defaults to True.
|
||||||
|
touch_directories (bool, optional): Updates the modified time of parent directories. Defaults to True.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
_type_: _description_
|
||||||
|
"""
|
||||||
src = Path(src)
|
src = Path(src)
|
||||||
dest = Path(dest)
|
dest = Path(dest)
|
||||||
|
|
||||||
|
@ -20,4 +31,8 @@ def merge_into(src: Path | str, dest: Path | str, check_date: bool = True):
|
||||||
_ = shutil.copyfile(src_file, dest_file)
|
_ = shutil.copyfile(src_file, dest_file)
|
||||||
changed = True
|
changed = True
|
||||||
|
|
||||||
|
if touch_directories:
|
||||||
|
for prnt in dest_file.relative_to(dest).parents:
|
||||||
|
(dest / prnt).touch(exist_ok=True)
|
||||||
|
|
||||||
return changed
|
return changed
|
|
@ -5,23 +5,23 @@ import shutil
|
||||||
|
|
||||||
# Task dependencies
|
# Task dependencies
|
||||||
from .patch_resources import patch_resources
|
from .patch_resources import patch_resources
|
||||||
from .patch_smali import patch_smali
|
from .compile_smali import compile_smali
|
||||||
|
|
||||||
# Merges resources from all the previous steps
|
# Merges resources from all the previous steps
|
||||||
|
|
||||||
def merge_resources():
|
def merge_resources():
|
||||||
_ = patch_resources()
|
_ = patch_resources()
|
||||||
_ = patch_smali()
|
_ = compile_smali()
|
||||||
|
|
||||||
first_time = False
|
first_time = False
|
||||||
|
|
||||||
# Copy original resources only the first time
|
# Copy original resources only the first time
|
||||||
if not MERGED_RSC_DIR.exists():
|
if not MERGED_RSC_DIR.exists():
|
||||||
print("Merging original resources...")
|
print("Merging original resources...")
|
||||||
shutil.copytree(EXTRACTED_DIR, MERGED_RSC_DIR, ignore=shutil.ignore_patterns("smali*"))
|
shutil.copytree(EXTRACTED_DIR, MERGED_RSC_DIR, ignore=shutil.ignore_patterns("smali", "smali_classes*"))
|
||||||
first_time = True
|
first_time = True
|
||||||
|
|
||||||
print("Merging patched resources...")
|
print("Merging patched resources...")
|
||||||
_ = fileutil.merge_into(PATCHED_RSC_DIR, MERGED_RSC_DIR, check_date=not first_time)
|
_ = fileutil.merge_into(PATCHED_RSC_DIR, MERGED_RSC_DIR, check_date=not first_time)
|
||||||
print("Merging patched smali...")
|
print("Merging dex files...")
|
||||||
_ = fileutil.merge_into(PATCHED_SMALI_DIR, MERGED_RSC_DIR, check_date=not first_time)
|
_ = fileutil.merge_into(COMPILED_SMALI_DIR, MERGED_RSC_DIR, check_date=not first_time)
|
||||||
|
|
|
@ -17,6 +17,9 @@ def patch_smali():
|
||||||
if not PATCHED_SMALI_DIR.exists():
|
if not PATCHED_SMALI_DIR.exists():
|
||||||
print("Copying original smali...")
|
print("Copying original smali...")
|
||||||
for smali_dir in EXTRACTED_DIR.glob("smali*"):
|
for smali_dir in EXTRACTED_DIR.glob("smali*"):
|
||||||
|
if smali_dir.parts[-1] == 'smali_assets':
|
||||||
|
continue # Not you, Seamus.
|
||||||
|
|
||||||
shutil.copytree(smali_dir, PATCHED_SMALI_DIR / smali_dir.relative_to(EXTRACTED_DIR))
|
shutil.copytree(smali_dir, PATCHED_SMALI_DIR / smali_dir.relative_to(EXTRACTED_DIR))
|
||||||
first_time = True
|
first_time = True
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ EXTRACTED_DIR = BUILD_DIR / "extracted"
|
||||||
PATCHED_RSC_DIR = BUILD_DIR / "patched_resources"
|
PATCHED_RSC_DIR = BUILD_DIR / "patched_resources"
|
||||||
PATCHED_SMALI_DIR = BUILD_DIR / "patched_smali"
|
PATCHED_SMALI_DIR = BUILD_DIR / "patched_smali"
|
||||||
MERGED_RSC_DIR = BUILD_DIR / "merged_resources"
|
MERGED_RSC_DIR = BUILD_DIR / "merged_resources"
|
||||||
|
COMPILED_SMALI_DIR = BUILD_DIR / "compiled_smali"
|
||||||
|
|
||||||
SRC_DIR = Path("src")
|
SRC_DIR = Path("src")
|
||||||
SRC_RESOURCES_DIR = SRC_DIR / "resources"
|
SRC_RESOURCES_DIR = SRC_DIR / "resources"
|
||||||
|
|
Loading…
Add table
Reference in a new issue