1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Обсудим Лепим пиратский лаунчер

Тема в разделе "Управление сервером Bukkit", создана пользователем Oinvizion Craft, 27 сен 2016.

  1. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Ребят, я сам конечно еще тот говнокодер, но до такого даже у меня не доходило!
    Вы бы лучше на вопрос ответили...
    Ну так как, у этой проблемы вообще есть решение?
     
  2. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Есть ограничение на размер 1го метода, так что врядли.
     
  3. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Вопрос возможно тупой, но я с этим ещё ни разу дела ни имел, скажите, проверять библиотеку надо по чексумме (это она указана? "sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4") или по размеру ("size": 7877)?
    Я пока сделал проверку по чек сумме, вроде норм робит
    Очередной маленький вопросик:
    Вес джарника лаунчера 3,5 МБ, но после обфускации Stringer-ом аж 4,77. Это конечно не критично, но хотелось бы как-то оптимизировать размер, если ли способы сделать это?
     
  4. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А зачем обфусцируешь?
    Да и что то не понятно что там у тебя 3.5 мб весит.
     
  5. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Обфусцировать - чтоб не разобрали, нубу понятно.
    А 3.5 МБ лаунчер весит, не поверишь, абсолютно нормальный лаунчер!
    [​IMG]
     
  6. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    :lol:
    А кому то оно нужно? Подумай над этим.
     
  7. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Прошу озвучить недостатки... Хотя, о чем нормальном с тобой можно говорить...
    А это уже не твоё дело. Я просил помочь с оптимизацией размера, а не выяснять применение моего лаучера
     
  8. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Есть несколько способов уменьшить размер: Оптимизировать импорты библиотек (убрать библиотеки, от которых два импорта используешь), уменьшить вес изображений. А так же: использовать подгрузку дополнительных библиотек при первом запуске, и только в конце - обфускация.
    Обфусцировать ради уменьшения размера было выгодно для j2me приложений, где на телефонах место весьма ограничено. Во всех других случаях лучше все таки не обфусцировать, если ты не преследуешь скрытие исходного кода.
    Я не могу назвать недостатки, т.к. не видел исходников, да и не особо шарю в шарпе.
    О "нормальном" со мной можно говорить. Но только в том случае, если ты сможешь сформулировать грамотно свою мысль и изложить её в тексте.
     
  9. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Преследую. Насчет убратия библиотек - идея очень даже хорошая, спасибо!

    Я на жаве пишу, на шарпе учился только, да и на шарпе он бы весил раз в 5 больше, и с javafx нереально крутое оформление выходит. (часть на скрине видно).

    Ну а что непонятного в моей фразе: "хотелось бы как-то оптимизировать размер, есть ли способы сделать это?"
     
  10. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Ну стоило бы это в начале писать, например.
    Да можно и на свинге (апхзапхзапхзпхзап) крутое оформление сделать, если ты представляешь как это будет выглядеть в итоге. Но тут уже на вкус и цвет.
    А скрытие сурсов бесплатного и свободного (в распространении) приложения - такое себе дело. Особенно если ты используешь библиотеки, у которых лицензии обязывают открытие исходников. Но в твоём случае таких библиотек быть не должно - лицензия gson, как и apache commons, на счёт сокрытия исходников претензий не имеют.
     
  11. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    У меня стоят либы gson, apache commons и xz, ты прав, там ничего не требуется.
    А я где писал? Это мой последний вопрос был, после того, как лучше делать проверку либов. Ну ладно, друг друга поняли, значит - всё нашлось!
    Кстати, насчёт xz, эта либа и используется по-сути 1 раз, при распаковке .jar.pack.xz, есть ли способ как её выкинуть?
     
  12. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А при каких условиях эта распаковка используется?
     
  13. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Stringer ничего не обфусцирует, только строки и снимается легко. После его снятия готовые сурсы получаем. Так что можно не юзать.
     
  14. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Эмм.. И чем тогда можно надежно обфусцировать? После стрингера даже картинки нельзя просмотреть, ну ок, я в с ним особо не работал. Какой можно нормальный юзать обфускатор?
    Я конечно спорить насчёт того, обфусцирует Stringer или нет не буду, но тогда интересно, почему его лицензия стоит так дорого?
    Эту мини утилиту мне alexandrage написал, т.к. тогда я в джаве ни бум-бум
    Код:
    package utils;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.Arrays;
    import java.util.jar.JarEntry;
    import java.util.jar.JarOutputStream;
    import java.util.jar.Pack200;
    
    import org.tukaani.xz.XZInputStream;
    
    
    public class unpack200
    {
      public static void unpackLibrary(File input, File output)
        throws IOException
      {
        if (!input.exists())
        {
          output.delete();
          System.out.println("Unpacking failed, file not found");
          return;
        }
        if (output.exists()) {
          output.delete();
        }
        Path path = input.toPath();
        byte[] data = Files.readAllBytes(path);
        byte[] decompressed = readFully(new XZInputStream(new ByteArrayInputStream(data))); //XZInputStream и есть единственное использование этой либы
        String end = new String(decompressed, decompressed.length - 4, 4);
        if (!end.equals("SIGN"))
        {
          System.out.println("Unpacking failed, signature missing " + end);
          return;
        }
        int x = decompressed.length;
        int len = decompressed[(x - 8)] & 0xFF | (decompressed[(x - 7)] & 0xFF) << 8 | (decompressed[(x - 6)] & 0xFF) << 16 | (decompressed[(x - 5)] & 0xFF) << 24;
        byte[] checksums = Arrays.copyOfRange(decompressed, decompressed.length - len - 8, decompressed.length - 8);
        FileOutputStream jarBytes = new FileOutputStream(output);
        JarOutputStream jos = new JarOutputStream(jarBytes);
        Pack200.newUnpacker().unpack(new ByteArrayInputStream(decompressed), jos);
        jos.putNextEntry(new JarEntry("checksums.sha1"));
        jos.write(checksums);
        jos.closeEntry();
        jos.close();
        jarBytes.close();
      }
     
      public static byte[] readFully(InputStream stream)
        throws IOException
      {
        byte[] data = new byte[63];
        ByteArrayOutputStream entryBuffer = new ByteArrayOutputStream();
        int len;
        do
        {
          len = stream.read(data);
          if (len > 0) {
            entryBuffer.write(data, 0, len);
          }
        } while (len != -1);
        return entryBuffer.toByteArray();
      }
    }
    
     
  15. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    .pack вообще не нужен так то. В pack только лаунчер ванильный. Всё.
    Если надо jar распаковывать, то вот:
    Код:
    /**
     * Распаковывает zip (и jar) архивы. Нам же надо распаковывать нативки?
     * http://stackoverflow.com/questions/9324933/what-is-a-good-java-library-to-zip-unzip-files
     *
     * @param archive архив
     * @param destination куда распаковывать
     */
    public static void unzipArchive(File archive, File destination) {
       try (ZipFile zipFile = new ZipFile(archive)) {
         Enumeration<? extends ZipEntry> entries = zipFile.entries();
         while (entries.hasMoreElements()) {
           ZipEntry entry = entries.nextElement();
           File entryDestination = new File(destination, entry.getName());
           if (entryDestination.exists()) {
             continue;
           }
           if (entry.getName().equals("META-INF") || entry.getName().equals("MANIFEST.MF")) {
             continue;
           }
           if (entry.isDirectory()) {
             entryDestination.mkdirs();
           } else {
             entryDestination.getParentFile().mkdirs();
             InputStream in = zipFile.getInputStream(entry);
             try (FileOutputStream out = new FileOutputStream(entryDestination)) {
               IOUtils.copy(in, out);
               IOUtils.closeQuietly(in);
             } catch (Exception ex) {
               MainApp.getLogger().log(Level.WARNING, "Failed to exctract " +
                   entryDestination.getName(), ex
               );
             }
           }
         }
       } catch (IOException ex) {
         MainApp.getLogger().log(Level.WARNING, "Failed to unpack archive " + archive.getName(), ex);
       }
    }
    
     
  16. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Стоп! А на какой тогда в JSON-е нужен "packed": "forge"?
    Ну например обычного джарника у этой либы нет
    {"name":"com.typesafe.akka:akka-actor_2.11:2.3.3","url":"http://files.minecraftforge.net/maven/","packed":"forge"}
    http://files.minecraftforge.net/mav...ka-actor_2.11/2.3.3/akka-actor_2.11-2.3.3.jar
    Я теперь более чем уверен, что шейдеры на ForgeOptiFine 1.7.10 не катят именно из-за того, что .jar.pack.xz неправильно распаковываются
     
  17. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А про фордж я и забыл.
    Так что придётся тебе с этой либой жить.
     
  18. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Ок, ладно, переживём 100 КБ, только вот как сделать реально адекватную распаковку?
    Мне кажется, tlauncher использует какую-то либу от forge для распаковки
     
    Последнее редактирование: 31 май 2017
  19. niki96

    niki96 Старожил Пользователь

    Баллы:
    123
    Хмхмхм, даже не знаю как ответить. Я тебе сказал что удобнее собрать все библиотеки в один файл и не парить себе мозг. А ты говоришь что это идея ***ня, может в каком то смысле это и неправильно, но гораздо удобнее, чем такой мусор в строке запуска.
    Участие в разработке принимают все, но не топик стартер.
     
    Последнее редактирование: 31 май 2017
  20. Автор темы
    Oinvizion Craft

    Oinvizion Craft Активный участник Пользователь

    Баллы:
    76
    Интересно, тут хоть кто-нибудь может толково ответить как ПРАВИЛЬНО распаковывать .jar.pack.xz ? Или как это тлаунчер делает
     

Поделиться этой страницей