【问题标题】:Xamain.Forms (Android) - Signed APK - App Crash On Version 5.1 (API 22)Xamarin.Forms (Android) - 签名的 APK - 应用程序崩溃版本 5.1 (API 22)
【发布时间】:2018-06-20 03:18:52
【问题描述】:

我正在创建一个简单的 Android 应用,其中包含简单的控件/视图,例如 Label, Entry and Buttons

  • 目标框架:Android 8.1
  • 目标安卓版本:安卓8.1
  • 最低 Android 版本:Android 4.4

存档并生成APK文件后,我成功地将它安装在我的逍遥模拟器(Android版本:5.1)中。但是当我试图打开它时,应用程序崩溃了。

这是我从设备日志工具得到的错误:

System.NullReferenceException: Object reference not set to an instance of an object
  at Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage (Xamarin.Forms.Page page) [0x0006f] in <99988d4ab8d144898ef5bc7586876d75>:0 
  at Xamarin.Forms.Platform.Android.FormsAppCompatActivity.SetMainPage () [0x0000c] in <99988d4ab8d144898ef5bc7586876d75>:0 
  at Xamarin.Forms.Platform.Android.FormsAppCompatActivity.LoadApplication (Xamarin.Forms.Application application) [0x0026f] in <99988d4ab8d144898ef5bc7586876d75>:0 
  at SampleApp.Droid.MainActivity.OnCreate (Android.OS.Bundle bundle) [0x00028] in <eaa39f9ef27d400ebfed424165f990c2>:0 
  at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in <818821ea7e204c78a45bc29cdc69e744>:0 
  at (wrapper dynamic-method) System.Object.fe8f1617-954f-4716-901a-433b7f8b44bf(intptr,intptr,intptr)

我怀疑这是Xamarin.Forms.Platform.Android.FormsAppCompatActivity 问题。因为当我将 MainActivity 父类更改为 Xamarin.Forms.Platform.Android.FormsApplicationActivity 它运行没有错误

但是如何在不切换到 FormsApplicationActivity 的情况下修复此错误??

编辑:当我在“打包属性”中禁用 ProGuard 时,应用程序运行顺畅。 (为什么?)

【问题讨论】:

  • 在使用FormsAppCompatActivity 时,您是否创建了正确的主题/样式,在您的Xamarin.Android 项目中分配了该主题,设置了Tabbar.axml、Toolbar.axml 布局......
  • @SushiHangover 我已经在 AndroidManifest.xml 中编辑了应用程序元素(添加了android:theme="@style/MainTheme")。 Tabbar 和 Toolbar.axml 主题是"@style/ThemeOverlay.AppCompat.Dark.ActionBar"。顺便说一句,当 ProGuard 被禁用时,应用程序运行没有问题。
  • ProGuard is disable the app... 哦.....这需要在您的问题中,logcat 中看到的错误是什么,您是否有自定义的 proguard 配置?
  • @SushiHangover 我的意思是当我在“打包属性”中禁用 ProGuard 时,应用程序运行没有问题。 logcat 和设备日志(来自 Visual Studio)是否不同?
  • 你有自定义的 proguard 配置吗?什么版本的表格? 3.0 或 2.5

标签: android xamarin xamarin.forms xamarin.android


【解决方案1】:

这是 Forms 3.0(至少版本 3.0.0.561731)的错误/问题,因为 Java android.support.v7.widget 命名空间中的某些内容正在被剥离,并且 Xamarin 没有生成正确的 proguard 配置来自动防止问题.

我不确定哪些实际的 Java 类和/或字段是导致问题的原因,但您可以这样做来解决它:

在您的Xamarin.Android 应用程序项目中创建一个基于文本的proguard 配置文件,并将其分配为ProguardConfiguration 的构建类型,即:

<ItemGroup>
   <ProguardConfiguration Include="Proguard.txt" />
</ItemGroup>

并包括以下内容:

# Proguard issue in Forms' version 3.0.0.561731
# MonoDroid: System.NullReferenceException: Object reference not set to an instance of an object
# MonoDroid:   at Xamarin.Forms.Platform.Android.FormsAppCompatActivity.InternalSetPage (Xamarin.Forms.Page page) [0x0006f] in <09e4bdebfa024bfd9231e2318fd7c3d7>:0
# MonoDroid:   at Xamarin.Forms.Platform.Android.FormsAppCompatActivity.SetMainPage () [0x0000c] in <09e4bdebfa024bfd9231e2318fd7c3d7>:0

-keep public class android.support.v7.widget.** { *; }

从设备/模拟器中删除应用程序并执行全部清理/全部重建并重新部署应用程序,这应该可以解决问题。

【讨论】:

  • 当我在清理后尝试重建时会产生构建错误:“java.exe”以代码 1 退出 - 我将保持启用“ProGuard”选项对吗?
  • @Middleman 是的,请保持 proguard 选项处于启用状态... java 问题很可能是您使用 VS 创建 txt 文件,因为它最终将作为 UTF-8 w/BOM 文件,它不能有 BOM:stackoverflow.com/a/38745003/4984832
  • 谢谢!现在它就像一个魅力:) 据我所知,自定义 Proguard 可以防止 `android.support.v7.widget 缩小,这就是它解决默认 proguard 配置混乱的原因?
  • @Middleman 正确,我认为它只是该 Java 命名空间中的一个(或者可能是几个)被剥离导致问题但包括所有 **** 小部件的类。 ** 类解决了它。不幸的是,它发生在 MonoDroid/JNI 应用程序的引导过程中,并且不报告实际的 Java 类...通常之后你会得到一个完整的“Java 类未找到异常” > 当 Proguard 删除了你实际使用的东西时,引导程序就会发生,并且它使得将该类添加到 proguard cfg 文件中变得相当容易,因为你有完整的 java 名称
猜你喜欢
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多