VisualStudio 2015中的Xamarin MultiDex

时间:2017-06-10 14:06:34

标签: android xamarin mvvmcross multidex

大家好,我走到了尽头!

使用VisualStudio 2015,Xamarin和MvvmCross开发PCL应用程序。 Android应用超过65K限制。我需要使用Multidex!

为实施这些指南

  • MultiDex的启用复选框
  • 扩展MultiDexApplication类

一般注意事项

调试模式

MinSdk:21

TargetSdk:25

BuildTools:23.0.3

Jdk 1.8.0_121

Xamarin.Android 7.3

结果

"java.exe" exited with code 2.  C:\Program Files (x86)\MSBuild\Xamarin    \Android\Xamarin.Android.Common.targets   1965

<!-- Compile java code to dalvik -->
  <CompileToDalvik 
    DxJarPath="$(DxJarPath)"
    JavaToolPath="$(JavaToolPath)"
    JavaMaximumHeapSize="$(JavaMaximumHeapSize)"
    JavaOptions="$(JavaOptions)"
    ClassesOutputDirectory="$(IntermediateOutputPath)android\bin\classes"
    ToolPath="$(DxToolPath)"
    ToolExe="$(DxToolExe)"
    UseDx="$(UseDx)"
    MultiDexEnabled="$(AndroidEnableMultiDex)"
    MultiDexMainDexListFile="$(_AndroidMainDexListFile)"
    JavaLibrariesToCompile="@(_JavaLibrariesToCompileForAppDx)"
OptionalObfuscatedJarFile="$(IntermediateOutputPath)proguard\__proguard_output__.jar"
/>

编译过程中发生错误。

我咨询过这些来源:

https://developer.android.com/studio/build/multidex.html

http://www.jon-douglas.com/2016/09/05/xamarin-android-multidex/

http://www.jon-douglas.com/2016/09/23/xamarin-android-multidex-keep/

https://przemekraciborski.eu/

https://forums.xamarin.com/discussion/64234/multi-dex-app-with-a-custom-application-class-that-runs-on-pre-lollipop

http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/

我也有ClassyShark.jar工具,但没有生成dex或apk文件来探索它。只存在mono.android.jar文件

enter image description here

我需要帮助。

非常感谢。

回答答案1和Luke Pothier的评论是结果:

设置输出详细程度=诊断

案例1:

使用Android Sdk位置:随Visual Studio 2015安装的C:\ Program Files(x86)\ Android \ android-sdk。

4>_CompileToDalvikWithDx:
4>  Creating directory "obj\Debug\proguard".
4>  C:\Program Files\Java\jdk1.8.0_121\\bin\java.exe -Xmx1G -jar "C:\Program Files (x86)\Android\android-sdk\build-tools\25.0.3\\lib\dx.jar" --no-strict --dex --output= ... 
4>  trouble writing output: Too many field references: 68102; max is 65536.
4>  You may try using --multi-dex option.
4>  References by package:
(list of references by packages)
4>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1965,3): error MSB6006: "java.exe" exited with code 2.

案例2:

使用Android Sdk位置:c:\ android \ sdk,安装了Android Studio的最新proguard版本5.3.3。

4>_CompileToDalvikWithDx:
4>  Creating directory "obj\Debug\proguard".
4>  C:\Program Files\Java\jdk1.8.0_121\\bin\java.exe -Xmx1G -jar C:\Android\sdk\build-tools\25.0.0\\lib\dx.jar --no-strict --dex --output=
4>  trouble writing output: Too many field references: 68102; max is 65536.
4>  You may try using --multi-dex option.
4>  References by package:
(list of references by packages)
4>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1965,3): error MSB6006: "java.exe" exited with code 2.

2 个答案:

答案 0 :(得分:1)

这可能是由Xamarin和ProGuard之间的问题引起的,其解决方法详细here。实质上,您需要使用SourceForge(当前的v5.3.3)中的最新文件替换Android SDK目录中的proguard.jar文件。

编辑:根据编辑中的错误消息,在编译期间不会传递--multi-dex选项。我会检查您的Android .csproj,以确保所有构建配置的<AndroidEnableMultiDex>选项都设置为True。如果这没有帮助,您可能需要在某处上传可重现的样本。

编辑2:根据评论,您的Android SDK位置需要位于路径不包含空格的位置。 Program Files并不好。我个人把我放在C:\Android\android-sdk

答案 1 :(得分:0)

调整android sdk的路径后,删除空间并在Droid平台的项目文件中设置所有配置中的属性AndroidEnableMultiDex(出现AndroidEnableMultipleDex)为true,我能够无错误地编译。此外,我已经能够检查生成的dex文件的内容,都引用了Mvvmcross

当我执行应用程序时,它会显示启动视图(ok !!!),但是,处理具有绑定viewmodel的视图(活动)时会发生异常。现在,viewmodel具有null值。 (直到必须激活multidex的那一刻,应用程序执行时没有任何反应)

我现在的挑战是要知道Mvvmcross的所有引用是否应该在主要的dex中,还是由于我忽略了另一个问题?

提前感谢他到@LukePothier的时间。

我的自我回应:

编译并生成dex类后:

  • 使用dex2jar&amp; jd-gui工具跟随Jon Douglas&#39;提示documentation

  • 要非常耐心和坚持不懈。

  • 如果您可以自行删除,请删除无用的代码和插件。

我已经运行了应用程序!!!