【问题标题】:Xamarin MultiDex in VisualStudio 2015Visual Studio 2015 中的 Xamarin MultiDex
【发布时间】:2017-11-12 10:36:51
【问题描述】:

大家好,我陷入了死胡同!

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

为了实现它,我已经采取了这些指南

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

一般注意事项

调试模式

MinSdk:21

TargetSdk:25

构建工具: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 文件存在

我需要帮助。

非常感谢。


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

设置输出详细程度 = 诊断


案例一:

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

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.

【问题讨论】:

    标签: android xamarin mvvmcross android-multidex


    【解决方案1】:

    这很可能是由 Xamarin 和 ProGuard 之间的问题引起的,详细的修复方法是 here。本质上,您需要将 Android SDK 目录中的 proguard.jar 文件替换为来自 SourceForge 的最新文件(当前为 v5.3.3)。

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

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

    【讨论】:

    • 在此链接“developer.xamarin.com/releases/android/xamarin.android_7/…”中,说明使用 Xamarin.Android 7.3 不再需要更新。但是,之前知道这一点,已经将 Proguard 更新到了最新版本。
    • 好点 - 如果您从 Xamarin 将其与 Xamarin.Android >=v7.3 一起放入的默认位置使用 SDK,您不应该遇到 ProGuard 问题。如果您尝试将输出详细程度设置为诊断进行构建,错误看起来是否更详细?
    • 在所有配置中使用true出现java错误码2
    • Using 出现:Expecting class path separator ';'在参数编号 8 中的 '\Android\android-sdk\build-tools\25.0.3\lib\shrinkedAndroid.jar' 之前 ... D:\\CREATEMULTIDEXMAINDEXCLASSLIST
    • 您的 Android SDK 需要位于路径中没有空格的位置。所以Program Files 不好。
    【解决方案2】:

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

    当我执行应用程序时,它会显示启动视图(好的!!!),但是,在处理具有绑定视图模型的视图(活动)时会发生异常。现在,视图模型具有空值。 (直到必须激活 multidex 的那一刻,应用程序才被执行)

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

    提前感谢他抽出时间来@LukePothier。

    我的自我回应:

    编译生成dex类后:

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

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多