【问题标题】:Android App is too large and Linking disables functionalityAndroid 应用程序太大,链接禁用功能
【发布时间】:2013-03-14 20:50:47
【问题描述】:

我已经完成了我的应用程序,现在我正在尝试构建 .apk 并在我的手机上对其进行测试(无需调试,处于发布模式)。

将链接设置为“”一切正常。 这里的问题是,应用程序太大 - 它的 20MB 就是垃圾。


我读过那篇关于链接的文章: Click Here

所以我尝试了“Sdk Assemblies Only”和“Sdk and User Assemblies”。第二个选项(Both Assemblies)直接失败,我什至看不到我的应用程序的第一个屏幕(登录)。

链接设置为“Sdk Assemblies Only”我能够来到第一个屏幕(登录屏幕)。该应用程序也 6.73MB 更好,更符合条件。

我现在面临的问题是,当我点击第一个屏幕上的“登录”按钮时,什么都没有发生(通常它会将我重定向到下一个活动)。

按钮绑定到命令:

public IMvxCommand LoginCommand
{
    get
    {
         return new MvxRelayCommand(DoLogin);
    }
}

private void DoLogin()
{
     //Do Stuff
}

在 DoLogin() 中设置断点 - 表明它永远不会进入。

好吧,我该如何解决这个问题?好像 mvvmcross 的功能因为某种原因被禁用了?

我的主要目标是减小应用程序的大小。


如果重要,请在此处查看 .csproj 中的必要部分

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
<AndroidLinkMode>SdkOnly</AndroidLinkMode>
<AndroidLinkSkip />
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>

【问题讨论】:

标签: c# xamarin.android release mvvmcross


【解决方案1】:

对于 MvvmCross,我一般只使用SDK Assemblies

然后解决方法链接器因 MvvmCross 失败(以及一般 MonoTouch/MonoDroid 问题)然后我添加 LinkerPleaseInclude 类型文件来欺骗链接器。

一个示例文件是:

public class LinkerIncludePlease
{
    private void IncludeClick(View view)
    {
        view.Click += (s, e) => { };
    }

    private void IncludeVisibility(View view)
    {
        view.Visibility = view.Visibility + 1;
    }

    private void IncludeRelativeLayout(RelativeLayout relative)
    {
        relative.Visibility = ViewStates.Visible;
    }
}

来自:https://github.com/slodge/MvvmCross/blob/vnext/Sample%20-%20TwitterSearch/TwitterSearch.UI.Droid/LinkerIncludePlease.cs

不得不这样做很烦人……但这不会花很长时间 - 大多数应用实际上并没有绑定到许多不同的属性/事件。

【讨论】:

    【解决方案2】:

    我将 progressBar 包含方法更改为

        public void Include(ProgressBar progressBar)
        {
            progressBar.Visibility = progressBar.Visibility;
        }
    

    它奏效了。我删除了所有其他人,他们都开始工作。我假设这是有效的,因为它正在测试 ProgressBar Visibility 属性的 getter 和 setter。

    如果这不是这个工作的正确原因,有人可以添加评论,所以我们都可以理解未来如何解决这些问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多