Pull to refresh

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

Reading time 2 min
Views 25K
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-программы прямо на устройстве.
Надеюсь, эта информация была полезной для тебя, хабраюзер.

С наступающим новым годом!
Tags:
Hubs:
+46
Comments 10
Comments Comments 10

Articles