1. bash / Говнокод #27467

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    @echo off
    wget https://dl.google.com/android/repository/build-tools_r25.0.3-windows.zip
    unzip -j build-tools_r25.0.3-windows.zip android*/lib/dx.jar 
    rem  --- Получаем уробороса ---
    dx --dex --output=dx-dexed.jar --min-sdk-version=24 dx.jar
    rem  +++  Уроборос получен  +++
    echo class nemyx                                                                                >nemyx.java
    echo {                                                                                         >>nemyx.java
    echo   public static void main(String[] args) throws java.lang.Exception                       >>nemyx.java
    echo   {                                                                                       >>nemyx.java
    echo     java.io.PrintStream nemyxStream = new java.io.PrintStream(System.out, true, "UTF-8"); >>nemyx.java
    echo     nemyxStream.printf("%%.2fдар идёт напитон.\n", Math.PI);                              >>nemyx.java
    echo   }                                                                                       >>nemyx.java
    echo }                                                                                         >>nemyx.java
    javac -encoding utf-8 -source 1.7 -target 1.7 nemyx.java 
    jar cf nemyx.jar nemyx.class
    adb push dx-dexed.jar /sdcard/Download/
    adb push nemyx.jar /sdcard/Download/
    adb shell "cd /sdcard/Download; dalvikvm -cp dx-dexed.jar com.android.dx.command.Main --dex --output nemyx-dexed.jar nemyx.jar"
    adb shell dalvikvm -cp /sdcard/Download/nemyx-dexed.jar nemyx

    Сон разума рождает чудовища.

    Запостил: npopa6, 13 Июня 2021

    Комментарии (98) RSS

    • Ку!
      Ответить
    • Расскажу, что происходит в коде.

      dx — это не DJIuHHblu_xyu, как вы могли бы подумать, а конь Вертер байткода из JVM в Dalvik. В пятой строке он конвертирует сам себя, чтобы его можно было запустить прямо из «Андроида».

      И тут возникает первый багор: новые версии dx не работают в «Андроиде», потому что с стандартной библиотеке Dalvik/ART (/system/framework) отсутствуют некоторые методы, которые есть в JRE, а старые версии dx не могут конвертировать новые программы. В итоге мне пришлось 28-й версией dx конвертировать 25-ю. Возможно, есть ещё какие-то рабочие комбинации, нужно изучать. d8, который пришёл на смену dx в новых build tools, оказался более требовательным к фреймворку.

      В 15-й строке конпелируем хеллоуворлд. И тут второй багор: стандарт байткода пришлось понизить до JRE 1.7, иначе старая версия dx его не возьмёт.

      Ещё один багор — кодировки в «Жабе». В «PHP» нет никакого «java.io.PrintStream», именно поэтому я за «PHP».

      В 19-й строке мы прямо в «Андроиде» конвертируем приложение для JRE в приложение для Dalvik/ART (правда, не apk, а соснольное), а в 20-й запускаем посредством стандартной соснольной программы dalvikvm (в ART она генерирует нативный код на лету).

      Что ещё есть? Конвертируются программы apksigner, smali, backsmali, есть нативный zip и unzip, вроде даже aapt есть, так что можно прямо в «Андроиде» разбирать и собирать программы.

      «Jython» и «JRuby» не захотели конвертироваться: они используют динамическую подгрузку классов и ожидают классы в формате JVM, а Dalvik/ART их не поддерживают.
      Ответить
      • Ураааа! Инканус вернулся!
        Ответить
        • Почему ты думаешь, что это Инканус?
          Ответить
          • По стилю
            По «Жабе»
            По «PHP»
            Только ты можешь знать такую инфу

            Где пропадал?
            Ответить
            • У Манохина на объекте трубы прорвало.
              Ответить
              • В Златохуйске?
                Ответить
                • недавно узнал зобавный факт, всегда думал, что станция полежаевская названа в честь какого-то комми, который кучу неверных замочил, а потом проскользнул между ежовым и берией и отсиделся до 1954
                  а оказалось, что это просто прораб
                  Ответить
                  • Кому-то смешно, а в Новосибирске на полном серьёзе собираются переименовать улицу Королёва в улицу Королёва:
                    https://pbs.twimg.com/media/E3STPpQWEAMECn2.jpg
                    Ответить
                    • > переименовать улицу Королёва в улицу Королёва

                      Интересно, во сколько такой рефакторинг обойдётся?
                      Ответить
                      • Придётся перекомпилировать все города, где есть такие улицы.
                        Ответить
                        • - Ой, то не вечер да не ве-е-ечер, - запели строгие мужские голоса, - мне да малым мало спало-ось...
                          - Люблю эту песню, - сказал я.
                          - Как же ты ее барин, любить можешь, если не слышал никогда? - спросил Игнат, присаживаясь рядом.
                          - Почему же не слышал? Это ведь старая казачья песня.
                          - Не, - сказал Игнат. - Путаешь. Эту песню господин барон специально для нас сочинили, чтоб мы пели и думали. А чтобы нам легче запомнить было, в ней и слова такие же, как в той песне, про которую ты говоришь, и музыка.
                          - В чем же тогда заключается его участие? - спросил я. - Я имею в виду, как тогда можно отличить ту песню, которая была раньше, от той, которую господин барон сочинил, если там и слова такие же, и музыка?
                          - А у той песни, которую господин барон сочинили, смысл совсем другой. Вот послушай, объясню. Слышь, поют: "мне малым мало спалось да во сне привиделось". Это знаешь что значит? Что хоть и не спалось, а все равно привиделось как бы во сне, понимаешь? То есть разницы нету - что спи, что не спи, все одно сон.

                          Виктор Пелевин. Чапаев и пустота.
                          Ответить
                        • Именно поэтому я за «PHP».
                          Ответить
              • Габриадзе умер совсем недавно, кстати
                Ответить
              • А кто это?
                Ответить
            • А где тут уникальная инфа? Приведи реальные примеры.
              Ответить
      • > отсутствуют некоторые методы, которые есть в JRE, а старые версии dx не могут конвертировать новые программы

        > В итоге мне пришлось 28-й версией dx конвертировать 25-ю. Возможно, есть ещё какие-то рабочие комбинации, нужно изучать.

        Still better than «Rust»
        Ответить
        • В итоге нашлись и другие рабочие комбинации, когда я в параметрах командной строки указал другие требования к байткоду.

          В общем, если программы нужно запускать на Андроиде 7+, то проблем нет. А если на более древних, то придётся выяснять, какой какую версию байткода поддерживает.
          Ответить
        • А напомните, что там с Растишкой. А то я его как-то давно из интереса пробовал собрать, но почему-то плюнул. Уже не помню, почему.
          Ответить
          • Нужно собрать каждую версию по порядку от сотворения мира.

            Ну или сдаться и скачать предпоследний бинарь.
            Ответить
    • В «dalvik» успешно переводится «ecj» (Eclipse Compiler for Java). Он лёгкий и полностью написан на «Java», не требует никаких нативных модулей. Java-файлы можно компилировать прямо в «Андроиде», только «ecj» нужно подложить в bootclasspath какую-нибудь библиотеку в формате «JVM», например, «android.jar» из «android-sdk».

      Итого:
      1. У нас есть «ecj», который получает *.class из *.java.
      2. У нас есть «dx», который получает classes.dex из *.class.
      3. У нас есть нативный статически собранный «zip» для любого процессора.
      4. Для сборки полноценного apk-файла есть «apksigner» и нативные статически собранные «zipalign» и «aapt».

      Весь процесс сборки apk или соснольного jar из исходников можно производить на «Андроиде».
      Ответить
      • Это круто, да?
        Ответить
      • Какой пердолинг.

        А раскрутить до jre 1.8 не удалось?
        Ответить
        • В смысле? Запускать jre 1.8 в «Андроиде» или подкладывать библиотеку от jre 1.8 компилятору?
          Ответить
          • Писать на джаве версии 18 хотя бы?
            Ответить
            • Как я понимаю это ортогональные вещи.

              Можно с -source 1.8 собирать лямбды и методы в интерфейсах, для этого не обязательно иметь новую jre.
              Ответить
              • Типа писать на 11-й джаве, а собираться под четвертую?

                Ну наверное так можно, по сути ведь лямбды не требуют новых опкодов (или нет?)

                Какие=то опкоды типа Invokedynamic которых не было в древности небось джаве-то и не нужны
                Ответить
                • Нет.

                  Писать на 8ой, не используя новые классы и методы.

                  > Типа писать на 11-й джаве, а собираться под четвертую?
                  Думаю на практике это невозможно. Если уж 11я с 8ой не очень совместима...

                  Видел когда-то специальные тулзы для компиляции 5ой в 4ю.
                  Ответить
                  • В смысле не используя новые классы из стандартной либы, но используя лямбды?

                    коко например умел компилировать свои лямбды под шестую джаву (по сути же сахар над анянянмными классами)
                    Ответить
                • С кросскомпиляцией не всё просто. Одни новые фишки компилятор умеет собирать под старый байткод, другие не умеет. Надо каждую фишку проверять.
                  Ответить
                  • Интересно, а что конкретно не умеет?
                    Ответить
                    • Оставлю пока тут ссылку, чтобы не потерять, потом изучу этот вопрос подробнее:

                      https://developer.android.com/studio/write/java8-support

                      У конвертора d8 есть режим «desugaring», чтобы новые фишки можно было реализовать старыми опкодами.
                      Ответить
                      • Интересная ссылка.

                        > Java 8+ language features desugaring that is available from Android Gradle Plugin 3.0.0 does not make any additional classes and APIs (such as java.util.stream.*) available for use on older Android releases.

                        Ну как и предполагал выше, классы из jdk8 недоступны, а сахарок со стрелочками есть.

                        Неплохо на самом деле.

                        > Sequential streams (java.util.stream)
                        > A subset of java.time
                        > java.util.function
                        > Recent additions to java.util.{Map,Collection,Comparator}
                        > Optionals (java.util.Optional, java.util.OptionalInt and java.util.OptionalDouble) and some other new classes useful with the above APIs

                        Это всё и яйца выебанного не стоит.

                        java.util.stream — просто LINQ, анскильное и неудобное при том.

                        Его отсутствие только ускорит разрабатываемые программы, поскольку в них будет меньше тормозной лямбда-питушни.

                        > java.util.function
                        Просто набор интерфейсов.

                        > Optionals (java.util.Optional, java.util.OptionalInt and java.util.OptionalDouble)
                        Ненужно.
                        Brian Goetz considers Optional.get to be the biggest mistake in Java 8.

                        Единственное за чем я бы пожалел это обновлённые HashMap/ConcurrentHashMap.

                        Но в целом это совершенно некритичый функционал.

                        Так что разработчики под ведро особо ничего не потеряли.
                        Ответить
                        • >Brian Goetz considers Optional.get to be the biggest mistake in Java 8.
                          Плюсану.

                          Optional без null safety ничем не лучше обычного нула
                          Ответить
                          • Эм, у вас там в optional может оказаться null?

                            Какой багор )))

                            Optional<Boolean>: empty, null, false, true
                            Ответить
                            • а почему в Optional не может быть null?
                              Ответить
                            • Именно поэтому я за «Jawa Script».
                              Ответить
                            • Похоже на «PHP», в котором функция может вернуть null, false, 0, пустую строку, пустой массив, а вызывающий код должен всё это различить.
                              Ответить
                              • Это аналог Whitespace — передавать информация разными видами нихуя.
                                Ответить
                            • у нас котлин и самопильный юнион из {Result,Error} с паттерн матчингом, а для простых случаев нул сейфти

                              А у жабаёбов да, и это очень смешно

                              >Эм, у вас там в optional может оказаться null?
                              а кто запретит?
                              Ответить
                              • Эм, ну в доке вроде написано что get() возвращает non-null value. Или ты про то, что сам Optional<Boolean> может быть null? Там и правда запретить некому.
                                Ответить
          • > Запускать jre 1.8 в «Андроиде»
            Ответить
            • Саму JRE, чтобы запускать неконвертированные программы?
              Ответить
              • Условно есть какая-то общепринятая либа, требующая Йажа 8 (та же guava или apache commons).

                Edit:
                Ааа, понял. Там не всё так просто.

                > Guava comes in two flavors.
                > The JRE flavor requires JDK 1.8 or higher.
                > If you need support for JDK 1.7 or Android, use the Android flavor. You can find the Android Guava source in the android directory.

                https://guava.dev/

                Если бы на ондроиде была нормальная 1.8, они не пердолились c джвумя версиями и давно бы забили на саппорт 1.7.
                Ответить
                • На андроиде точно нет каких-то кусков джавы, вместо которых там что-то свое

                  Там нет свинга, там омжет быть какая-то другая питушня с тредами, может быть другой API для криптушни итд
                  Ответить
                  • Я видел порт JRE для Андроида, который не использовал Dalvik/ART и фреймворк, а шёл со своими библиотеками, чтобы не ломать голову над совместимостью. Ну и весил он много.

                    А если делать, как я (конвертировать приложения J2SE в байткод Dalvik и запускать их в андроидовском окружении), то иногда можно натыкаться на отсутствие какого-нибудь класса или метода в стандартном для Андроида фреймворке. И тогда придётся дописывать свои врапперы, чтобы приложение запускалось.

                    Вот у меня, например, Jython и JRuby не пошли, потому что того, чего они хотят, нету во фреймворке Андроида.
                    Ответить
    • У «ecj» странная нумерация версий.

      Тут версии от 3.3.1 до 4.6.1, датированные годами 2011-2016:
      https://repo1.maven.org/maven2/org/eclipse/jdt/core/compiler/ecj/

      А тут версии от 3.12.3 до 3.27.0, датированные годами 2017-2021:
      https://repo1.maven.org/maven2/org/eclipse/jdt/ecj/

      3.27.0 уже не запускается на восьмой «JVM».

      Получается, что 3.12.3 новее, чем 4.6.1. Как так получилось? Они отменили четвёртую ветку и вернулись к третьей?
      Ответить
      • Надо подписаться на прыщеблядскую рассылку, там может быть ответ
        Ответить
        • Я сначала скачал 4.6.1, думая, что он последний. Прыщебляди соснули!

          Запустим java -jar ecj-3.26.0.jar:
          Eclipse Compiler for Java(TM) v20210609-0549, 3.26.0
          Copyright IBM Corp 2000, 2020. All rights reserved.
           
           Usage: <options> <source files | directories>
           If directories are specified, then their source contents are compiled.
           Possible options are listed below. Options enabled by default are prefixed
           with '+'.
          
          ... кучу опций пропущу ...
          
              -O                 optimize for execution time (ignored)


          Во всех найденных версиях ключ -O игнорируется. У них когда-то была оптимизация, но они её отключили или наоборот включили? Или это для совместимости с другими компиляторами?

          К слову, о версиях, поддерживаемых 3.26.0:
          Compliance options:
              -1.3               use 1.3 compliance (-source 1.3 -target 1.1)
              -1.4             + use 1.4 compliance (-source 1.3 -target 1.2)
              -1.5 -5 -5.0       use 1.5 compliance (-source 1.5 -target 1.5)
              -1.6 -6 -6.0       use 1.6 compliance (-source 1.6 -target 1.6)
              -1.7 -7 -7.0       use 1.7 compliance (-source 1.7 -target 1.7)
              -1.8 -8 -8.0       use 1.8 compliance (-source 1.8 -target 1.8)
              -1.9 -9 -9.0       use 1.9 compliance (-source 1.9 -target 1.9)
              -10 -10.0          use 10  compliance (-source 10  -target 10)
              -11 -11.0          use 11  compliance (-source 11  -target 11)
              -12 -12.0          use 12  compliance (-source 12  -target 12)
              -13 -13.0          use 13  compliance (-source 13  -target 13)
              -14 -14.0          use 14  compliance (-source 14  -target 14)
              -15 -15.0          use 15  compliance (-source 15  -target 15)
          Ответить
          • Это чтоб ты мог поменять тулзу, а опции оставить как есть
            Ответить
            • Теперь стало любопытно, в каком же из конпеляторов «Йажи» опция «-O» работает.
              Ответить

    Добавить комментарий