- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 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
Чтобы ня разглашать, Инканус он или ня Инканус?
https://twitter.com/O7_yaga_blya_ru/status/481096005136703488
Убившая миллионы пандемия, похоже, оплачена США — American Conservative http://mirtesen.ru/pad/нискажу
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»
Только ты можешь знать такую инфу
Где пропадал?
а оказалось, что это просто прораб
https://pbs.twimg.com/media/E3STPpQWEAMECn2.jpg
Интересно, во сколько такой рефакторинг обойдётся?
- Люблю эту песню, - сказал я.
- Как же ты ее барин, любить можешь, если не слышал никогда? - спросил Игнат, присаживаясь рядом.
- Почему же не слышал? Это ведь старая казачья песня.
- Не, - сказал Игнат. - Путаешь. Эту песню господин барон специально для нас сочинили, чтоб мы пели и думали. А чтобы нам легче запомнить было, в ней и слова такие же, как в той песне, про которую ты говоришь, и музыка.
- В чем же тогда заключается его участие? - спросил я. - Я имею в виду, как тогда можно отличить ту песню, которая была раньше, от той, которую господин барон сочинил, если там и слова такие же, и музыка?
- А у той песни, которую господин барон сочинили, смысл совсем другой. Вот послушай, объясню. Слышь, поют: "мне малым мало спалось да во сне привиделось". Это знаешь что значит? Что хоть и не спалось, а все равно привиделось как бы во сне, понимаешь? То есть разницы нету - что спи, что не спи, все одно сон.
Виктор Пелевин. Чапаев и пустота.
> В итоге мне пришлось 28-й версией dx конвертировать 25-ю. Возможно, есть ещё какие-то рабочие комбинации, нужно изучать.
Still better than «Rust»
В общем, если программы нужно запускать на Андроиде 7+, то проблем нет. А если на более древних, то придётся выяснять, какой какую версию байткода поддерживает.
Ну или сдаться и скачать предпоследний бинарь.
Итого:
1. У нас есть «ecj», который получает *.class из *.java.
2. У нас есть «dx», который получает classes.dex из *.class.
3. У нас есть нативный статически собранный «zip» для любого процессора.
4. Для сборки полноценного apk-файла есть «apksigner» и нативные статически собранные «zipalign» и «aapt».
Весь процесс сборки apk или соснольного jar из исходников можно производить на «Андроиде».
А раскрутить до jre 1.8 не удалось?
Можно с -source 1.8 собирать лямбды и методы в интерфейсах, для этого не обязательно иметь новую jre.
Ну наверное так можно, по сути ведь лямбды не требуют новых опкодов (или нет?)
Какие=то опкоды типа 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.
Но в целом это совершенно некритичый функционал.
Так что разработчики под ведро особо ничего не потеряли.
Плюсану.
Optional без null safety ничем не лучше обычного нула
Какой багор )))
Optional<Boolean>: empty, null, false, true
А у жабаёбов да, и это очень смешно
>Эм, у вас там в optional может оказаться null?
а кто запретит?
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 для криптушни итд
А если делать, как я (конвертировать приложения J2SE в байткод Dalvik и запускать их в андроидовском окружении), то иногда можно натыкаться на отсутствие какого-нибудь класса или метода в стандартном для Андроида фреймворке. И тогда придётся дописывать свои врапперы, чтобы приложение запускалось.
Вот у меня, например, Jython и JRuby не пошли, потому что того, чего они хотят, нету во фреймворке Андроида.
Тут версии от 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. Как так получилось? Они отменили четвёртую ветку и вернулись к третьей?
Запустим java -jar ecj-3.26.0.jar:
Во всех найденных версиях ключ -O игнорируется. У них когда-то была оптимизация, но они её отключили или наоборот включили? Или это для совместимости с другими компиляторами?
К слову, о версиях, поддерживаемых 3.26.0: