【问题标题】:Xamarin.Android MultiDex not working on <21 devicesXamarin.Android MultiDex 不适用于 <21 台设备
【发布时间】:2018-02-12 11:20:11
【问题描述】:

这似乎是最近才出现的问题,老实说,我不确定哪个问题是真正的问题。上周,在更新 VS2017 和 Android 支持库后,我开始收到错误“java.exe has exited with code 2”。经过搜索,似乎共识是启用 MultiDex。所以我这样做了,它在较新的手机上运行良好。但是当我尝试在 KitKat 手机上编译时,我开始出现丢失类异常(但仅当我使用 Android Monitor 登录时,VS 中没有异常)。

我关注this link 关于自定义应用程序类。我正在使用正确的 bat 文件和正确的自定义类。在 21+ 上一切看起来都还不错,但旧设备仍然报告 mono.MonoPackageManager 丢失。 当我查看调试文件夹中生成的multidex.keep 时,mono/MonoPackageManager.class 肯定在该文件中。所以我真的不知道。

我生成了一个 APK 以便使用 classyshark 对其进行检查。我在那里发现了一些有趣的东西。我的方法总数在 30K 左右,那么如果限制为 65K,为什么还要使用 multidex?而且,我注意到mono/MonoPackageManagerclasses2.dex 中,尽管它在我的multidex.keep 文件中。

我是否遗漏了一些明显的东西,或者最近 Xamarin.Android 中是否存在一些重大错误?

编辑:取得了进展?忽略我的项目甚至不需要 multidex 的事实,我注意到生成的 multidex.keep 文件只是一行,没有空格或任何东西。当我修改此文件以将每个类放在新行上,然后使用构建操作 MainDexMainDexList 添加该文件时,一切正常。我不需要重新添加它之前抱怨的类。我尝试了多个版本的 android 构建工具(特别是 25.0.2 和 26.0.1),结果相同。我觉得很奇怪,添加新行修复了问题,但是生成的文件没有新行。

【问题讨论】:

标签: android xamarin.android mono android-multidex


【解决方案1】:

我遇到了完全相同的问题,并通过在我的项目根文件夹中创建自定义 multidex.keep 文件并将以下内容添加到其中来解决它:

 mono/MonoPackageManager.class 
 mono/MonoRuntimeProvider.class
 mono/MonoPackageManager_Resources.class
 mono/android/app/NotifyTimeZoneChanges.class
 mono/android/app/ApplicationRegistration.class

这是对我抱怨在运行时找不到的任何实际应用程序类的补充。这解决了我的

构建系统仍然会创建一个 multidex.keep 文件,但这是我自定义文件的补充,所以它似乎对我有用。

【讨论】:

    【解决方案2】:

    对我来说是我在互联网上找到的多种解决方案的组合:

    我的项目根目录中的multidex.keep文件

    mono/android/app/ApplicationRegistration.class
    mono/android/app/NotifyTimeZoneChanges.class
    mono/MonoRuntimeProvider.class
    mono/MonoPackageManager.class
    mono/MonoPackageManager_Resources.class
    

    手动将 .csproj 添加到所有构建选项

     <AndroidEnableMultipleDex>true</AndroidEnableMultipleDex>
     <AndroidEnableMultiDex>true</AndroidEnableMultiDex>
    

    添加到 AndroidManifest.xml android-name 属性

    <application android:name="android.support.multidex.MultiDexApplication">.....</application
    

    在Android文件夹的MainApplication类中添加Register属性

    [Application]
    [Register("android/support/multidex/MultiDexApplication", DoNotGenerateAcw = true)]
    public class MainApplication : Application, Application.IActivityLifecycleCallbacks
    { ... }
    

    将名称添加到 MainActivity

     [Activity(Name = "xx.xxx.MainActivity")]
     public class MainActivity : 
     global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
     { ... }
    

    我正在使用 appcenter.ms 来构建 Andriod,因此更改 mainDexClasses.bat 不是好的解决方案。我试过THIS,但这破坏了所有其他Android版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多