Visual Studio 2015 中的 Xamarin MultiDex
Xamarin MultiDex in VisualStudio 2015
大家好,我在死胡同里!
使用 VisualStudio 2015、Xamarin 和 MvvmCross 开发 PCL 应用程序。
Android 应用超出了 65K 的限制。我需要使用 Multidex!
为了实现它,我遵循了这些指南:
- MultiDex 的启用复选框
- 扩展的 MultiDexApplication class
一般注意事项:
调试模式
MinSdk: 21
TargetSdk: 25
构建工具:23.0.3
Jdk1.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/"
"http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/"
我也有 ClassyShark.jar 工具,但是没有生成 dex 或 apk 文件来探索它。只有 mono.android.jar 文件存在
拜托,我需要帮助。
非常感谢。
回复答案1和Luke Pothier的评论是结果:
设置输出详细程度 = 诊断
案例 1:
使用 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.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.
案例二:
使用 Android Sdk 位置:c:\android\sdk,最后一个 Proguard 版本 5.3.3 安装在 Android Studio 中。
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.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.
这可能是由 Xamarin 和 ProGuard 之间的问题引起的,详细的修复程序 . Essentially, you need to replace the proguard.jar
file that is in your Android SDK directory with the latest one from SourceForge(当前为 v5.3.3)。
编辑:根据您编辑中的错误消息,编译期间未传递 --multi-dex 选项。我会检查您的 Android .csproj
以确保所有构建配置的 <AndroidEnableMultiDex>
选项都设置为 True
。如果这没有帮助,您可能需要在某处上传可重现的示例。
编辑 2:根据评论,您的 Android SDK 位置需要位于路径不包含空格的位置。 Program Files
不行。我个人把我的放在 C:\Android\android-sdk
。
调整android sdk的路径后,在Droid平台的项目文件中去掉空格并设置 属性 AndroidEnableMultiDex 在所有配置中(出现AndroidEnableMultipleDex)为true,我能够正确编译。此外,我已经能够检查生成的 dex 文件的内容,两者都引用了 Mvvmcross。
当我执行应用程序时,它显示启动视图(好的!!!),但是,在处理具有绑定视图模型的视图 (activity) 时发生异常。现在,视图模型具有空值。 (直到必须激活 multidex 的那一刻,应用程序执行没有任何事件)
我现在的挑战是知道是否所有对Mvvmcross的引用都应该在主dex中,还是由于我忽略的另一个问题?
提前感谢他抽出时间来@LukePothier。
我自己的回答:
编译生成dex后类:
按照 Jon Douglas 在 http://www.jon-douglas.com/2016/09/23/xamarin-android-multidex-keep/.
中的提示使用 dex2jar 和 jd-gui 工具
要非常有耐心和坚持。
如果你能自己做就去掉innesesary代码和插件。
我已经有了应用程序运行 !!!
大家好,我在死胡同里!
使用 VisualStudio 2015、Xamarin 和 MvvmCross 开发 PCL 应用程序。 Android 应用超出了 65K 的限制。我需要使用 Multidex!
为了实现它,我遵循了这些指南:
- MultiDex 的启用复选框
- 扩展的 MultiDexApplication class
一般注意事项:
调试模式
MinSdk: 21
TargetSdk: 25
构建工具:23.0.3
Jdk1.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/"
"http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/"
我也有 ClassyShark.jar 工具,但是没有生成 dex 或 apk 文件来探索它。只有 mono.android.jar 文件存在
拜托,我需要帮助。
非常感谢。
回复答案1和Luke Pothier的评论是结果:
设置输出详细程度 = 诊断
案例 1:
使用 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.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.
案例二:
使用 Android Sdk 位置:c:\android\sdk,最后一个 Proguard 版本 5.3.3 安装在 Android Studio 中。
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.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.
这可能是由 Xamarin 和 ProGuard 之间的问题引起的,详细的修复程序 proguard.jar
file that is in your Android SDK directory with the latest one from SourceForge(当前为 v5.3.3)。
编辑:根据您编辑中的错误消息,编译期间未传递 --multi-dex 选项。我会检查您的 Android .csproj
以确保所有构建配置的 <AndroidEnableMultiDex>
选项都设置为 True
。如果这没有帮助,您可能需要在某处上传可重现的示例。
编辑 2:根据评论,您的 Android SDK 位置需要位于路径不包含空格的位置。 Program Files
不行。我个人把我的放在 C:\Android\android-sdk
。
调整android sdk的路径后,在Droid平台的项目文件中去掉空格并设置 属性 AndroidEnableMultiDex 在所有配置中(出现AndroidEnableMultipleDex)为true,我能够正确编译。此外,我已经能够检查生成的 dex 文件的内容,两者都引用了 Mvvmcross。
当我执行应用程序时,它显示启动视图(好的!!!),但是,在处理具有绑定视图模型的视图 (activity) 时发生异常。现在,视图模型具有空值。 (直到必须激活 multidex 的那一刻,应用程序执行没有任何事件)
我现在的挑战是知道是否所有对Mvvmcross的引用都应该在主dex中,还是由于我忽略的另一个问题?
提前感谢他抽出时间来@LukePothier。
我自己的回答:
编译生成dex后类:
按照 Jon Douglas 在 http://www.jon-douglas.com/2016/09/23/xamarin-android-multidex-keep/.
中的提示使用 dex2jar 和 jd-gui 工具
要非常有耐心和坚持。
如果你能自己做就去掉innesesary代码和插件。