Android 什么';非自定义签名的APK(通过调试生成)运行正常,但自定义签名的APK(版本)不工作的可能原因是什么?
我的Android应用程序即将结束。调试多次正常运行,没有任何错误。它运行得很好。现在是我发布应用程序的时候了。我遵循所有可以通过谷歌轻松找到的步骤。事实上,已签名的APK安装正常,应用程序启动正常,但如果用户在应用程序的屏幕之间进行交互导航,它将无故崩溃。并不是所有的屏幕切换都会导致应用程序崩溃,只是其中的一些,我可以注意到,这里可能涉及到Android 什么';非自定义签名的APK(通过调试生成)运行正常,但自定义签名的APK(版本)不工作的可能原因是什么?,android,xamarin,deployment,xamarin.android,publish,Android,Xamarin,Deployment,Xamarin.android,Publish,我的Android应用程序即将结束。调试多次正常运行,没有任何错误。它运行得很好。现在是我发布应用程序的时候了。我遵循所有可以通过谷歌轻松找到的步骤。事实上,已签名的APK安装正常,应用程序启动正常,但如果用户在应用程序的屏幕之间进行交互导航,它将无故崩溃。并不是所有的屏幕切换都会导致应用程序崩溃,只是其中的一些,我可以注意到,这里可能涉及到反射。我设计了自己的绑定系统,用片段绑定ViewModel,使用反射是必须的,没有其他方法 我完全相信我的代码中没有任何错误,因为应用程序在调试模式下运行良
反射。我设计了自己的绑定系统,用片段
绑定ViewModel,使用反射
是必须的,没有其他方法
我完全相信我的代码中没有任何错误,因为应用程序在调试模式下运行良好。在几乎完全失去发布应用程序的希望的时候,我在debug文件夹中找到了APK文件的签名版本(只有当您开始调试应用程序以在某个目标设备上运行时,才会生成该签名版本-即使是在调试模式下构建的某个模拟器也不会生成该文件)。对我来说非常幸运的是,署名的apk工作得非常完美。我可以将APK部署到新设备上并正常安装,应用程序可以正常运行
所以释放过程一定有问题。以下是关于发布模式配置的一些信息(主要在Android选项选项卡中):
- 打包(打包属性):此处未签入任何内容
- 链接器:我只尝试了Sdk程序集和Sdk和用户程序集,但没有任何效果
- 高级属性:我选中了所有选项以支持所有可能的CPU架构(这应该不是问题,因为在调试模式下,所有这些选项都会被选中)
在开始学习Xamarin Android时,我尝试查找有关发布Android应用程序的信息,并完成了一个简单的测试(部署一个简单的应用程序)。当时它工作正常(可能是因为它太简单了),但现在当它涉及到一个复杂的系统(主要涉及我的绑定系统,它大量使用反射)时,它可能会在一些用户交互中崩溃。我还有一个单独的库项目(包含一些自定义视图),在我的主项目中引用了OK(不确定这是否是一个中断,但是使用了一个自定义视图OK,而其他一些视图可能会导致崩溃)。因为所有的崩溃都发生在编译的构建中,所以我无法调试任何东西来查看可能的错误
这里没有提供代码,因为代码太多了,它似乎在很多地方崩溃了,更重要的原因是代码不应该是问题所在(我在上面解释了一个原因——它在调试模式下运行平稳,我甚至在调试文件夹中找到了一个签名的APK文件,可以正常安装,然后应用程序就可以像在调试模式下一样正常运行)。既然你说你正在使用大量反射,首先要做的是:
- 在Android构建设置中:
- 如果选择了Proguard,则禁用它
- 将链接器选项更改为“不链接”
Xamarin.Android
框架,您可以创建对这些类/成员的“硬编码”假引用,以便链接器看到您需要它们
- 您可能拥有通过System.Reflection.MemberInfo.Invoke动态调用的代码
- 如果动态实例化类型,可能需要保留类型的默认构造函数
- 如果使用XML序列化,可能需要保留类型的属性
Ref:我不知道Xamarin中有什么配置,但您是否启用了Proguard(minifyEnabled=true in build.gradle)?根据我的经验,这可能是Progourd的问题。如果我们不在Progourd文件中保留或忽略正确的类名,那么在签署apk后它就会成为问题。如果启用了Progourd。@Laura我认为build.gradle不存在(或以某种方式隐藏)在Xamarin Android项目中,但它在项目属性中有一个名为
Proguard
的选项,并且该选项未启用。谢谢。@AjitDubey感谢您的反馈,您能给我一些检查或解决问题的建议吗(如果可能与Proguard相关)?这里有一些我不清楚的地方:您提到了proguard文件
,但我不确定它在我的Xamarin Android项目中的位置,再次感谢。@1)在Android构建
设置中,禁用Proguard
如果选中,并在链接器选项下将其更改为不链接
并重建发布版本,存档另一个.apk
并安装/重新测试。这将至少确定C#链接器是否是删除方法的问题。(我怀疑这是问题所在,但试试看)2)在你的应用程序中设置HockeyApp
,以捕获并象征你的发布模式崩溃和堆栈跟踪。。。我假设这样做,您将能够快速确定它是否与空相关,是否存在GC问题或OOM/对象分配问题,等等……谢谢,这个答案非常有用。在使链接器为我的项目工作之前,我不会将其用于初始部署