diff --git a/android-compiler/build.gradle b/android-compiler/build.gradle index ff228872c..75e14dec5 100644 --- a/android-compiler/build.gradle +++ b/android-compiler/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java-library' + id 'org.jetbrains.kotlin.jvm' id 'com.android.lint' } @@ -8,6 +9,12 @@ java { targetCompatibility = JavaVersion.VERSION_11 } +compileKotlin { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11 + } +} + dependencies { // r8 dependency implementation 'com.android.tools:r8:3.3.28' diff --git a/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.java b/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.java deleted file mode 100644 index c6cdc93a7..000000000 --- a/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pranav.android.code.disassembler; - -import org.eclipse.jdt.internal.core.util.Disassembler; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.InvalidPathException; -import java.nio.file.Paths; - -public class EclipseDisassembler { - - final byte[] classFileBytes; - - public EclipseDisassembler(String classFile) throws IOException, InvalidPathException { - - classFileBytes = Files.readAllBytes(Paths.get(classFile)); - } - - public String disassemble() throws Throwable { - return new Disassembler().disassemble(classFileBytes, System.lineSeparator()); - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.kt b/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.kt new file mode 100644 index 000000000..0d6fd70af --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/code/disassembler/EclipseDisassembler.kt @@ -0,0 +1,21 @@ +package com.pranav.android.code.disassembler + +import org.eclipse.jdt.internal.core.util.Disassembler + +import java.io.IOException +import java.nio.file.Files +import java.nio.file.Paths + +class EclipseDisassembler(filePath: String) { + + private lateinit var classFileBytes: ByteArray + + init { + classFileBytes = Files.readAllBytes(Paths.get(filePath)) + } + + @Throws(Throwable::class) + fun disassemble() : String { + return Disassembler().disassemble(classFileBytes, System.lineSeparator()) + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.java b/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.java deleted file mode 100644 index 9512382dd..000000000 --- a/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pranav.android.code.disassembler; - -import com.sun.tools.javap.JavapTask; - -import java.io.StringWriter; -import java.util.ArrayList; - -public class JavapDisassembler { - - final String path; - - public JavapDisassembler(String classFile) { - path = classFile; - } - - public String disassemble() throws Throwable { - // Create an arraylist for storing javap arguments - var args = new ArrayList(); - args.add("-c"); - args.add(path); - // Create a StringWriter object that will store the output - var writer = new StringWriter(); - // Create a JavapTask to handle the arguments - var task = new JavapTask(); - task.handleOptions(args.toArray(new String[0])); - task.setLog(writer); - task.run(); - // return the disassembled file as string - return writer.toString(); - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.kt b/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.kt new file mode 100644 index 000000000..a02f05e30 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/code/disassembler/JavapDisassembler.kt @@ -0,0 +1,33 @@ +package com.pranav.android.code.disassembler + +import com.sun.tools.javap.JavapTask + +import java.io.StringWriter +import java.util.ArrayList + +class JavapDisassembler(filePath: String) { + + private val path: String + + init { + path = filePath + } + + @Throws(Throwable::class) + fun disassemble() : String { + // Create an arraylist for storing javap arguments + val args = listOf( + "-c", + path + ) + // Create a StringWriter object that will store the output + val writer = StringWriter() + // Create a JavapTask to handle the arguments + val task = JavapTask() + task.handleOptions(args.toTypedArray()) + task.setLog(writer) + task.run() + // return the disassembled file as string + return writer.toString() + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.java b/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.java deleted file mode 100644 index 364fd862a..000000000 --- a/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pranav.android.code.formatter; - -import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter; -import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions; -import org.eclipse.jface.text.Document; - -public class EclipseJavaFormatter { - - private String source; - - public EclipseJavaFormatter(String source) { - this.source = source; - } - - public String format() { - var options = DefaultCodeFormatterOptions.getEclipseDefaultSettings(); - - var codeFormatter = new DefaultCodeFormatter(options); - - var edit = - codeFormatter.format( - DefaultCodeFormatter.K_COMPILATION_UNIT, - source, - 0, // starting index - source.length(), // length - 0, // initial indentation - System.lineSeparator() // line separator - ); - - var document = new Document(source); - try { - edit.apply(document); - } catch (Exception e) { - throw new IllegalStateException(e); - } - // return the formatted code - return document.get(); - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.kt b/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.kt new file mode 100644 index 000000000..b05239b12 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/code/formatter/EclipseJavaFormatter.kt @@ -0,0 +1,39 @@ +package com.pranav.android.code.formatter + +import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter +import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions +import org.eclipse.jface.text.Document + +class EclipseJavaFormatter(code: String) { + + private val source: String + + init { + source = code; + } + + fun format(): String { + val options = DefaultCodeFormatterOptions.getEclipseDefaultSettings() + + val codeFormatter = DefaultCodeFormatter(options) + + val edit = + codeFormatter.format( + DefaultCodeFormatter.K_COMPILATION_UNIT, + source, + 0, // starting index + source.length, // length + 0, // initial indentation + System.lineSeparator() // line separator + ) + + val document = Document(source) + try { + edit.apply(document) + } catch (e: Exception) { + throw IllegalStateException(e) + } + // return the formatted code + return document.get() + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.java b/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.java deleted file mode 100644 index 4e1498ad0..000000000 --- a/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pranav.android.code.formatter; - -import com.google.googlejavaformat.java.Formatter; -import com.google.googlejavaformat.java.FormatterException; -import com.google.googlejavaformat.java.JavaFormatterOptions; - -public class GoogleJavaFormatter { - - private String source; - - public GoogleJavaFormatter(String source) { - this.source = source; - } - - public String format() { - var options = - JavaFormatterOptions.builder() - .style(JavaFormatterOptions.Style.AOSP) // Use AOSP formatting style - .formatJavadoc(true) // Format Javadoc with code - .build(); - var formatter = new Formatter(options); - try { - return formatter.formatSourceAndFixImports(source); - } catch (FormatterException e) { - throw new IllegalStateException(e); - } - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.kt b/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.kt new file mode 100644 index 000000000..92e301e95 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/code/formatter/GoogleJavaFormatter.kt @@ -0,0 +1,29 @@ +package com.pranav.android.code.formatter + +import com.google.googlejavaformat.java.Formatter +import com.google.googlejavaformat.java.FormatterException +import com.google.googlejavaformat.java.JavaFormatterOptions + +class GoogleJavaFormatter(input: String) { + + private val source: String + + init { + source = input + } + + fun format(): String { + val options = + JavaFormatterOptions.builder() + .style(JavaFormatterOptions.Style.AOSP) // Use AOSP formatting style + .formatJavadoc(true) // Format Javadoc with code + .build() + val formatter = Formatter(options) + try { + return formatter.formatSourceAndFixImports(source) + } catch (e: Exception) { + e.printStackTrace() + } + return source + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.java b/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.java deleted file mode 100644 index 4ae2317eb..000000000 --- a/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.pranav.android.exception; - -public class CompilationFailedException extends Exception { - - public CompilationFailedException(Throwable e) { - super(e); - } - - public CompilationFailedException(String message) { - super(message); - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.kt b/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.kt new file mode 100644 index 000000000..30a3b9335 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/exception/CompilationFailedException.kt @@ -0,0 +1,6 @@ +package com.pranav.android.exception + +class CompilationFailedException : Exception { + constructor(message: String?) : super(message) + constructor(e: Throwable?): super(e) +} diff --git a/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.java b/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.java deleted file mode 100644 index e61d1b3f3..000000000 --- a/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pranav.android.interfaces; - -import android.content.Context; - -public abstract class Builder { - - public abstract Context getContext(); - - public abstract ClassLoader getClassloader(); -} diff --git a/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.kt b/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.kt new file mode 100644 index 000000000..739354021 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/interfaces/Builder.kt @@ -0,0 +1,10 @@ +package com.pranav.android.interfaces + +import android.content.Context + +interface Builder { + + fun getContext() : Context + + fun getClassloader() : ClassLoader +} diff --git a/android-compiler/src/main/java/com/pranav/android/interfaces/Task.java b/android-compiler/src/main/java/com/pranav/android/interfaces/Task.java deleted file mode 100644 index d3312df41..000000000 --- a/android-compiler/src/main/java/com/pranav/android/interfaces/Task.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pranav.android.interfaces; - -public abstract class Task { - - public abstract String getTaskName(); - - public abstract void doFullTask() throws Exception; -} diff --git a/android-compiler/src/main/java/com/pranav/android/interfaces/Task.kt b/android-compiler/src/main/java/com/pranav/android/interfaces/Task.kt new file mode 100644 index 000000000..29c9c9c90 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/interfaces/Task.kt @@ -0,0 +1,9 @@ +package com.pranav.android.interfaces; + +interface Task { + + fun getTaskName() : String + + @Throws(Exception::class) + fun doFullTask() +} diff --git a/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.java b/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.java deleted file mode 100644 index 27da34ad4..000000000 --- a/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pranav.android.task; - -import android.content.Context; - -import com.pranav.android.interfaces.*; -import com.pranav.android.task.java.*; - -public class JavaBuilder extends Builder { - - public final ClassLoader classloader; - - public Context mContext; - - public JavaBuilder(Context context, ClassLoader loader) { - mContext = context; - classloader = loader; - } - - @Override - public Context getContext() { - return mContext; - } - - @Override - public ClassLoader getClassloader() { - return this.classloader; - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.kt b/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.kt new file mode 100644 index 000000000..fc66222c7 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/task/JavaBuilder.kt @@ -0,0 +1,26 @@ +package com.pranav.android.task + +import android.content.Context + +import com.pranav.android.interfaces.* +import com.pranav.android.task.java.* + +class JavaBuilder(context: Context, loader: ClassLoader) : Builder { + + private var classloader: ClassLoader + + private var mContext: Context + + init { + mContext = context + classloader = loader + } + + override fun getContext() : Context { + return mContext + } + + override fun getClassloader() : ClassLoader { + return classloader + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.java b/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.java deleted file mode 100644 index f20965297..000000000 --- a/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.pranav.android.task.java; - -import com.android.tools.r8.D8; -import com.android.tools.r8.D8Command; -import com.android.tools.r8.OutputMode; - -import com.pranav.android.interfaces.*; -import com.pranav.common.util.FileUtil; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; - -public class D8Task extends Task { - - private Exception ex = null; - - @Override - public void doFullTask() throws Exception { - D8.run( - D8Command.builder() - .setOutput(Paths.get(FileUtil.getBinDir()), OutputMode.DexIndexed) - .addLibraryFiles(Paths.get(FileUtil.getClasspathDir(), "android.jar")) - .addProgramFiles( - getClassFiles(new File(FileUtil.getBinDir(), "classes"))) - .build()); - } - - private ArrayList getClassFiles(File root) { - var paths = new ArrayList(); - - var files = root.listFiles(); - if (files != null) { - for (var f : files) { - if (f.isFile()) { - paths.add(f.toPath()); - } else { - paths.addAll(getClassFiles(f)); - } - } - } - return paths; - } - - @Override - public String getTaskName() { - return "D8 Task"; - } -} diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.kt b/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.kt new file mode 100644 index 000000000..00e979d25 --- /dev/null +++ b/android-compiler/src/main/java/com/pranav/android/task/java/D8Task.kt @@ -0,0 +1,47 @@ +package com.pranav.android.task.java + +import com.android.tools.r8.D8 +import com.android.tools.r8.D8Command +import com.android.tools.r8.OutputMode + +import com.pranav.android.interfaces.* +import com.pranav.common.util.FileUtil + +import java.io.File +import java.nio.file.Path +import java.nio.file.Paths +import java.util.ArrayList + +class D8Task : Task { + + @Throws(Exception::class) + override fun doFullTask() { + D8.run( + D8Command.builder() + .setOutput(Paths.get(FileUtil.getBinDir()), OutputMode.DexIndexed) + .addLibraryFiles(Paths.get(FileUtil.getClasspathDir(), "android.jar")) + .addProgramFiles( + getClassFiles(File(FileUtil.getBinDir(), "classes"))) + .build()) + } + + private fun getClassFiles(root: File) : ArrayList { + val paths = arrayListOf() + + val files = root.listFiles() + if (files != null) { + for (f in files) { + if (f.isFile()) { + paths.add(f.toPath()) + } else { + paths.addAll(getClassFiles(f)) + } + } + } + return paths + } + + override fun getTaskName() : String { + return "D8 Task" + } +} diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/ECJCompilationTask.java b/android-compiler/src/main/java/com/pranav/android/task/java/ECJCompilationTask.java index 23b29b211..a2a224cb3 100644 --- a/android-compiler/src/main/java/com/pranav/android/task/java/ECJCompilationTask.java +++ b/android-compiler/src/main/java/com/pranav/android/task/java/ECJCompilationTask.java @@ -15,7 +15,7 @@ import java.io.PrintWriter; import java.util.ArrayList; -public class ECJCompilationTask extends Task { +public class ECJCompilationTask implements Task { private final StringBuilder errs = new StringBuilder(); private final SharedPreferences prefs; diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/ExecuteJavaTask.java b/android-compiler/src/main/java/com/pranav/android/task/java/ExecuteJavaTask.java index dad4e8664..121e8158a 100644 --- a/android-compiler/src/main/java/com/pranav/android/task/java/ExecuteJavaTask.java +++ b/android-compiler/src/main/java/com/pranav/android/task/java/ExecuteJavaTask.java @@ -12,7 +12,7 @@ import java.io.PrintStream; import java.lang.reflect.Modifier; -public class ExecuteJavaTask extends Task { +public class ExecuteJavaTask implements Task { private final Builder mBuilder; private final String clazz; diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/JarTask.java b/android-compiler/src/main/java/com/pranav/android/task/java/JarTask.java index bd267c69c..a74f80c24 100644 --- a/android-compiler/src/main/java/com/pranav/android/task/java/JarTask.java +++ b/android-compiler/src/main/java/com/pranav/android/task/java/JarTask.java @@ -13,7 +13,7 @@ import java.util.jar.JarOutputStream; import java.util.jar.Manifest; -public class JarTask extends Task { +public class JarTask implements Task { @Override public void doFullTask() throws Exception { diff --git a/android-compiler/src/main/java/com/pranav/android/task/java/JavacCompilationTask.java b/android-compiler/src/main/java/com/pranav/android/task/java/JavacCompilationTask.java index c0b77712e..342e336ce 100644 --- a/android-compiler/src/main/java/com/pranav/android/task/java/JavacCompilationTask.java +++ b/android-compiler/src/main/java/com/pranav/android/task/java/JavacCompilationTask.java @@ -22,7 +22,7 @@ import javax.tools.SimpleJavaFileObject; import javax.tools.StandardLocation; -public class JavacCompilationTask extends Task { +public class JavacCompilationTask implements Task { private final SharedPreferences prefs;