Мюнхгаузен-стайл, или один ненормальный способ запускать Java-программы на Android

в 11:28, , рубрики: android, java, ненормальное программирование, метки: ,

image

В один прекрасный день меня одолело странное желание — пользоваться всей мощью моего андроид-смартфона в консоли. Очень удобный способ для всяческих утилитарных задач. В консоли — это ключевой момент моего повествования.
Как таковая разработка под Android (если мы говорим про стандартный Android SDK, а не NDK) не подразумевает консольного программирования. Активити, сервисы, интенты — в общем, на эту тему написан не один десяток статей, а моя — о другом.

Как вы, возможно знаете (а может быть и нет), программы для Android, хоть и пишутся на Java, перед выполнением должны быть сконвертированы в совершенно отличный от Java байт-код. Потому что виртуальная машина Dalvik, сердце Android — устроена по другому, нежели Java SE VM. Для этого служит специальная утилита в составе Android SDK под названием dx (Dalvik eXecutable).
Работает она дьявольски просто:

java -jar dx.jar --dex --output=dexed.jar java.jar

где java.jar — пакет java с java-классами, а dexed.jar — пригодный для заливки и запуска на Android java-пакет.

Что же делать, если очень хочется запустить какой-то консольный джарик прямо «в поле»? Вывод напрашивается сам собой — конвертировать dx.jar при помощи самого себя, залить на девайс, и использовать его прямо там. Затея, конечно, рискованная, но мы попробуем.

java -jar dx.jar --dex --output=dx.apk dx.jar
adb push dx.apk /sdcard/dx.apk
adb push helloworld.jar /sdcard/helloworld.jar

здесь я возьму небольшую паузу, чтобы дать кое-какие разъяснения.
Хоть Android SDK не подразумевает разработки консольных программ, Dalvik спокойно их запускает и выполняет. Естественно, вы должны это делать в какой-нибудь терминальной программе. Есть у Dalvik и еще одна неприятность — он не поддерживает опцию -jar. Ну, то есть сама опция есть, но он её игнорирует. По крайней мере для моей Milestone 2 с Android 2.3.4 это справедливо. Поэтому пакет с программой надо указывать ключом -cp, и основной запускаемый класс с методом main — вручную.

adb shell
cd /sdcard
dalvikvm -cp dx.apk com.android.dx.command.Main --dex --output=helloworld.apk helloworld.jar
dalvikvm -cp helloworld.apk helloworld.Main hello
Hello, hello!

Вот так, можно имея «дексированный» dx запускать java-программы прямо на устройстве.
Надеюсь, эта информация была полезной для тебя, читатель.

С наступающим новым годом!

Автор: ne_kotin

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js