diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..99211dd --- /dev/null +++ b/TODO.txt @@ -0,0 +1,5 @@ +1. Add android.jar from android sdk 35 to classpath +2. Identify tumblr apk version +3. Fix enhanced block n shit +4. ??? +5. Profit \ No newline at end of file diff --git a/build.py b/build.py index b0e87e6..ba0868f 100644 --- a/build.py +++ b/build.py @@ -99,8 +99,52 @@ class Task: print(f"Compiling {file}...") subprocess.run(['java', '-jar', 'tools/smali-2.5.2.jar', 'a', f'build/smali/{file}', '-o', f'build/dex/{dex}']) + def genClassPath(): + print("Generating java classpath from dex files...") + for file in os.listdir('build/dex'): + src = f'build/dex/{file}' + dst = f'build/jar/{file[:-4]}.jar' + srctime = os.path.getmtime(src) + dsttime = 0 if not Path(dst).exists() else os.path.getmtime(dst) + + if srctime < dsttime: + print(f"Skipping {file}...") + continue + + print(f"Dex2jar {file}...") + subprocess.run(['java', '-cp', 'tools/d2j/*', 'com.googlecode.dex2jar.tools.Dex2jarCmd', '-f', src, '-o', dst]) + + def compileJava(): + Task.genClassPath() + + sep = ';' if os.name == 'nt' else ':' + javaFiles = [str(x) for x in Path('src/java').rglob('*.java')] + classPath = sep.join([str(x) for x in Path('build/jar').rglob('*.jar')]) + + # Get latest java file timestamp + files = list(Path('src/java').rglob('*.java')) + files = [os.path.getmtime(x) for x in files] + latest = max(files) + + # Get latest dex time or 0 + latest2 = 0 if not Path('build/java_dex/classes.dex').exists() else os.path.getmtime('build/java_dex/classes.dex') + + # If dex file is newer than source, no need to do anything + if latest2 > latest: + print("Skipping java...") + return + + print("Compiling java...") + subprocess.run(['javac', '-cp', classPath, '-d', 'build/java_class', *javaFiles]) + + classFiles = [str(x) for x in Path('build/java_class').rglob('*.class')] + + Path('build/java_dex').mkdir(parents=True, exist_ok=True) + subprocess.run(['java', '-cp', 'tools/d8.jar', 'com.android.tools.r8.D8', *classFiles, '--output', 'build/java_dex']) + def mergeResources(): Task.compileSmali() + Task.compileJava() # Copy original resources # on first run only @@ -113,6 +157,7 @@ class Task: print("Copying compiled dex files...") shutil.copytree('build/dex', 'build/merged', dirs_exist_ok=True) + shutil.copy('build/java_dex/classes.dex', 'build/merged/classes7.dex') # TODO: Unhardcode this def buildApk(): Task.mergeResources() @@ -182,6 +227,8 @@ def main(): if ('a' in ''.join(sys.argv[2:])): Task.deployToAndroidStudio() + case 'genclasspath': + Task.genClassPath() if __name__ == '__main__': main() \ No newline at end of file diff --git a/src/java/dev/maelstrom/ykit/java/Test.java b/src/java/dev/maelstrom/ykit/java/Test.java new file mode 100644 index 0000000..bcd0352 --- /dev/null +++ b/src/java/dev/maelstrom/ykit/java/Test.java @@ -0,0 +1,10 @@ +package dev.maelstrom.ykit.java; + +import dev.maelstrom.ykit.settings.YkitCurrentSettings; + +public class Test { + public static void test() { + System.out.println("Hello, world!"); + System.out.println(YkitCurrentSettings.class.getName()); + } +} \ No newline at end of file diff --git a/src/smali/smali_classes6/dev/maelstrom/ykit/settings/YkitSettingsActivity.smali b/src/smali/smali_classes6/dev/maelstrom/ykit/settings/YkitSettingsActivity.smali index 5e644a3..73b2174 100644 --- a/src/smali/smali_classes6/dev/maelstrom/ykit/settings/YkitSettingsActivity.smali +++ b/src/smali/smali_classes6/dev/maelstrom/ykit/settings/YkitSettingsActivity.smali @@ -7,6 +7,8 @@ .method static constructor ()V .locals 0 + invoke-static {}, Ldev/maelstrom/ykit/java/Test;->test()V + return-void .end method