Xamarin.Android MultiDex没有使用< 21设备

时间:2017-09-04 08:42:36

标签: android xamarin.android mono multidex

这似乎是一个近期的问题,老实说我不确定哪个问题是真正的问题。上周,在更新VS2017和Android支持库之后,我开始收到错误" java.exe已退出代码2"。在搜索之后,似乎达成共识是启用MultiDex。所以我做到了,它在新款手机上运行良好。但是当我尝试在KitKat手机上编译时,我开始缺少类异常(但只有当我使用Android Monitor登录时,VS中没有例外)。

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

我生成了一个APK,以便用classyshark进行检查。我发现了一些有趣的东西。我的方法总数大约是30K,那么如果限制为65K,为什么甚至需要multidex呢?而且,我注意到mono/MonoPackageManager位于classes2.dex,尽管它位于我的multidex.keep文件中。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

这是我的任何实际应用程序类的补充,它抱怨在运行时没有找到。这解决了我的< 21问题(特别是KitKat(19))。

构建系统仍然会创建一个multidex.keep文件,但除了我的自定义文件之外,这个文件似乎对我有用。

答案 1 :(得分:0)

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

我的项目根目录中的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版本。