Binary logic changes.

This commit is contained in:
zaxar163 2019-01-08 17:36:05 +04:00
parent 669ca83bec
commit 494d83ae92
No known key found for this signature in database
GPG key ID: CEE900027AE098E0
13 changed files with 194 additions and 30 deletions

View file

@ -4,6 +4,8 @@
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicLong;
import ru.gravit.launcher.Launcher; import ru.gravit.launcher.Launcher;
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
@ -12,13 +14,16 @@
import ru.gravit.launchserver.binary.tasks.ProGuardBuildTask; import ru.gravit.launchserver.binary.tasks.ProGuardBuildTask;
import ru.gravit.launchserver.binary.tasks.StripLineNumbersTask; import ru.gravit.launchserver.binary.tasks.StripLineNumbersTask;
import ru.gravit.launchserver.binary.tasks.UnpackBuildTask; import ru.gravit.launchserver.binary.tasks.UnpackBuildTask;
import ru.gravit.utils.helper.CommonHelper;
import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.IOHelper;
import ru.gravit.utils.helper.LogHelper; import ru.gravit.utils.helper.LogHelper;
public final class JARLauncherBinary extends LauncherBinary { public final class JARLauncherBinary extends LauncherBinary {
public ArrayList<LauncherBuildTask> tasks; public ArrayList<LauncherBuildTask> tasks;
public final AtomicLong count;
public final Path runtimeDir; public final Path runtimeDir;
public final Path guardDir; public final Path guardDir;
public final Path buildDir;
public JARLauncherBinary(LaunchServer server) throws IOException { public JARLauncherBinary(LaunchServer server) throws IOException {
super(server); super(server);
@ -27,14 +32,17 @@ public JARLauncherBinary(LaunchServer server) throws IOException {
tasks.add(new MainBuildTask(server)); tasks.add(new MainBuildTask(server));
if(server.config.enabledProGuard) tasks.add(new ProGuardBuildTask(server)); if(server.config.enabledProGuard) tasks.add(new ProGuardBuildTask(server));
if(server.config.stripLineNumbers) tasks.add(new StripLineNumbersTask(server)); if(server.config.stripLineNumbers) tasks.add(new StripLineNumbersTask(server));
count = new AtomicLong(0);
syncBinaryFile = server.dir.resolve(server.config.binaryName + ".jar"); syncBinaryFile = server.dir.resolve(server.config.binaryName + ".jar");
runtimeDir = server.dir.resolve(Launcher.RUNTIME_DIR); runtimeDir = server.dir.resolve(Launcher.RUNTIME_DIR);
guardDir = server.dir.resolve(Launcher.GUARD_DIR); guardDir = server.dir.resolve(Launcher.GUARD_DIR);
buildDir = server.dir.resolve("build");
} }
@Override @Override
public void build() throws IOException { public void build() throws IOException {
LogHelper.info("Building launcher binary file"); LogHelper.info("Building launcher binary file");
count.set(0);
Path thisPath = null; Path thisPath = null;
boolean isNeedDelete = false; boolean isNeedDelete = false;
long time_start = System.currentTimeMillis(); long time_start = System.currentTimeMillis();
@ -55,4 +63,20 @@ public void build() throws IOException {
IOHelper.move(thisPath, syncBinaryFile); IOHelper.move(thisPath, syncBinaryFile);
LogHelper.info("Build successful from %d millis",time_end - time_start); LogHelper.info("Build successful from %d millis",time_end - time_start);
} }
public String nextName(String taskName) {
return String.format("%s-%s-%d.jar", server.config.projectName, taskName, count.getAndIncrement());
}
public Path nextPath(String taskName) {
return buildDir.resolve(nextName(taskName));
}
public Path nextPath(LauncherBuildTask task) {
return nextPath(task.getName());
}
public Path nextLowerPath(LauncherBuildTask task) {
return nextPath(CommonHelper.low(task.getName()));
}
} }

View file

@ -9,6 +9,7 @@
import java.nio.file.Path; import java.nio.file.Path;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
import ru.gravit.utils.helper.IOHelper; import ru.gravit.utils.helper.IOHelper;
@ -30,8 +31,6 @@ private static String generateString(SecureRandom rand, int il) {
public final Path config; public final Path config;
public final Path mappings; public final Path mappings;
public final Path words; public final Path words;
public final Path outputJar;
public final ArrayList<String> confStrs;
public transient final LaunchServer srv; public transient final LaunchServer srv;
public ProguardConf(LaunchServer srv) { public ProguardConf(LaunchServer srv) {
@ -39,13 +38,11 @@ public ProguardConf(LaunchServer srv) {
config = proguard.resolve("proguard.config"); config = proguard.resolve("proguard.config");
mappings = proguard.resolve("mappings.pro"); mappings = proguard.resolve("mappings.pro");
words = proguard.resolve("random.pro"); words = proguard.resolve("random.pro");
outputJar = srv.dir.resolve(srv.config.binaryName + "-obfPre.jar");
confStrs = new ArrayList<>();
this.srv = srv; this.srv = srv;
} }
public void buildConfig(Path inputJar) public String[] buildConfig(Path inputJar, Path outputJar)
{ {
confStrs.clear(); List<String> confStrs = new ArrayList<>();
prepare(false); prepare(false);
if (srv.config.genMappings) confStrs.add("-printmapping \'" + mappings.toFile().getName() + "\'"); if (srv.config.genMappings) confStrs.add("-printmapping \'" + mappings.toFile().getName() + "\'");
confStrs.add("-obfuscationdictionary \'" + words.toFile().getName() + "\'"); confStrs.add("-obfuscationdictionary \'" + words.toFile().getName() + "\'");
@ -53,6 +50,7 @@ public void buildConfig(Path inputJar)
confStrs.add("-outjar \'" + outputJar.toAbsolutePath() + "\'"); confStrs.add("-outjar \'" + outputJar.toAbsolutePath() + "\'");
confStrs.add("-classobfuscationdictionary \'" + words.toFile().getName() + "\'"); confStrs.add("-classobfuscationdictionary \'" + words.toFile().getName() + "\'");
confStrs.add(readConf()); confStrs.add(readConf());
return confStrs.toArray(new String[0]);
} }
private void genConfig(boolean force) throws IOException { private void genConfig(boolean force) throws IOException {

View file

@ -31,8 +31,6 @@
import ru.gravit.utils.helper.SecurityHelper; import ru.gravit.utils.helper.SecurityHelper;
public class MainBuildTask implements LauncherBuildTask { public class MainBuildTask implements LauncherBuildTask {
public final Path binaryFile;
public Path cleanJar;
private final LaunchServer server; private final LaunchServer server;
public final ClassMetadataReader reader; public final ClassMetadataReader reader;
private final class RuntimeDirVisitor extends SimpleFileVisitor<Path> { private final class RuntimeDirVisitor extends SimpleFileVisitor<Path> {
@ -105,7 +103,6 @@ private static ZipEntry newGuardEntry(String fileName) {
public MainBuildTask(LaunchServer srv) { public MainBuildTask(LaunchServer srv) {
server = srv; server = srv;
binaryFile = server.dir.resolve(server.config.binaryName + "-main.jar");
reader = new ClassMetadataReader(); reader = new ClassMetadataReader();
} }
@ -115,11 +112,11 @@ public String getName() {
} }
@Override @Override
public Path process(Path cleanJar) throws IOException { public Path process(Path inputJar) throws IOException {
this.cleanJar = cleanJar; Path outputJar = server.launcherBinary.nextPath("main");
try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(binaryFile)); try (ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(outputJar));
JAConfigurator jaConfigurator = new JAConfigurator(AutogenConfig.class.getName(), this)) { JAConfigurator jaConfigurator = new JAConfigurator(AutogenConfig.class.getName(), this)) {
jaConfigurator.pool.insertClassPath(cleanJar.toFile().getAbsolutePath()); jaConfigurator.pool.insertClassPath(inputJar.toFile().getAbsolutePath());
BuildContext context = new BuildContext(output, jaConfigurator, this); BuildContext context = new BuildContext(output, jaConfigurator, this);
server.buildHookManager.hook(context); server.buildHookManager.hook(context);
jaConfigurator.setAddress(server.config.getAddress()); jaConfigurator.setAddress(server.config.getAddress());
@ -131,8 +128,8 @@ public Path process(Path cleanJar) throws IOException {
jaConfigurator.setDownloadJava(server.config.isDownloadJava); jaConfigurator.setDownloadJava(server.config.isDownloadJava);
jaConfigurator.setEnv(server.config.env); jaConfigurator.setEnv(server.config.env);
server.buildHookManager.registerAllClientModuleClass(jaConfigurator); server.buildHookManager.registerAllClientModuleClass(jaConfigurator);
reader.getCp().add(new JarFile(cleanJar.toFile())); reader.getCp().add(new JarFile(inputJar.toFile()));
try (ZipInputStream input = new ZipInputStream(IOHelper.newInput(cleanJar))) { try (ZipInputStream input = new ZipInputStream(IOHelper.newInput(inputJar))) {
ZipEntry e = input.getNextEntry(); ZipEntry e = input.getNextEntry();
while (e != null) { while (e != null) {
String filename = e.getName(); String filename = e.getName();
@ -196,7 +193,7 @@ public Path process(Path cleanJar) throws IOException {
LogHelper.error(e); LogHelper.error(e);
} }
reader.close(); reader.close();
return binaryFile; return outputJar;
} }
@Override @Override

View file

@ -8,6 +8,7 @@
import proguard.ParseException; import proguard.ParseException;
import proguard.ProGuard; import proguard.ProGuard;
import ru.gravit.launchserver.LaunchServer; import ru.gravit.launchserver.LaunchServer;
import ru.gravit.utils.helper.LogHelper;
public class ProGuardBuildTask implements LauncherBuildTask { public class ProGuardBuildTask implements LauncherBuildTask {
private final LaunchServer server; private final LaunchServer server;
@ -23,18 +24,18 @@ public String getName() {
@Override @Override
public Path process(Path inputFile) throws IOException { public Path process(Path inputFile) throws IOException {
Configuration proguard_cfg = new Configuration(); Path outputJar = server.launcherBinary.nextLowerPath(this);
server.proguardConf.buildConfig(inputFile); Configuration proguard_cfg = new Configuration();
ConfigurationParser parser = new ConfigurationParser(server.proguardConf.confStrs.toArray(new String[0]), ConfigurationParser parser = new ConfigurationParser(server.proguardConf.buildConfig(inputFile, outputJar),
server.proguardConf.proguard.toFile(), System.getProperties()); server.proguardConf.proguard.toFile(), System.getProperties());
try { try {
parser.parse(proguard_cfg); parser.parse(proguard_cfg);
ProGuard proGuard = new ProGuard(proguard_cfg); ProGuard proGuard = new ProGuard(proguard_cfg);
proGuard.execute(); proGuard.execute();
} catch (ParseException e1) { } catch (ParseException e) {
e1.printStackTrace(); LogHelper.error(e);
} }
return server.proguardConf.outputJar; return outputJar;
} }
@Override @Override

View file

@ -25,12 +25,12 @@ public StripLineNumbersTask(LaunchServer server) {
@Override @Override
public String getName() { public String getName() {
return "Strip debug task"; return "StripDebug";
} }
@Override @Override
public Path process(Path inputFile) throws IOException { public Path process(Path inputFile) throws IOException {
Path out = server.dir.resolve(server.config.projectName + "-stripped.jar"); Path out = server.launcherBinary.nextPath("stripped");
try (ClassMetadataReader reader = new ClassMetadataReader()) { try (ClassMetadataReader reader = new ClassMetadataReader()) {
reader.getCp().add(new JarFile(inputFile.toFile())); reader.getCp().add(new JarFile(inputFile.toFile()));
try (ZipInputStream input = IOHelper.newZipInput(inputFile); try (ZipInputStream input = IOHelper.newZipInput(inputFile);

View file

@ -0,0 +1,78 @@
package ru.gravit.launchserver.binary.tasks.api;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import ru.gravit.launchserver.LaunchServer;
import ru.gravit.launchserver.binary.tasks.LauncherBuildTask;
import ru.gravit.utils.helper.IOHelper;
public class AttachJarsTask implements LauncherBuildTask {
private final LaunchServer srv;
private final List<Path> jars;
private final List<String> exclusions;
public AttachJarsTask(LaunchServer srv) {
this.srv = srv;
jars = new ArrayList<>();
exclusions = new ArrayList<>();
}
@Override
public String getName() {
return "AttachJars";
}
@Override
public Path process(Path inputFile) throws IOException {
Path outputFile = srv.launcherBinary.nextPath("attached");
try (ZipInputStream input = IOHelper.newZipInput(inputFile);
ZipOutputStream output = new ZipOutputStream(IOHelper.newOutput(outputFile))) {
ZipEntry e = input.getNextEntry();
while (e != null) {
output.putNextEntry(IOHelper.newZipEntry(e));
IOHelper.transfer(input, output);
e = input.getNextEntry();
}
attach(output);
}
return outputFile;
}
private void attach(ZipOutputStream output) throws IOException {
for (Path p : jars) {
try (ZipInputStream input = IOHelper.newZipInput(p)) {
ZipEntry e = input.getNextEntry();
while (e != null) {
String filename = e.getName();
if (exclusions.stream().noneMatch(exc -> filename.startsWith(exc))) {
output.putNextEntry(IOHelper.newZipEntry(e));
IOHelper.transfer(input, output);
}
e = input.getNextEntry();
}
}
}
}
@Override
public boolean allowDelete() {
return true;
}
public List<Path> getJars() {
return jars;
}
public List<String> getExclusions() {
return exclusions;
}
}

View file

@ -0,0 +1,62 @@
package ru.gravit.launchserver.binary.tasks.api;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import ru.gravit.launchserver.binary.tasks.LauncherBuildTask;
public final class TaskUtil {
public static void addCounted(List<LauncherBuildTask> tasks, int count, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
List<Integer> indexes = new ArrayList<>();
tasks.stream().filter(pred).forEach(e -> {
indexes.add(tasks.indexOf(e)+count);
});
indexes.forEach(e -> {
tasks.add(e, taskAdd);
});
}
public static void replaceCounted(List<LauncherBuildTask> tasks, int count, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
List<Integer> indexes = new ArrayList<>();
tasks.stream().filter(pred).forEach(e -> {
indexes.add(tasks.indexOf(e)+count);
});
indexes.forEach(e -> {
tasks.set(e, taskRep);
});
}
public static void addPre(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(tasks, -1, pred, taskAdd);
}
public static void add(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(tasks, 0, pred, taskAdd);
}
public static void addAfter(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskAdd) {
addCounted(tasks, 1, pred, taskAdd);
}
public static void replacePre(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(tasks, -1, pred, taskRep);
}
public static void replace(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(tasks, 0, pred, taskRep);
}
public static void replaceAfter(List<LauncherBuildTask> tasks, Predicate<LauncherBuildTask> pred, LauncherBuildTask taskRep) {
replaceCounted(tasks, 1, pred, taskRep);
}
public static <T extends LauncherBuildTask> List<T> getTaskByClass(List<LauncherBuildTask> tasks, Class<T> taskClass) {
return tasks.stream().filter(taskClass::isInstance).map(taskClass::cast).collect(Collectors.toList());
}
private TaskUtil() {
}
}

View file

@ -13,7 +13,7 @@
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
public class HTTPRequest { public final class HTTPRequest {
private static final int TIMEOUT = 10000; private static final int TIMEOUT = 10000;
private static final JsonParser parser = new JsonParser(); private static final JsonParser parser = new JsonParser();
@ -61,4 +61,8 @@ public static JsonElement jsonRequest(JsonElement request, URL url) throws IOExc
JsonElement content = parser.parse(reader); JsonElement content = parser.parse(reader);
return content; return content;
} }
private HTTPRequest() {
}
}
} }

View file

@ -13,7 +13,7 @@
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
public class HttpDownloader extends Observable { public final class HttpDownloader extends Observable {
public static final int BUFER_SIZE = 8192; public static final int BUFER_SIZE = 8192;
public static final int INTERVAL = 300; public static final int INTERVAL = 300;
public AtomicInteger writed = new AtomicInteger(0); public AtomicInteger writed = new AtomicInteger(0);

View file

@ -2,7 +2,7 @@
import ru.gravit.utils.helper.LogHelper; import ru.gravit.utils.helper.LogHelper;
public class NativeJVMHalt { public final class NativeJVMHalt {
public NativeJVMHalt(int haltCode) { public NativeJVMHalt(int haltCode) {
this.haltCode = haltCode; this.haltCode = haltCode;
LogHelper.error("JVM exit code %d", haltCode); LogHelper.error("JVM exit code %d", haltCode);

View file

@ -4,7 +4,7 @@
import java.util.Objects; import java.util.Objects;
public class Version { public final class Version {
@LauncherAPI @LauncherAPI
public final int major; public final int major;
@LauncherAPI @LauncherAPI

View file

@ -3,7 +3,7 @@
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
public class EnvHelper { public final class EnvHelper {
public static final String[] toTest = {"_JAVA_OPTIONS", "_JAVA_OPTS", "JAVA_OPTS", "JAVA_OPTIONS"}; public static final String[] toTest = {"_JAVA_OPTIONS", "_JAVA_OPTS", "JAVA_OPTS", "JAVA_OPTIONS"};
public static void addEnv(ProcessBuilder builder) { public static void addEnv(ProcessBuilder builder) {

View file

@ -10,7 +10,7 @@
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
public class UnpackHelper { public final class UnpackHelper {
public static boolean unpack(URL resource, Path target) throws IOException { public static boolean unpack(URL resource, Path target) throws IOException {
if (IOHelper.isFile(target)) { if (IOHelper.isFile(target)) {
if (matches(target, resource)) return false; if (matches(target, resource)) return false;