web-dev-qa-db-ja.com

Android用Xamarin.FormsアプリでD8、R8を使用する方法

私はVs 2019 preをダウンロードしたばかりで、xamarin Android述べられているように、より多くの構成を提供します here

それは以下のように使用することを提案し、それはそれがプロガードの代わりであるため、プロガードはr8と一緒に使用できないことを伝えます。

<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を削除し、プロガードを有効にしました。一般的に読んだ後(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>
5
batmaci

Org.Apache.httpに関するエラーでビルドが失敗した問題以外(これは https://github.com/xamarin/xamarin-Android/issues/267 で修正されました)この構成を見つけました私のために働いた...

 <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が動かなくなったと思ったので、ビルド/アーカイブウィンドウを開いておく価値があります。

0
Devology Ltd