Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 什么';非自定义签名的APK(通过调试生成)运行正常,但自定义签名的APK(版本)不工作的可能原因是什么?_Android_Xamarin_Deployment_Xamarin.android_Publish - Fatal编程技术网

Android 什么';非自定义签名的APK(通过调试生成)运行正常,但自定义签名的APK(版本)不工作的可能原因是什么?

Android 什么';非自定义签名的APK(通过调试生成)运行正常,但自定义签名的APK(版本)不工作的可能原因是什么?,android,xamarin,deployment,xamarin.android,publish,Android,Xamarin,Deployment,Xamarin.android,Publish,我的Android应用程序即将结束。调试多次正常运行,没有任何错误。它运行得很好。现在是我发布应用程序的时候了。我遵循所有可以通过谷歌轻松找到的步骤。事实上,已签名的APK安装正常,应用程序启动正常,但如果用户在应用程序的屏幕之间进行交互导航,它将无故崩溃。并不是所有的屏幕切换都会导致应用程序崩溃,只是其中的一些,我可以注意到,这里可能涉及到反射。我设计了自己的绑定系统,用片段绑定ViewModel,使用反射是必须的,没有其他方法 我完全相信我的代码中没有任何错误,因为应用程序在调试模式下运行良

我的Android应用程序即将结束。调试多次正常运行,没有任何错误。它运行得很好。现在是我发布应用程序的时候了。我遵循所有可以通过谷歌轻松找到的步骤。事实上,已签名的APK安装正常,应用程序启动正常,但如果用户在应用程序的屏幕之间进行交互导航,它将无故崩溃。并不是所有的屏幕切换都会导致应用程序崩溃,只是其中的一些,我可以注意到,这里可能涉及到
反射。我设计了自己的绑定系统,用
片段
绑定ViewModel,使用
反射
是必须的,没有其他方法

我完全相信我的代码中没有任何错误,因为应用程序在调试模式下运行良好。在几乎完全失去发布应用程序的希望的时候,我在debug文件夹中找到了APK文件的签名版本(只有当您开始调试应用程序以在某个目标设备上运行时,才会生成该签名版本-即使是在调试模式下构建的某个模拟器也不会生成该文件)。对我来说非常幸运的是,署名的apk工作得非常完美。我可以将APK部署到新设备上并正常安装,应用程序可以正常运行

所以释放过程一定有问题。以下是关于发布模式配置的一些信息(主要在Android选项选项卡中):

  • 打包(打包属性):此处未签入任何内容
  • 链接器:我只尝试了Sdk程序集Sdk和用户程序集,但没有任何效果
  • 高级属性:我选中了所有选项以支持所有可能的CPU架构(这应该不是问题,因为在调试模式下,所有这些选项都会被选中)
在开始学习Xamarin Android时,我尝试查找有关发布Android应用程序的信息,并完成了一个简单的测试(部署一个简单的应用程序)。当时它工作正常(可能是因为它太简单了),但现在当它涉及到一个复杂的系统(主要涉及我的绑定系统,它大量使用反射)时,它可能会在一些用户交互中崩溃。我还有一个单独的库项目(包含一些自定义视图),在我的主项目中引用了OK(不确定这是否是一个中断,但是使用了一个自定义视图OK,而其他一些视图可能会导致崩溃)。因为所有的崩溃都发生在编译的构建中,所以我无法调试任何东西来查看可能的错误


这里没有提供代码,因为代码太多了,它似乎在很多地方崩溃了,更重要的原因是代码不应该是问题所在(我在上面解释了一个原因——它在调试模式下运行平稳,我甚至在调试文件夹中找到了一个签名的APK文件,可以正常安装,然后应用程序就可以像在调试模式下一样正常运行)。

既然你说你正在使用大量反射,首先要做的是:

  • 在Android构建设置中:
    • 如果选择了Proguard,则禁用它
    • 将链接器选项更改为“不链接”
  • 重建发布版本
  • 更新:因为这样做有效,应用程序不再崩溃

    链接器有时会删除要保留的代码。 例如:

    您需要确定要删除哪些类和/或方法,因为这些类和/或方法没有直接引用,只能通过反射调用,并保留这些类和/或方法以防止链接器删除它们

    如果它们在代码中,则可以使用[Preserve]属性

    如果它们是第三方libs或
    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/对象分配问题,等等……谢谢,这个答案非常有用。在使链接器为我的项目工作之前,我不会将其用于初始部署