今天我遇到了一个问题。我的项目需要使用一些使用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"处于启用状态。