【问题标题】:Xamarin.Forms (droid build) MultiDex option causes app to crashXamarin.Forms (droid build) MultiDex 选项导致应用程序崩溃
【发布时间】:2017-05-28 01:51:06
【问题描述】:

我们的 Xamarin.Forms 项目已扩展为包含方法计数 >= 64k 的库,因此我们必须启用 MultiDex。 启用它后,droid 构建在部署到我的 android 模拟器后立即崩溃。

我在网上搜索过,我发现的唯一解决方案是卸载设备上的所有 xamarin.android 和 mono 运行时,我已经这样做了。这并没有解决它。

应用崩溃后我的设备日志显示以下错误:

01-10 08:38:44.593 5" KitKat (4.4) XXHDPI Phone Error 1966 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:44.593 5" KitKat (4.4) XXHDPI Phone Error 1966 android.os.Debug failed to load memtrack module: -2
01-10 08:38:44.565 5" KitKat (4.4) XXHDPI Phone Error 1966 cutils-trace Error opening trace file: No such file or directory (2)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.ActivityThread.main(ActivityThread.java:5001)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime Caused by: java.lang.ClassNotFoundException: Didn't find class "md5ca27074e405277e6c40e6a6588077a84.MainApplication" on path: DexPathList[[zip file "/data/app/com.cii.patrollive-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.cii.patrollive-1, /system/lib]]
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.os.Looper.loop(Looper.java:136)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime ... 11 more
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.ActivityThread.access$1500(ActivityThread.java:135)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.LoadedApk.makeApplication(LoadedApk.java:507)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at java.lang.reflect.Method.invoke(Method.java:515)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.os.Handler.dispatchMessage(Handler.java:102)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.Instrumentation.newApplication(Instrumentation.java:975)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime Process: com.cii.patrollive, PID: 1948
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4301)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime java.lang.RuntimeException: Unable to instantiate application md5ca27074e405277e6c40e6a6588077a84.MainApplication: java.lang.ClassNotFoundException: Didn't find class "md5ca27074e405277e6c40e6a6588077a84.MainApplication" on path: DexPathList[[zip file "/data/app/com.cii.patrollive-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.cii.patrollive-1, /system/lib]]
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at java.lang.reflect.Method.invokeNative(Native Method)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime FATAL EXCEPTION: main
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at dalvik.system.NativeStart.main(Native Method)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at android.app.LoadedApk.makeApplication(LoadedApk.java:502)
01-10 08:38:39.201 5" KitKat (4.4) XXHDPI Phone Error 1948 AndroidRuntime at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
01-10 08:38:38.917 5" KitKat (4.4) XXHDPI Phone Error 1938 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:38.917 5" KitKat (4.4) XXHDPI Phone Error 1938 android.os.Debug failed to load memtrack module: -2
01-10 08:38:38.845 5" KitKat (4.4) XXHDPI Phone Error 1938 cutils-trace Error opening trace file: No such file or directory (2)
01-10 08:38:38.541 5" KitKat (4.4) XXHDPI Phone Error 1926 cutils-trace Error opening trace file: No such file or directory (2)
01-10 08:38:38.469 5" KitKat (4.4) XXHDPI Phone Error 1926 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:38.469 5" KitKat (4.4) XXHDPI Phone Error 1926 android.os.Debug failed to load memtrack module: -2
01-10 08:38:34.757 5" KitKat (4.4) XXHDPI Phone Error 1896 android.os.Debug failed to load memtrack module: -2
01-10 08:38:34.757 5" KitKat (4.4) XXHDPI Phone Error 1896 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:34.729 5" KitKat (4.4) XXHDPI Phone Error 1896 cutils-trace Error opening trace file: No such file or directory (2)
01-10 08:38:34.445 5" KitKat (4.4) XXHDPI Phone Error 1880 android.os.Debug failed to load memtrack module: -2
01-10 08:38:34.445 5" KitKat (4.4) XXHDPI Phone Error 1880 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:34.421 5" KitKat (4.4) XXHDPI Phone Error 1880 cutils-trace Error opening trace file: No such file or directory (2)
01-10 08:38:34.145 5" KitKat (4.4) XXHDPI Phone Error 1866 android.os.Debug failed to load memtrack module: -2
01-10 08:38:34.145 5" KitKat (4.4) XXHDPI Phone Error 1866 memtrack Couldn't load memtrack module (No such file or directory)
01-10 08:38:34.113 5" KitKat (4.4) XXHDPI Phone Error 1866 cutils-trace Error opening trace file: No such file or directory (2)

