Xamarin.Forms将程序集捆绑为本机代码

时间:2017-11-21 14:13:47

标签: xamarin xamarin.forms xamarin.android

我用Xamarin.Forms创建了一个Android应用程序。我使用“SKD和用户程序集”来链接和使用类的一些虚拟用法(来欺骗链接器)并使用

[Android.Runtime.Preserve(AllMembers = true)] 

注释我可以毫无问题地运行我的应用程序,并将apk大小从大约50 MB减少到19 MB。但是19 MB仍然太多了!所以我使用“Bundle assembly into native code”,build和archive就可以了,我的apk大小现在大约是6 MB。但是当我打开应用程序时,它立即关闭而没有任何错误!

1 个答案:

答案 0 :(得分:0)

如果您遗漏了.apk,请检查libmonodroid_bundle_app.so的内容,如果有,则有两种基本可能性。

  • 您的Visual Studio(Mac或Windows)安装不是有效的企业许可证,也不是社区/专业许可证,并且mkbundle步骤未执行

     IMHO: This should always be an MSBuild error/failure if 
       BundleAssemblies is true in your `.csproj` but you do not 
       have the correct license but it is currently not.
    
  • MSBuild在包含CIL程序集的共享库的Android NDK大楼失败。

这个问题出现在bugzilla上,并且在7.2.0版本中已经修复,但我已经看到它在7.5 / 8.x版本中重新出现。

此问题可能是无声失败,因此MSBuild无法看到,因此生成的APK没有libmonodroid_bundle_app.so文件。

  • 审核问题48678

  • 使用cmd-line中的MSBuild在Visual Studio IDE外部进行测试。将/t:PackageForAndroid传递给发布配置,看看您是否获得了干净的_BuildApkEmbed任务:

清洁/工作:

    _BuildApkEmbed:
      [mkbundle stderr]
     [cc stderr]
     [LD] X:\Docker\android-sdk-windows\ndk-bundle\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm
      -linux-androideabi-ld.exe --shared obj\Release\bundles\armeabi-v7a\temp.o obj\Release\bundles\armeabi-v7a\assemblies.
      o -o obj\Release\bundles\armeabi-v7a\libmonodroid_bundle_app.so -L X:\Docker\android-sdk-windows\ndk-bundle\platfo
    rms\android-14\arch-arm\usr\lib -lc -lm -ldl -llog -lz
      [ld stderr]

分拆/错误:

Platform header files for target Arm and API Level XX was not found. Expected path .....

如果是这种情况,请(重新)安装Android NDK:

最后一次失败,与您的问题无关,但可能与其他问题无关。

在归档过程中完全崩溃并重新启动Visual Studio 2017。

如果您在Android NDK安装中缺少文件,则安装损坏或版本错误。此外,谷歌的某些版本没有任何包含目录(?!?!),但确实有arch lib目录,没有头文件,Xamarin.Android MSBuild进程挂起VS和导致崩溃/重启。