这似乎是一个近期的问题,老实说我不确定哪个问题是真正的问题。上周,在更新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),结果相同。我认为添加新行修复了这个问题很奇怪,但生成的文件没有新行。答案 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版本。