如何强制Delphi使用D8.bat而不是dx.bat将Java 1.8字节码编译为DEX字节码



今天我遇到了一个问题。我的项目需要使用一些使用Java1.8特性的库(*.jar(。我看到现在越来越多的库使用Java 1.8的功能(如webRTC、extroplayer等(。这样,我们就必须执行desugaring

Desugaring允许您在构建过程中将新的字节码和语言API替换为旧的字节码,从而在旧的设备上使用这些功能

使用d8.bat(替换dx.bat(时,默认情况下会启用去模糊。因此,您现在可以在针对旧设备的同时使用大多数最新的语言更改。

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

dx.bat--dex--output="C:\Dev\output\libwebrtc dexed.jar"C:\Dev\lib\libwebrtsc.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\libwebartc.jar">

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

我找到了一个修改"CodeGear.Common.Targets"文件(Delphi的bin文件夹(的解决方案,创建了一个仅用于使用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"处于启用状态。

最新更新