Подтвердить что ты не робот

Инструмент Android dx

Кто-нибудь знает о какой-либо документации для dx? В частности, мне интересно узнать, что делает опция -core-library. Может ли кто-нибудь пролить свет на это?

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Где это?

dx.jar был оригинальным, расположенным под android-sdk/platform/android-X/tools/lib/before (особенно в android-3 и android-4), и перешел на android-sdk/platform-tools/lib/позже.

Как он подходит для Android?

Исходные файлы Java преобразуются в файлы классов Java компилятором Java.

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

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

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

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

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

build process

FYI:

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

Ссылка

Ответ 3

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

Dx будет barf, если вы попытаетесь включить библиотеку, содержащую пакеты в 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" "[email protected]"

в

exec java $javaOpts -jar "$jarpath" --core-library "[email protected]"

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