Android использует dx/d8 для преобразования jar в dex

предисловие

До JDK1.8 мы могли использовать инструмент dx для преобразования jar в dex.
Для поддержки JDK1.8 в настоящее время AGP реализуется путем преобразования байт-кодов в процессе компиляции файлов классов в файлы dex в D8/R8.Этот процесс преобразования называется дешугарингом.
Поэтому для JDK1.8 и более поздних версий нам нужно использовать инструмент d8 для преобразования jar в dex.

дх

дх AndroidSDK/build-tools/<33.0.0的版本号есть.

  1. Компьютер с Windows может выполнять dx прямо в каталоге, и Mac должен ./dxвыполнить его.
  2. Рекомендуется AndroidSDK/build-tools/<33.0.0的版本号настроить его в переменной среды.

вставьте сюда описание изображения

Если в вашем проекте используется версия JDK < 1.8, вы можете использовать dx.
Если в вашем проекте используется JDK версии >=1.8, но он не содержит лямбда-выражений и других кодов, которые необходимо обессахаривать, вы также можете использовать dx после экспериментов.

Командная строка dx используется следующим образом:

dx --dex --output=输出 目标.jar

Выходное имя должно заканчиваться одним из: .dex .jar .zip .apk или быть каталогом.

нравиться:

dx --dex --output=dexlib_dex.jar dexlib.jar

Если сообщается сообщение об ошибке:

Uncaught translation error: com.android.dx.cf.code.SimException: ERROR in com.demon.dexlib.TestActivity.onCreate:(Landroid/os/Bundle;)V: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13)
1 error; aborting

Указывает на то, что в вашем проекте есть код, который необходимо обессахарить.
Хотя вы можете добавить –min-sdk-version=26 для устранения ошибки, продолжайте генерировать dex.

dx --dex --min-sdk-version=26  --output=dexlib_dex.jar dexlib.jar

Но он вылетит при запуске, поэтому используйте его с осторожностью! ! !

java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup

d8

Теперь проекты Android обычно >=JDK1.8, которые будут настроены в build.gradle:

compileOptions {
    
    
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    
    
    jvmTarget = '1.8'
}

d8 в AndroidSDK/build-tools/>=28.0.1的版本号середине.

  1. Компьютер с Windows может напрямую выполнить d8 в каталоге, и Mac должен ./d8выполнить его.
  2. Рекомендуется AndroidSDK/build-tools/>=28.0.1的版本号настроить его в переменной среды.
    вставьте сюда описание изображения

Командная строка d8 используется следующим образом:

d8 --output 输出 目标.jar

Вывод должен быть архивом .zip или .jar или существующим каталогом.

нравиться:

d8 --output dexlib_dex.jar dexlib.jar

ссылка

Пакет U8 заменяет dx на d8,
обратная разработка использует dx.jar, d8.jar, baksmali.jar для преобразования jar в файл dex, решает проблему, требующую --min-sdk-version >= 26 (в настоящее время 13)
инструментария байт-кода ASM: Начните с лямбда-выражения

Supongo que te gusta

Origin blog.csdn.net/DeMonliuhui/article/details/128580370
Recomendado
Clasificación