如何强制Delphi使用D8.bat而不是dx.bat将Java1.8字节码编译成DEX字节码

How to force Delphi to use D8.bat instead of dx.bat to compile Java 1.8 bytecode into DEX bytecode

今天我遇到了一个问题。我的项目需要使用一些使用 Java 1.8 功能的库 (*.jar)。我看到现在越来越多的库使用 Java 1.8 功能(如 webRTC、exoplayer 等)。这样,我们就必须做脱糖.

Desugaring allows you to use these features on older devices by replacing new bytecodes and language APIs with older ones during the build process

使用d8.bat(替换dx.bat),默认打开脱糖。因此,您现在可以在针对旧设备时使用大部分最新的语言更改。

当我们编译一个项目时,在后台Delphi是这样做的:

dx.bat --dex --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\lib\libwebrtc.jar"

这对于包含 Java 1.8 功能的库失败。

所以 Delphi 必须改为这样做:

d8.bat --lib C:\SDKs\android-sdk-windows\platforms\android-28\android.jar --output="C:\Dev\output\libwebrtc-dexed.jar" "C:\Dev\lib\libwebrtc.jar"

知道如何告诉 Delphi 使用 d8.bat 而不是 dx.bat 吗?

我找到了修改 "CodeGear.Common.Targets" 文件(Delphi 的 bin 文件夹)的解决方案,创建了一个仅用于 dex 生成的替代命令,使用 d8.bat 而不是dx.bat:

1) 关闭 IDE

2) 编辑 "CodeGear.Common.Targets",本地化 DxCmd 定义,并添加这两行,为 d8.bat 创建一个新命令:

<JavaD8Path>@(JavaAaptPath->'%(RootDir)%(Directory)')d8.bat</JavaD8Path>
<D8Cmd>PATH $(JDKPath)\bin;$(PATH) %26 "$(JavaD8Path)" --output=</D8Cmd>

3) 现在本地化用于生成 dex 文件的目标并用新的 D8Cmd

替换 DxCmd
  <!-- Generate a "dexed" version of the customized jar files if they doesn´t exists -->
  <Target Name="BuildPredexedJar" DependsOnTargets="GetProjectJars">
    <Exec Condition="( '@(_JarsLocations)'!='' And !Exists('%(_JarsLocations.PredexedJar)') )"
        Command='$(D8Cmd)"%(_JarsLocations.PredexedJar)" %22%(_JarsLocations.FullPath)%22'/>
  </Target>

4) 现在dex生成会使用d8.bat编译器,其中"desugaring"默认开启