Xamain.Forms(Android)-签名APK-5.1版(API 22)上的应用程序崩溃

Xamain.Forms(Android)-签名APK-5.1版(API 22)上的应用程序崩溃,android,xamarin,xamarin.forms,xamarin.android,Android,Xamarin,Xamarin.forms,Xamarin.android,我正在创建一个简单的android应用程序,它包含简单的控件/视图,如标签、条目和按钮 目标框架:安卓8.1 目标Android版本:Android 8.1 最低安卓版本:安卓4.4 存档并生成APK文件后,我成功地将其安装在我的MEmu emulator(Android版本:5.1)中。但当我试图打开它时,应用程序崩溃了 这是我从设备日志工具中得到的错误: System.NullReferenceException: Object reference not set to an insta

我正在创建一个简单的android应用程序,它包含简单的控件/视图,如标签、条目和按钮

  • 目标框架:安卓8.1
  • 目标Android版本:Android 8.1
  • 最低安卓版本:安卓4.4
存档并生成APK文件后,我成功地将其安装在我的MEmu emulator(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)
System.NullReferenceException:对象引用未设置为对象的实例
在Xamarin.Forms.Platform.Android.formsappcompativity.InternalSetPage(Xamarin.Forms.Page)[0x0006f]中:0
位于:0中的Xamarin.Forms.Platform.Android.formsappcompativity.SetMainPage()[0x0000c]
位于:0中的Xamarin.Forms.Platform.Android.formsappcompativity.LoadApplication(Xamarin.Forms.Application应用程序)[0x0026f]
在0中的SampleApp.Droid.MainActivity.OnCreate(Android.OS.Bundle Bundle)[0x00028]处
在Android.App.Activity.n_OnCreate_Landroid_os_Bundle_(System.IntPtr jnienv,System.IntPtr native_此,System.IntPtr native_savedInstanceState)[0x0000f]in:0
at(包装器动态方法)系统对象fe8f1617-954f-4716-901a-433b7f8b44bf(intptr、intptr、intptr)
我怀疑这是Xamarin.Forms.Platform.Android.FormsAppCompatActivity的问题。因为当我将MainActivity父类更改为
Xamarin.Forms.Platform.Android.FormsApplicationActivity
时,它运行时没有错误

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


编辑:当我在“打包属性”中禁用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.** { *; }
#表格中的Proguard发行版本3.0.0.561731
#MonoDroid:System.NullReferenceException:对象引用未设置为对象的实例
#MonoDroid:位于Xamarin.Forms.Platform.Android.formsappcompativity.InternalSetPage(Xamarin.Forms.Page)[0x0006f]中:0
#MonoDroid:位于Xamarin.Forms.Platform.Android.formsappcompativity.SetMainPage()[0x0000c]中:0
-保持公共类android.support.v7.widget.*{*;}

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

使用
FormsAppCompatActivity
时,是否创建了正确的主题/样式,在
Xamarin.Android
项目中分配了该主题,请设置Tabbar.axml,Toolbar.axml layouts….@SushiHangover我已经在AndroidManifest.xml中编辑了应用程序元素(添加了
android:theme=“@style/MainTheme”
)。Tabbar和Toolbar.axml主题是
“@style/ThemeOverlay.AppCompat.Dark.ActionBar”
。顺便说一句,当ProGuard禁用时,应用程序将正常运行。
ProGuard禁用应用程序
。。。哦这需要在您的问题中,在
logcat
中看到的错误是什么?您是否有自定义的proguard配置?@sushingover我的意思是,当我在“打包属性”中禁用proguard时,应用程序运行没有问题。logcat和设备日志(来自visual studio)是否不同?是否有自定义的proguard配置?什么版本的表格?3.0或2.5当我尝试在清理后重建时,它会产生一个生成错误:“java.exe”退出,代码为1-我将保持“ProGuard”选项处于启用状态,对吗?@Middleman是,保持ProGuard选项处于启用状态。。。java问题很可能是您使用VS创建了txt文件,因为它最终将成为一个UTF-8 w/BOM文件,其中不能包含BOM:谢谢!现在它就像一个符咒:)据我所知,定制的Proguard阻止了“android.support.v7.widget”的收缩,这就是为什么它解决了默认的Proguard配置混乱的原因?@Middleman正确,我假设它只是一个类(或者可能是几个类)在导致问题的Java名称空间中,包含所有****小部件。**类可以解决问题。不幸的是,它发生在MonoDroid/JNI应用程序的引导过程中,并且没有报告实际的Java类。。。通常,当Proguard删除了您实际使用的东西时,在引导发生之后,您会得到一个完整的“Java类未找到异常”,这使得将该类添加到Proguard cfg文件相当容易,因为您有完整的Java名称