Android dx tool - PullRequest
       32

Android dx tool

21 голосов
/ 13 декабря 2011

Кто-нибудь знает какую-либо документацию для dx?

В частности, мне интересно узнать, что делает опция --core-library.

Может кто-нибудь пролить свет на это?

Ответы [ 3 ]

32 голосов
/ 29 мая 2014

Что такое инструмент dx?

Инструмент dx преобразует файлы классов Java в .dex (исполняемый файл Dalvik) файл

Где находитсяэто?

Первоначально dx.jar находился под android-sdk / platform / android-X / tools / lib / до этого (особенно в android-3 и android-4), иперенесено на android-sdk / platform-tools / lib / позже.

Как оно вписывается в Android?

Исходные файлы Java *

*1023* dx преобразует файлы классов Java в .dex (исполняемый файл Dalvik) , преобразованный в файлы классов Java .,Все файлы классов приложения находятся в этом файле .dex.Во время этого процесса преобразования избыточная информация в файлах классов оптимизируется в файле .dex.

Например, если одна и та же строка находится в разных файлах классов, файл .dex содержит только одну ссылку на эту строку.

Следовательно, эти файлы .dex имеют гораздо меньший размер, чем файлы соответствующих классов.

Файл .dex и ресурсы проекта Android, например изображения и файлы XML, упакованы.в файл .apk (пакет Android).

Чтобы лучше понять процесс сборки Android

build process

К вашему сведению:

Программа aapt (Android Asset Packaging Tool) выполняет создание apk.Полученный файл .apk содержит все необходимые данные для запуска приложения Android и может быть развернут на устройстве Android с помощью инструмента adb (мост устройства Android).

Ссылка

10 голосов
/ 13 декабря 2011

Это флаг специального назначения, который используется только при сборке некоторых из jar-файлов фреймворка (core.jar, framework.jar и т. Д.). Обычно dx отказывается обрабатывать любые классы java. * Или javax. *. Так что эта опция используется для core.jar, где все эти классы фактически определены.

Вот соответствующая реклама из источника dx (dalvik / dx / src / com / android / dx / command / dexer / Main.java), которая печатается, если вы попытаетесь включить класс java. * Или javax. * в приложении.

Неправильное или ошибочное использование основного класса (java. * Или javax. *). когда не строит базовую библиотеку. Это часто происходит из-за непреднамеренного включения файла основной библиотеки в проекте вашего приложения, при использовании IDE (например, Затмение). Если вы уверены, что не намеренно определяете основной класс, то это наиболее вероятное объяснение того, что продолжается.

Тем не менее, вы можете пытаться определить класс в ядре пространство имен, источником которого вы могли воспользоваться, например, из не-Android проекта виртуальной машины. Это будет большинство конечно, не работает. Как минимум, это ставит под угрозу совместимость вашего приложения с будущими версиями платформы. Это также часто сомнительной законности.

Если вы действительно намереваетесь создать базовую библиотеку, которая подходит как часть создания полноценной виртуальной машины распространение, в отличие от компиляции приложения - затем используйте опция \ "- core-library \" для подавления этого сообщения об ошибке. Если вы идете дальше и используете \ "- core-library \", но на самом деле создание приложения, тогда будьте предупреждены, что ваше приложение все равно не удастся построить или запустить, в какой-то момент. Пожалуйста, будьте подготовлен для злых клиентов, которые считают, например, что ваш приложение перестает функционировать после обновления операционной системы система. Вы будете виноваты в этой проблеме.

Если вы законно используете какой-то код, который находится в основной пакет, то самая простая и безопасная альтернатива упаковать этот код. То есть переместить рассматриваемые классы в ваше собственное пространство имен пакетов. Это означает, что они никогда не будут в конфликт с основными классами системы. JarJar - это инструмент, который может помочь Вы в этом стремлении. Если вы обнаружите, что не можете этого сделать, то это признак того, что путь, по которому вы идете, в конечном итоге привести к боли, страданию, горе и скорби.

4 голосов
/ 19 июня 2012

опция --core-library в Dx пропустит проверку на глупость, которая предотвращает случайное включение основных библиотек Java в ваше приложение для Android.

Dx прекратит работу, если вы попытаетесь включить библиотеку, содержащую пакеты, в пространство имен java. * Или javax. *.Мысль заключается в том, что классы в этом пространстве имен, вероятно, будут зависеть от других «базовых» классов JDK, которые сломают ваше приложение, поскольку их (возможно) нет на Android.

сейчас, конечно, только потому, чтоjava-пакет начинается с java. * или javax. * не обязательно означает, что он зависит от самого JDK.это может прекрасно работать в Android.если вы знаете, что делаете, если знаете, что ваши классы java / x. * не зависят от базовых классов JDK, рекомендуется использовать такой инструмент, как JarJar, для переупаковки JAR под другим пространством имен.

при этом, чтобы обойти проверку на глупость, добавьте опцию --core-library в dx.измените последнюю строку $ANDROID_HOME/platform-tools/dx с

exec java $javaOpts -jar "$jarpath" "$@"

на

exec java $javaOpts -jar "$jarpath" --core-library "$@"

, в моем случае я включал библиотеку, которая зависела от Джексона, который зависит от JAXB.для меня переопределение проверки на глупость было приемлемым, потому что библиотека использовала Джексона только для JSON, а не для XML-сериализации (я включаю только библиотеку API JAXB, а не impl).Конечно, мне хотелось бы, чтобы был более понятный способ, но переписать библиотеку верхнего уровня, чтобы избежать использования Джексона, было невозможно.

...