Android 为了使用AWS Gamelift API,有没有办法防止IL2CPP编译器在Unity中进行程序集剥离?

Android 为了使用AWS Gamelift API,有没有办法防止IL2CPP编译器在Unity中进行程序集剥离?,android,amazon-web-services,unity3d,mono,il2cpp,Android,Amazon Web Services,Unity3d,Mono,Il2cpp,显然,AWS Gamelift API使用反射或某种机制,导致Unity编译器过度剥离所需的程序集。因此,您只能使用允许关闭剥离的Mono编译器。IL2CPP没有类似的选项。对于IL2CPP,可以通过link.xml文件\Assets\link.xml中的条目控制剥离。到目前为止,我还没有成功地使用link.xml方法 在link.xml中使用下面的条目后,会阻止一些异常,但此异常仍然存在 2020-03-16 12:12:14.6221383-13898/com.company.app E/U

显然,AWS Gamelift API使用反射或某种机制,导致Unity编译器过度剥离所需的程序集。因此,您只能使用允许关闭剥离的Mono编译器。IL2CPP没有类似的选项。对于IL2CPP,可以通过link.xml文件\Assets\link.xml中的条目控制剥离。到目前为止,我还没有成功地使用link.xml方法

在link.xml中使用下面的条目后,会阻止一些异常,但此异常仍然存在

2020-03-16 12:12:14.6221383-13898/com.company.app E/Unity:NotSupportedException:System.Configuration.ConfigurationManager::get_AppSettings 在System.Configuration.ConfigurationManager.get_AppSettings[0x00000]中:0 在:0中的Amazon.AWSConfigs.GetConfig System.String name[0x00000]处 在Amazon.AWSConfigs..cctor[0x00000]中:0 在Amazon.Runtime.ClientConfig..ctor[0x00000]中:0 在Amazon.GameLift.AmazonGameLiftConfig..ctor[0x00000]中:0 在Amazon.GameLift.AmazonGameLiftClient..ctor System.String awsAccessKeyId,System.String awsSecretAccessKey,Amazon.RegionEndpoint区域[0x00000]中:0 在0中的GameLiftClient.GetConnectionInfo System.String和ip、System.Int32和port、System.String和playerSessionId[0x00000]处 在GameLift.GetConnectionInfo System.String&ip,System.Int32&port,System.String

link.xml

<linker>
  <assembly fullname="UnityEngine">
    <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandlerRaw" preserve="all" />
    <type fullname="UnityEngine.Networking.UploadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandler" preserve="all" />
    <type fullname="UnityEngine.Networking.DownloadHandlerBuffer" preserve="all" />
  </assembly>
  <assembly fullname="mscorlib">
      <namespace fullname="System.Security.Cryptography" preserve="all"/>
  </assembly>
  <assembly fullname="System">
      <namespace fullname="System.Security.Cryptography" preserve="all"/>
  </assembly>
  <assembly fullname="AWSSDK.Core" preserve="all"/>
  <assembly fullname="AWSSDK.CognitoIdentity" preserve="all"/>
  <assembly fullname="AWSSDK.CognitoSync" preserve="all"/>
  <assembly fullname="AWSSDK.DynamoDBv2" preserve="all"/>
  <assembly fullname="AWSSDK.Kinesis" preserve="all"/>
  <assembly fullname="AWSSDK.KinesisFirehose" preserve="all"/>
  <assembly fullname="AWSSDK.Lambda" preserve="all"/>
  <assembly fullname="AWSSDK.MobileAnalytics" preserve="all"/>
  <assembly fullname="AWSSDK.S3" preserve="all"/>
  <assembly fullname="AWSSDK.SecurityToken" preserve="all"/>
  <assembly fullname="AWSSDK.SimpleEmail" preserve="all"/>
  <assembly fullname="AWSSDK.SimpleNotificationService" preserve="all"/>
  <assembly fullname="AWSSDK.SQS" preserve="all"/>
  <assembly fullname="AWSSDK.IdentityManagement" preserve="all"/>
  <assembly fullname="AWSSDK.GameLift" preserve="all"/>
  <assembly fullname="System.Configuration" preserve="all"/>
  <assembly fullname="System.SecurityUtils" preserve="all"/>
  <assembly fullname="System.ComponentModel" preserve="all"/>
  <assembly fullname="System.Activator" preserve="all"/>
  <assembly fullname="System.RuntimeType" preserve="all"/>
</linker>

是否使用link.xml或其他机制禁用Unity中的程序集剥离,以便可以使用IL2CPP编译器?

实际上,此错误与托管代码剥离无关。发生这种情况是因为IL2CPP不支持System.Configuration.ConfigurationManager


您需要查看是否可以在不访问configuration manager API的情况下使用AWS Gamelift API。

按照Josh Peterson的回答,解决方案是使用link.xml文件来防止剥离,并使用不包括System Configuration Manager的AWSSDK.Core和AWSSDK.GameLift库的修改版本

以下AWSSDK GitHub项目的分叉版本的全部目的是解决针对IL2CPP编译和使用GameLift的问题

首先构建AWSSDK.Core.Net45.csproj,然后构建AWSSDK.GameLift.Net35.csproj,这两个必要的库都将输出到/sdk/src/Services/GameLift/目录

将输出二进制文件添加到Unity项目的/Assets/Plugin目录中,将link.xml添加到/Assets目录中……IL2CPP将编译并运行GameLift命令,不会出现异常