Android 部署启用链接的应用程序发布版本时出现问题

Android 部署启用链接的应用程序发布版本时出现问题,android,xamarin,mvvmcross,Android,Xamarin,Mvvmcross,我们希望在启用链接时发布版本不起作用的项目中上线。因此,我们用2个项目将问题隔离在最小的项目设置中: PCL项目:dvit.appfwk.core Android项目:dvit.appfwk.droid Android项目:dvit.appfwk.droid PCL项目具有以下配置文件: 在PCL项目中,我们定义了一个接口: using System; using System.Collections.Generic; namespace dvit.appfwk.core { p

我们希望在启用链接时发布版本不起作用的项目中上线。因此,我们用2个项目将问题隔离在最小的项目设置中:

  • PCL项目:dvit.appfwk.core
  • Android项目:dvit.appfwk.droid
Android项目:dvit.appfwk.droid

PCL项目具有以下配置文件:

在PCL项目中,我们定义了一个接口:

using System;
using System.Collections.Generic;

namespace dvit.appfwk.core
{
    public interface IAzureService
    {
        MobApp MobAppGetItem (int id);
    }
}
在droid项目中,我们将实施:

public MobApp MobAppGetItem (int id)
{
    IMobileServiceTable<MobApp> mobAppTable = MobileService.GetTable<MobApp> ();

    var mobAppQry = mobAppTable.Where (x => x.Id == id);

    var mobApps = mobAppQry.ToListAsync ().Result;

    if (mobApps.Count > 0)
        return mobApps [0];
    else
        return null;
}
public MobApp MobAppGetItem(int-id)
{
IMobileServiceTable mobAppTable=mobileseservice.GetTable();
var mobAppQry=mobAppTable.Where(x=>x.Id==Id);
var mobApps=mobAppQry.ToListAsync().Result;
如果(mobApps.Count>0)
返回mobApps[0];
其他的
返回null;
}
我们在类“FirstViewModel”的PCL中使用此方法(使用所有IOC魔法)。此实现在调试模式和发布模式(无链接)下都能完美工作。但是我们的应用程序占用了太多的空间和内存,因此我们希望启用链接,但是应用程序不再工作,问题似乎是代码行: var mobApps=mobAppQry.ToListAsync().Result

这个问题在某种程度上与异步功能的使用有关。 我在文章的底部添加了“adb logcat-s”命令的输出。 我们还没有找到一个像样的帖子来解释如何解决MvvMCross中的链接问题,我真的希望有人能把我们推向正确的方向

E/appfwk  ( 2202):   0.23 Loading new ViewModel from Intent with Extras
E/appfwk  ( 2202):   0.36 Problem creating viewModel of type FirstViewModel - problem TargetInvocationException: Exception has been thrown by the target of an invocation.
E/appfwk  ( 2202):        at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Reflection.MonoCMethod.DoInvoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization
o culture) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Reflection.MonoCMethod.Invoke (BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
in <filename unknown>:0
E/appfwk  ( 2202):   at System.Reflection.ConstructorInfo.Invoke (System.Object[] parameters) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Cirrious.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct (System.Type type) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Cirrious.CrossCore.Mvx.IocConstruct (System.Type t) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Cirrious.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad (System.Type viewModelType, IMvxBundle parameterValues, IMvxBundle savedState, IMvxViewModel& viewMo
00] in <filename unknown>:0
E/appfwk  ( 2202): InnerException was ArgumentNullException: Argument cannot be null.
E/appfwk  ( 2202): Parameter name: method
E/appfwk  ( 2202):        at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure, Boolean allowClo
00] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.Expression.CreateLambda (System.Type delegateType, System.Linq.Expressions.Expression body, System.String name, Boolean tailCall, System.Coll
ectModel.ReadOnlyCollection`1 parameters) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.Expression.Lambda (System.Linq.Expressions.Expression body, System.String name, Boolean tailCall, IEnumerable`1 parameters) [0x00000] in <fil
wn>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.Expression.Lambda (System.Linq.Expressions.Expression body, Boolean tailCall, IEnumerable`1 parameters) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.Expression.Lambda (System.Linq.Expressions.Expression body, System.Linq.Expressions.ParameterExpression[] parameters) [0x00000] in <filename

E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.PartialEvaulator+<EvaluateIndependentSubtrees>c__AnonStorey5.<>m__7 (System.Linq.Expressions.Expression expr, System.Func`2 rec
0] in <filename unknown>:0
E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.VisitorHelper.Visit (System.Linq.Expressions.Expression expression) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.ExpressionVisitor.VisitBinary (System.Linq.Expressions.BinaryExpression node) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.BinaryExpression.Accept (System.Linq.Expressions.ExpressionVisitor visitor) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expressions.ExpressionVisitor.Visit (System.Linq.Expressions.Expression node) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.VisitorHelper.<Visit>__BaseCallProxy0 (System.Linq.Expressions.Expression node) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.VisitorHelper.<Visit>m__8 (System.Linq.Expressions.Expression e) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.PartialEvaulator+<EvaluateIndependentSubtrees>c__AnonStorey5.<>m__7 (System.Linq.Expressions.Expression expr, System.Func`2 rec
0] in <filename unknown>:0
E/appfwk  ( 2202):   at Microsoft.WindowsAzure.MobileServices.VisitorHelper.Visit (System.Linq.Expressions.Expression expression) [0x00000] in <filename unknown>:0
E/appfwk  ( 2202):   at System.Linq.Expre
E/appfwk  ( 2219):   0.00 Setup: PlatformServices start
E/appfwk(2202):0.23使用附加功能从Intent加载新的ViewModel
E/appfwk(2202):0.36创建FirstViewModel类型的viewModel时出现问题-问题TargetInvocationException:调用的目标已引发异常。
E/appfwk(2202):位于System.Reflection.MonoCMethod.InternalInvoke(System.Object obj,System.Object[]参数)[0x00000]中:0
E/appfwk(2202):位于System.Reflection.MonoCMethod.DoInvoke(System.Object obj,BindingFlags invokeAttr,System.Reflection.Binder Binder,System.Object[]参数,System.Globalization
o区域性)[0x00000]位于:0
E/appfwk(2202):位于System.Reflection.MonoCMethod.Invoke(BindingFlags invokeAttr,System.Reflection.Binder Binder,System.Object[]参数,System.Globalization.CultureInfo区域性)
年:0
E/appfwk(2202):在:0中的System.Reflection.ConstructorInfo.Invoke(System.Object[]参数)[0x00000]处
E/appfwk(2202):在cirrial.CrossCore.IoC.MvxSimpleIoCContainer.IoCConstruct(System.Type类型)[0x00000]中:0
E/appfwk(2202):在cirrial.CrossCore.Mvx.IocConstruct(System.Type t)[0x00000]中:0
E/appfwk(2202):位于cirriary.MvvmCross.ViewModels.MvxDefaultViewModelLocator.TryLoad(System.Type viewModelType、IMvxBundle参数值、IMvxBundle保存状态、IMvxViewModel和viewMo
00]英寸:0
E/appfwk(2202):InnerException是ArgumentNullException:参数不能为null。
E/appfwk(2202):参数名称:方法
E/appfwk(2202):位于System.Delegate.CreateDelegate(System.Type,System.Object firstArgument,System.Reflection.MethodInfo方法,Boolean throwOnBindFailure,Boolean allowClo
00]英寸:0
E/appfwk(2202):位于System.Delegate.CreateDelegate(System.Type类型,System.Reflection.MethodInfo方法,布尔throwOnBindFailure)[0x00000]中:0
E/appfwk(2202):在:0中的System.Delegate.CreateDelegate(System.Type类型,System.Reflection.MethodInfo方法)[0x00000]处
E/appfwk(2202):位于System.Linq.Expressions.Expression.CreateLambda(System.Type delegateType,System.Linq.Expressions.Expression body,System.String name,Boolean tailCall,System.Coll
0中的ectModel.ReadOnlyCollection`1参数)[0x00000]
E/appfwk(2202):位于System.Linq.Expressions.Expression.Lambda(System.Linq.Expressions.Expression正文,System.String名称,布尔尾调用,IEnumerable`1参数)[0x00000]in:0
E/appfwk(2202):位于System.Linq.Expressions.Expression.Lambda(System.Linq.Expressions.Expression正文,布尔尾调用,IEnumerable`1参数)[0x00000]中:0

E/appfwk(2202):在中的System.Linq.Expressions.Expression.Lambda(System.Linq.Expressions.Expression-body,System.Linq.Expressions.ParameterExpression[]parameters)[0x00000]中,只需将保留属性添加到您希望链接器不接触的类型/成员

public class Example {
    [Android.Runtime.Preserve]
    public Example ()
    {
    }
}

[Android.Runtime.Preserve(AllMembers=true)]
class Example {
    // Compiler provides default constructor...
}
指南(iOS和Android都有一个)都很好

编辑:阿列克西说的是正确的

向项目中添加一个类似于下面的XML文件,并将其构建操作设置为LinkDescription

<linker>
        <assembly fullname="My.Own.Assembly">
                <type fullname="Foo" preserve="fields" />
                        <method name=".ctor" />
                </type>
                <type fullname="Bar" />
                        <method signature="System.Void .ctor(System.String)" />
                        <field signature="System.String _blah" />
                </type>
        </assembly>
</linker>

如果我想在我的.Core类库中保留一些东西,该类库是一个可移植的类库,不包含任何android程序集。我无法访问[preserve]属性。请阅读“自定义链接”下的内容。