【问题讨论】:

    标签: c# android xamarin xamarin.android xamarin.forms


    【解决方案1】:

    您的应用程序崩溃的原因可能有两个:

    1. 您没有MainApplication 的 ACW 名称,因此会为您生成一个。

    Android Callable Wrappers 将基于正在导出的类型的程序集限定名称的 MD5SUM。

    在您发布的示例中,我们看到md5ca27074e405277e6c40e6a6588077a84.MainApplication。因此,当我们在dexlist 上查找MainApplication 时,我们期望得到确切的名称。因此,将名称更改为更理想的名称(例如包名称)会有所帮助。

    https://developer.xamarin.com/releases/android/xamarin.android_5/xamarin.android_5.1/#Android_Callable_Wrapper_Naming

    1. MainApplication 类未放在主classes.dex 列表中,因此在启动时,它会尝试查找该类但无法找到它,因为它位于辅助classes2.dex 文件中。在初始化Multidex 之前,不会加载辅助.dex 文件。您可以在此处阅读有关 Multidex 的更多信息:

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

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

    【讨论】:

    • 尽管向 MainApplication 类添加名称解决了问题,但今天问题再次出现,名称仍然定义。第二次修复的解决方案是什么?如您所述,如何将缺少的类添加到 classes.dex 中?
    • 查看我关于使用MultidexMainDexList的第二篇博文。
    • 我已经读过,但我不清楚需要做什么。 Create a new Text file multidex.keep in your main application root. 这是否意味着 android 项目的根?还是包含每个平台项目的解决方案根?它还指示Set the Build Action to MultiDexMainDexList 我不知道设置构建操作是什么意思?
    • 它将位于您的 Android 项目的根目录中。构建操作将是MultiDexMainDexList,您将手动将所需的所有内容包含在主 dex 列表中。理想情况下,您可以在 classes.dex 中获取默认生成的内容,然后向其中添加其他类。
    • Jon 我不知道“构建操作将是 MultiDexMainDexList 我不知道构建操作是什么。您是在谈论启用 multidex 吗?这是构建参数的名称吗? ? 另外,生成的classes.dex(in output bin/Debug) 已经包含错误消息报告的类丢失。这是否表明这不是正确的修复?
    【解决方案2】:

    我发现了一个解决方案。 在 droid 项目中的 MainActivity 上指定 Name 属性解决了它。 (在此之前我没有指定名称)。 (也需要清理和重建)

    我不知道为什么你需要在添加 MultiDex 选项后指定活动名称,我猜这是一个 Xamarin 错误。

    [Activity(    ...    , Name= "com.cii.patrolliveapp",    ...    ]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        ...
    }
    

    编辑: Jon 在另一个答案中向我指出了第二个问题。这是第一个 dex 类列表为空的 windows 上的 android sdk 上的一个错误。

    解决方法是打开您的android-sdk\build-tools\<version>\mainDexClasses.bat 文件(其中版本是您安装的最高版本,这是默认设置)并更改:

    if DEFINED output goto redirect  
    call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%"  
    goto afterClassReferenceListBuilder  
    :redirect
    call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%" 1>"%output%"  
    :afterClassReferenceListBuilder
    

    到这里:

    SET params=%params:'=%  
    if DEFINED output goto redirect  
    call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params%  
    goto afterClassReferenceListBuilder  
    :redirect
    call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params% 1>"%output%"  
    :afterClassReferenceListBuilder
    

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2021-11-27
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多