предисловие
До JDK1.8 мы могли использовать инструмент dx для преобразования jar в dex.
Для поддержки JDK1.8 в настоящее время AGP реализуется путем преобразования байт-кодов в процессе компиляции файлов классов в файлы dex в D8/R8.Этот процесс преобразования называется дешугарингом.
Поэтому для JDK1.8 и более поздних версий нам нужно использовать инструмент d8 для преобразования jar в dex.
дх
дх AndroidSDK/build-tools/<33.0.0的版本号
есть.
- Компьютер с Windows может выполнять dx прямо в каталоге, и Mac должен
./dx
выполнить его. - Рекомендуется
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的版本号
середине.
- Компьютер с Windows может напрямую выполнить d8 в каталоге, и Mac должен
./d8
выполнить его. - Рекомендуется
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: Начните с лямбда-выражения