我的Android应用程序即将结束。调试运行好几次没有任何错误。它运行得很好。现在是我构建发布和发布应用程序的时候了。我按照Google可以轻松找到的所有步骤进行操作。实际上已签名的APK已安装好并且应用程序启动正常但如果用户进行交互以在应用程序的屏幕之间导航,则会无缘无故地崩溃。并非所有的屏幕切换都会导致应用程序崩溃,只是其中一些,我可以注意到它可能涉及到Reflection
。我设计了自己的绑定系统来将ViewModel与Fragment
绑定在一起,使用Reflection
是必须的,没有别的办法。
我完全相信我的代码中没有任何错误,因为应用程序在调试模式下运行得很好。在几乎完全失去发布应用程序的所有希望时,我在调试文件夹中找到了APK文件的签名版本(只有当您开始调试应用程序以在某些目标设备中运行时才会生成签名版本 - 甚至一些模拟器,在调试模式下构建将不会生成该文件)。对我来说,签名的apk完美无缺。我可以将APK部署到新设备并正常安装,应用程序可以预期运行。
因此,释放过程一定有问题。以下是有关发布模式配置的一些信息(主要在Android选项选项卡中):
在学习Xamarin Android之初,我尝试了解有关发布Android应用程序的信息,并完成了一个简单的测试(部署一个简单的应用程序)。它当时工作正常(可能因为它太简单了),但现在当涉及到一个复杂的(主要涉及我的绑定系统使用大量反射)时,它可能会在某些用户交互中崩溃。我还有一个单独的库项目(包含一些自定义视图)在我的主项目中引用OK(不确定是否可能是一个中断,但是一个自定义视图使用OK而其他一些可能导致崩溃)。因为所有崩溃都发生在编译的构建中,所以我无法调试任何东西以查看可能出错的地方。
这里没有提供代码,因为代码太多,似乎在许多地方崩溃,一个更重要的原因是代码不应该是问题(出于一个原因我在上面解释过 - 它只是在调试模式下运行顺利,我甚至在调试文件夹中找到一个已签名的APK文件,可以安装好,然后应用程序就像在调试模式下一样运行。
既然你说你使用了很多反思,首先要做的是:
Don't Link
重建发布版本更新:由于这个工作,应用程序不再崩溃。
链接器有时会删除您要保留的代码。例如:
您需要确定要删除哪些类和/或方法,因为它们没有直接引用,只能通过反射调用并保留它们以防止链接器删除它们。
如果它们在您的代码中,您可以使用[保留]属性。
如果它们是第三方库或Xamarin.Android
框架,您可以创建对这些类/成员的“硬编码”虚假引用,以便链接器看到您需要它们。
- 您可能拥有通过System.Reflection.MemberInfo.Invoke动态调用的代码。
- 如果动态实例化类型,则可能需要保留类型的默认构造函数。
- 如果使用XML序列化,则可能需要保留类型的属性。
参考:https://developer.xamarin.com/guides/android/advanced_topics/linking/