Beri bash i ebash / Говнокод #27467 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 npopa6, (Updated )

Комментарии (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
                а оказалось, что это просто прораб
                Ответить
                  • > переименовать улицу Королёва в улицу Королёва

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

                        Виктор Пелевин. Чапаев и пустота.
                        Ответить
          • А где тут уникальная инфа? Приведи реальные примеры.
            Ответить
    • > отсутствуют некоторые методы, которые есть в 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 компилятору?
        Ответить
        • Писать на джаве версии 18 хотя бы?
          Ответить
          • Как я понимаю это ортогональные вещи.

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

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

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

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

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

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

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

                      > 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
                          Ответить
                          • Именно поэтому я за «Jawa Script».
                            Ответить
                          • Похоже на «PHP», в котором функция может вернуть null, false, 0, пустую строку, пустой массив, а вызывающий код должен всё это различить.
                            Ответить
                          • у нас котлин и самопильный юнион из {Result,Error} с паттерн матчингом, а для простых случаев нул сейфти

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

                            >Эм, у вас там в optional может оказаться null?
                            а кто запретит?
                            Ответить
                            • Эм, ну в доке вроде написано что get() возвращает non-null value. Или ты про то, что сам Optional<Boolean> может быть null? Там и правда запретить некому.
                              Ответить
            • Условно есть какая-то общепринятая либа, требующая Йажа 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» работает.
            Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8