我刚刚下载了Vs 2019 pre,并且它为[xamarin android提供了更多配置,如here 所述
[建议使用以下内容,并告知proguard不能与r8一起使用,因为它可以代替proguard。
<Project>
<PropertyGroup>
<AndroidEnableMultiDex>True</AndroidEnableMultiDex>
<AndroidDexTool>d8</AndroidDexTool>
<AndroidLinkTool>r8</AndroidLinkTool>
</PropertyGroup>
</Project>
但是我不太了解r8应该如何工作?因为使用proguard,我已经做了很多配置,例如定义保留哪个库,类,函数。所以我们不需要这些吗?只需设置r8即可?我已经按照建议尝试,但出现错误8>R8 : error : Compilation can't be completed because some library classes are missing.
此外,这些设置如何将效果捆绑到本机程序集,AotAssemblies,LLVM等中?我们可以和他们一起使用吗?我的配置如下。但不幸的是,它不起作用。如果我删除D8和R8,它的工作原理。我尝试仅使用Proguard + D8,但也无法使用。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
<DebugType>portable</DebugType>
<AndroidLinkMode>Full</AndroidLinkMode>
<EmbedAssembliesIntoApk>true</EmbedAssembliesIntoApk>
<AndroidCreatePackagePerAbi>true</AndroidCreatePackagePerAbi>
<JavaMaximumHeapSize>1G</JavaMaximumHeapSize>
<AotAssemblies>true</AotAssemblies>
<EnableLLVM>true</EnableLLVM>
<AndroidAotAdditionalArguments>no-write-symbols,nodebug</AndroidAotAdditionalArguments>
<DebugSymbols>false</DebugSymbols>
<BundleAssemblies>true</BundleAssemblies>
<AndroidEnableMultiDex>True</AndroidEnableMultiDex>
<EnableProguard>false</EnableProguard>
<Debugger>Xamarin</Debugger>
<AndroidSupportedAbis>armeabi-v7a;x86;x86_64</AndroidSupportedAbis>
<AndroidLinkSkip> </AndroidLinkSkip>
<AndroidEnableMultipleDex>true</AndroidEnableMultipleDex>
<AndroidExplicitCrunch>true</AndroidExplicitCrunch>
<AndroidDexTool>d8</AndroidDexTool>
<AndroidLinkTool>r8</AndroidLinkTool>
</PropertyGroup>
更新:
我删除了r8并启用了proguard。因为一般阅读后(不仅是xamarin),r8还不如proguard成熟。所以我只让d8高于configuarion和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>
最后,它还没有准备好,也没有明显的优势。不要浪费时间。
我花了整整一整天的时间与现有的proguard一起运行现有的应用程序,因为它被保证可以与现有的应用程序一起使用。这是我遇到的一些问题;error : java.lang.StringIndexOutOfBoundsException: String index out of range : 4735
。尽管我启用了诊断构建,但您甚至不知道它的含义。我通过删除proguard中的每一行来弄清楚,每次都必须在发行版中进行重建。您可能会想象这是多么痛苦,因为每个构建可能要花费5-10分钟的时间,并且您必须重复几次。最终我发现我的proguard -optimizations !field/removal/writeonly,!field/marking/private,!class/merging/*,!code/allocation/variable
中有这行,而r8不喜欢它。结果:
Aot+lvvm+bundle into native assemblies+ CreatePackagePerAbi+ Full linking
用于每2个测试具有multidex + proguard的应用= apk大小26.4mb dex大小3,4mb
- 带有d8 + r8 +的应用程序+无multidex +无proguard = apk大小26,2mb dex大小2,7mb
<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>
此部署成功,速度更快,即使添加AOT之后的APK大小现在也比不使用ProGuard / AOT的原始版本小。请注意,Xamarin Studio(社区)不允许您设置Android的AOT / LLVM选项,因此必须直接编辑项目。
同样值得打开构建/存档窗口,因为这需要很长时间(特别是如果您为每个体系结构分配一个单独的ABI),有一段时间我认为Xamarin Studio会卡住。