mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-12-22 16:41:46 +03:00
[FEATURE] Update build pipeline, fix multi release jar with proguard
This commit is contained in:
parent
79f933646c
commit
62e9276481
15 changed files with 78 additions and 62 deletions
|
@ -18,7 +18,6 @@
|
|||
|
||||
public class BinaryPipeline {
|
||||
public final List<LauncherBuildTask> tasks = new ArrayList<>();
|
||||
public final AtomicLong count = new AtomicLong(0);
|
||||
public final Path buildDir;
|
||||
public final String nameFormat;
|
||||
private transient final Logger logger = LogManager.getLogger();
|
||||
|
@ -72,11 +71,20 @@ public <T extends LauncherBuildTask> Optional<T> getTaskByClass(Class<T> taskCla
|
|||
return tasks.stream().filter(taskClass::isInstance).map(taskClass::cast).findFirst();
|
||||
}
|
||||
|
||||
public Optional<LauncherBuildTask> getTaskBefore(Predicate<LauncherBuildTask> pred) {
|
||||
LauncherBuildTask last = null;
|
||||
for(var e : tasks) {
|
||||
if(pred.test(e)) {
|
||||
return Optional.ofNullable(last);
|
||||
}
|
||||
last = e;
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public void build(Path target, boolean deleteTempFiles) throws IOException {
|
||||
logger.info("Building launcher binary file");
|
||||
count.set(0); // set jar number
|
||||
Path thisPath = null;
|
||||
boolean isNeedDelete = false;
|
||||
long time_start = System.currentTimeMillis();
|
||||
long time_this = time_start;
|
||||
for (LauncherBuildTask task : tasks) {
|
||||
|
@ -86,19 +94,17 @@ public void build(Path target, boolean deleteTempFiles) throws IOException {
|
|||
long time_task_end = System.currentTimeMillis();
|
||||
long time_task = time_task_end - time_this;
|
||||
time_this = time_task_end;
|
||||
if (isNeedDelete && deleteTempFiles && oldPath != thisPath) Files.deleteIfExists(oldPath);
|
||||
isNeedDelete = task.allowDelete();
|
||||
logger.info("Task {} processed from {} millis", task.getName(), time_task);
|
||||
}
|
||||
long time_end = System.currentTimeMillis();
|
||||
if (isNeedDelete && deleteTempFiles) IOHelper.move(thisPath, target);
|
||||
if (deleteTempFiles) IOHelper.move(thisPath, target);
|
||||
else IOHelper.copy(thisPath, target);
|
||||
IOHelper.deleteDir(buildDir, false);
|
||||
logger.info("Build successful from {} millis", time_end - time_start);
|
||||
}
|
||||
|
||||
public String nextName(String taskName) {
|
||||
return nameFormat.formatted(taskName, count.getAndIncrement());
|
||||
return nameFormat.formatted(taskName);
|
||||
}
|
||||
|
||||
public Path nextPath(String taskName) {
|
||||
|
|
|
@ -7,7 +7,7 @@ public final class EXEL4JLauncherBinary extends LauncherBinary {
|
|||
|
||||
|
||||
public EXEL4JLauncherBinary(LaunchServer server) {
|
||||
super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s-%d.exe");
|
||||
super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s.exe");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
public class EXELauncherBinary extends LauncherBinary {
|
||||
|
||||
public EXELauncherBinary(LaunchServer server) {
|
||||
super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s-%d.exe");
|
||||
super(server, LauncherBinary.resolve(server, ".exe"), "Launcher-%s.exe");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,7 +23,7 @@ public final class JARLauncherBinary extends LauncherBinary {
|
|||
public final Map<String, Path> files;
|
||||
|
||||
public JARLauncherBinary(LaunchServer server) throws IOException {
|
||||
super(server, resolve(server, ".jar"), "Launcher-%s-%d.jar");
|
||||
super(server, resolve(server, ".jar"), "Launcher-%s.jar");
|
||||
count = new AtomicLong(0);
|
||||
runtimeDir = server.dir.resolve(Launcher.RUNTIME_DIR);
|
||||
buildDir = server.dir.resolve("build");
|
||||
|
|
|
@ -74,9 +74,4 @@ public Path process(Path inputFile) throws IOException {
|
|||
return out;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -68,11 +68,6 @@ private boolean filter(String name) {
|
|||
return exclusions.stream().anyMatch(name::startsWith);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<Path> getJars() {
|
||||
return jars;
|
||||
}
|
||||
|
|
|
@ -81,9 +81,4 @@ public Path process(Path inputFile) throws IOException {
|
|||
}
|
||||
return inputFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -43,9 +43,4 @@ public Path process(Path inputFile) throws IOException {
|
|||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,4 @@ public interface LauncherBuildTask {
|
|||
String getName();
|
||||
|
||||
Path process(Path inputFile) throws IOException;
|
||||
|
||||
boolean allowDelete();
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ public String getName() {
|
|||
|
||||
@Override
|
||||
public Path process(Path inputJar) throws IOException {
|
||||
Path outputJar = server.launcherBinary.nextPath("main");
|
||||
Path outputJar = server.launcherBinary.nextPath(this);
|
||||
try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(outputJar))) {
|
||||
BuildContext context = new BuildContext(output, reader.getCp(), this);
|
||||
initProps();
|
||||
|
@ -161,11 +161,6 @@ public byte[] transformClass(byte[] bytes, String classname, BuildContext contex
|
|||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface Transformer {
|
||||
byte[] transform(byte[] input, String classname, BuildContext context);
|
||||
|
|
|
@ -53,11 +53,6 @@ public Path process(Path inputFile) throws IOException {
|
|||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void tryUnpack() throws IOException {
|
||||
logger.info("Unpacking launcher native guard list and runtime");
|
||||
UnpackHelper.unpackZipNoCheck("runtime.zip", server.launcherBinary.runtimeDir);
|
||||
|
|
|
@ -104,9 +104,4 @@ private void autoSign(Path inputFile, Path signedFile) throws IOException {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,11 +59,6 @@ public Path process(Path inputFile) throws IOException {
|
|||
return output;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
|
||||
private Path setConfig() {
|
||||
Path path = server.launcherEXEBinary.nextPath(getName());
|
||||
Config config = new Config();
|
||||
|
|
|
@ -15,9 +15,7 @@
|
|||
import proguard.ConfigurationParser;
|
||||
import proguard.ProGuard;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
|
@ -26,6 +24,9 @@
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
public class ProGuardComponent extends Component implements AutoCloseable, Reconfigurable {
|
||||
private static final Logger logger = LogManager.getLogger();
|
||||
|
@ -36,6 +37,7 @@ public class ProGuardComponent extends Component implements AutoCloseable, Recon
|
|||
public transient ProguardConf proguardConf;
|
||||
private transient LaunchServer launchServer;
|
||||
private transient ProGuardBuildTask buildTask;
|
||||
private transient ProGuardMultiReleaseFixer fixerTask;
|
||||
|
||||
public static boolean checkFXJMods(Path path) {
|
||||
if (!IOHelper.exists(path.resolve("javafx.base.jmod")))
|
||||
|
@ -75,7 +77,9 @@ public void init(LaunchServer launchServer) {
|
|||
this.launchServer = launchServer;
|
||||
proguardConf = new ProguardConf(launchServer, this);
|
||||
this.buildTask = new ProGuardBuildTask(launchServer, proguardConf, this);
|
||||
this.fixerTask = new ProGuardMultiReleaseFixer(launchServer, this, "ProGuard.".concat(componentName));
|
||||
launchServer.launcherBinary.addAfter((v) -> v.getName().startsWith(modeAfter), buildTask);
|
||||
launchServer.launcherBinary.addAfter((v) -> v.getName().equals("ProGuard.".concat(componentName)), fixerTask);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -111,6 +115,59 @@ public void invoke(String... args) throws Exception {
|
|||
return null;
|
||||
}
|
||||
|
||||
public static class ProGuardMultiReleaseFixer implements LauncherBuildTask {
|
||||
private final LaunchServer server;
|
||||
private final ProGuardComponent component;
|
||||
private final String proguardTaskName;
|
||||
|
||||
public ProGuardMultiReleaseFixer(LaunchServer server, ProGuardComponent component, String proguardTaskName) {
|
||||
this.server = server;
|
||||
this.component = component;
|
||||
this.proguardTaskName = proguardTaskName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "ProGuardMultiReleaseFixer.".concat(component.componentName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Path process(Path inputFile) throws IOException {
|
||||
LauncherBuildTask task = server.launcherBinary.getTaskBefore((x) -> proguardTaskName.equals(x.getName())).get();
|
||||
Path lastPath = server.launcherBinary.nextPath(task);
|
||||
if(Files.notExists(lastPath)) {
|
||||
logger.error("{} not exist. Multi-Release JAR fix not applied!", lastPath);
|
||||
return inputFile;
|
||||
}
|
||||
Path outputPath = server.launcherBinary.nextPath(this);
|
||||
try(ZipOutputStream output = new ZipOutputStream(new FileOutputStream(outputPath.toFile()))) {
|
||||
try(ZipInputStream input = new ZipInputStream(new FileInputStream(inputFile.toFile()))) {
|
||||
ZipEntry entry = input.getNextEntry();
|
||||
while(entry != null) {
|
||||
ZipEntry newEntry = new ZipEntry(entry.getName());
|
||||
output.putNextEntry(newEntry);
|
||||
input.transferTo(output);
|
||||
entry = input.getNextEntry();
|
||||
}
|
||||
}
|
||||
try(ZipInputStream input = new ZipInputStream(new FileInputStream(lastPath.toFile()))) {
|
||||
ZipEntry entry = input.getNextEntry();
|
||||
while(entry != null) {
|
||||
if(!entry.getName().startsWith("META-INF/versions")) {
|
||||
entry = input.getNextEntry();
|
||||
continue;
|
||||
}
|
||||
ZipEntry newEntry = new ZipEntry(entry.getName());
|
||||
output.putNextEntry(newEntry);
|
||||
input.transferTo(output);
|
||||
entry = input.getNextEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
return outputPath;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ProGuardBuildTask implements LauncherBuildTask {
|
||||
private final LaunchServer server;
|
||||
private final ProGuardComponent component;
|
||||
|
@ -157,11 +214,6 @@ public Path process(Path inputFile) throws IOException {
|
|||
IOHelper.copy(inputFile, outputJar);
|
||||
return outputJar;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean allowDelete() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ProguardConf {
|
||||
|
|
|
@ -14,6 +14,6 @@
|
|||
verLog4j = '2.20.0'
|
||||
verMySQLConn = '8.1.0'
|
||||
verPostgreSQLConn = '42.6.0'
|
||||
verProguard = '7.4.0-beta02'
|
||||
verProguard = '7.4.0'
|
||||
verLaunch4j = '3.50'
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue