如何在Xamarin.Forms Android应用程序中使用D8和R8?
我刚刚下载了VS2019 pre,如前所述,它为xamarin android提供了更多配置 建议如下使用,说明proguard不能与r8一起使用,因为它是proguard的替代品如何在Xamarin.Forms Android应用程序中使用D8和R8?,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我刚刚下载了VS2019 pre,如前所述,它为xamarin android提供了更多配置 建议如下使用,说明proguard不能与r8一起使用,因为它是proguard的替代品 <Project> <PropertyGroup> <AndroidEnableMultiDex>True</AndroidEnableMultiDex> <AndroidDexTool>d8</AndroidD
<Project>
<PropertyGroup>
<AndroidEnableMultiDex>True</AndroidEnableMultiDex>
<AndroidDexTool>d8</AndroidDexTool>
<AndroidLinkTool>r8</AndroidLinkTool>
</PropertyGroup>
</Project>
更新:
我删除了r8并启用了proguard。因为一般来说(不仅仅是xamarin)r8并不像proguard那样成熟。所以我只让d8在配置和EnableProguard=true以上。但是我得到了关于r8的警告和错误
8>"\myApp.Droid\myApp.Droid.csproj" (Rebuild;BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;DebugSymbolsProjectOutputGroup;DebugSymbolsProjectOutputGroupDependencies;DocumentationProjectOutputGroup;DocumentationProjectOutputGroupDependencies;SatelliteDllsProjectOutputGroup;SatelliteDllsProjectOutputGroupDependencies;SGenFilesOutputGroup;SGenFilesOutputGroupDependencies target) (1) ->
8>(_CompileToDalvikWithD8 target) ->
8> R8 : warning : Missing class: com.amazon.device.messaging.ADMMessageReceiver
8> R8 : warning : Missing class: com.google.android.gms.location.LocationListener
8> R8 : warning : Missing class: com.amazon.device.messaging.ADMMessageHandlerBase
8> R8 : warning : Missing class: com.amazon.device.iap.PurchasingListener
8> R8 : warning : Missing class: org.apache.http.client.methods.HttpEntityEnclosingRequestBase
8>
8>
8>"\myApp.Droid\myApp.Droid.csproj" (Rebuild;BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;DebugSymbolsProjectOutputGroup;DebugSymbolsProjectOutputGroupDependencies;DocumentationProjectOutputGroup;DocumentationProjectOutputGroupDependencies;SatelliteDllsProjectOutputGroup;SatelliteDllsProjectOutputGroupDependencies;SGenFilesOutputGroup;SGenFilesOutputGroupDependencies target) (1) ->
8>(_CompileToDalvikWithD8 target) ->
8> R8 : error : Compilation can't be completed because some library classes are missing.
8>
8> 45 Warning(s)
8> 1 Error(s)
8>
我想在这里为那些对xamarin表单应用程序使用D8和R8感到兴奋的人提供一个更新 首先,最后一件事是,它还没有准备好,也没有明显的优势。不要浪费时间。 我几乎花了一整天的时间用现有的proguard运行我现有的应用程序,因为有人承诺它应该和我现有的应用程序一起工作。以下是我遇到的一些问题
优化中有这一行!字段/删除/写入,!现场/标记/私人,!类/合并/*,!代码/分配/变量
和r8不喜欢它Aot+lvvm+捆绑到本机程序集+CreatePackagePerAbi+完全链接中
用于每2个测试
在Xamarin的早期阶段看到d8和r8的支持无疑是令人兴奋和积极的。我们很感激这一点,但对于那些像我这样想快速尝试的人来说,这还不值得。将来我们可能会重新考虑这些选项,但现在multi-dex、proguard似乎是更好的选项。除了我的构建失败,出现了关于org.apache.http的错误(已修复)之外,我发现这个配置对我有效
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidLinkMode>SdkOnly</AndroidLinkMode>
<AndroidSupportedAbis>armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<AndroidCreatePackagePerAbi>true</AndroidCreatePackagePerAbi>
<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
<!-- Alternative to using Proguard -->
<AndroidDexTool>d8</AndroidDexTool>
<AndroidLinkTool>r8</AndroidLinkTool>
<!-- (A) Recommended AOT settings based on https://forums.xamarin.com/discussion/104165/when-will-be-aot-available-again -->
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk> <!-- See (A) -->
<BundleAssemblies>True</BundleAssemblies> <!-- See (A) -->
<AotAssemblies>True</AotAssemblies> <!-- See (A) -->
<EnableLLVM>True</EnableLLVM> <!-- See (A) -->
<!-- TODO Startup Tracing -->
</PropertyGroup>
真的
bin\Release\
痕迹
促使
4.
斯德科尼
armeabi-v7a;x86;arm64-v8a;x86_64
真的
Xamarin.Android.Net.AndroidClientHandler
d8
r8
真的
真的
真的
真的
它成功地部署了,速度更快,而且即使在添加AOT之后,APK的大小现在也比我原来没有使用ProGuard/AOT的构建稍微小一些
请注意,Xamarin Studio(社区)不允许您为Android设置AOT/LLVM选项,因此您必须直接编辑项目
另外,打开构建/归档窗口也是值得的,因为它需要很长时间(特别是如果您为每个体系结构提供单独的ABI),有一段时间我认为Xamarin Studio陷入了困境。d8/r8与Java方面相关,而不是.Net方面,所以LLVM/AOT/embedding/等等。。。不受影响。r8是Google对第三方ProGuard工具的替代品(r8同时也提供了dexes)。如果启用MSBuild诊断级别日志记录,r8完整错误是什么?@sushingover我将重试,稍后发布完整输出。您看到我的配置中有任何问题吗?带有空格的
AndroidLinkSkip
很奇怪,有些条目是不需要的(EnableProguard
),但没有什么会(应该)的导致r8错误…这是测试版,如果您看到一些错误,它可能是一个错误,您应该使用VS反馈提交。@Sushingover我已手动编辑了此部分。只是不想发布所有跳过的库。有关Proguard vs.R8.的更多背景和基准测试:。自发布后有什么改进吗?
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidLinkMode>SdkOnly</AndroidLinkMode>
<AndroidSupportedAbis>armeabi-v7a;x86;arm64-v8a;x86_64</AndroidSupportedAbis>
<AndroidCreatePackagePerAbi>true</AndroidCreatePackagePerAbi>
<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
<!-- Alternative to using Proguard -->
<AndroidDexTool>d8</AndroidDexTool>
<AndroidLinkTool>r8</AndroidLinkTool>
<!-- (A) Recommended AOT settings based on https://forums.xamarin.com/discussion/104165/when-will-be-aot-available-again -->
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk> <!-- See (A) -->
<BundleAssemblies>True</BundleAssemblies> <!-- See (A) -->
<AotAssemblies>True</AotAssemblies> <!-- See (A) -->
<EnableLLVM>True</EnableLLVM> <!-- See (A) -->
<!-- TODO Startup Tracing -->
</PropertyGroup>