Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Xamarin.Forms Android应用程序中使用D8和R8?_Xamarin_Xamarin.forms_Xamarin.android - Fatal编程技术网

如何在Xamarin.Forms Android应用程序中使用D8和R8?

如何在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

我刚刚下载了VS2019 pre,如前所述,它为xamarin android提供了更多配置

建议如下使用,说明proguard不能与r8一起使用,因为它是proguard的替代品

<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运行我现有的应用程序,因为有人承诺它应该和我现有的应用程序一起工作。以下是我遇到的一些问题

  • 一些nuget包在r8中失败,而在proguard中工作正常。例如,我对OneSignal库有问题。这是github上的。我相信其他一些图书馆也会有问题
  • r8无法识别Proguard。这太疯狂了,因为您不会得到确切的错误消息,而只会得到如下消息:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:4735。虽然我启用了诊断构建,但您甚至不知道它是关于什么的。我通过删除proguard中的每一行,每次都要在发行版中重新构建来解决这个问题。你可以想象这是多么痛苦,因为每次构建可能需要5-10分钟,并且你必须重复几次。 最后我发现我的proguard
    优化中有这一行!字段/删除/写入,!现场/标记/私人,!类/合并/*,!代码/分配/变量
    和r8不喜欢它
  • 我能够重建和部署在我的手机上没有任何错误的结束和应用程序崩溃的开始。我没有修复它,因为我想在尝试修复某些东西之前看到我的收益
  • 结果:

    据说apk和dex文件的大小减小了,但实际情况是非常小的。 我使用以下设置启用;
    Aot+lvvm+捆绑到本机程序集+CreatePackagePerAbi+完全链接中
    用于每2个测试

  • 具有多索引+proguard的应用程序=apk大小26,4mb索引大小3,4mb
  • 带有d8+r8+无多索引+无proguard的应用程序=apk大小26,2mb索引大小2,7mb

  • 在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>