首页 > 解决方案 > 上传到 Play 商店后 App Center Build 崩溃

问题描述

我(像往常一样)使用 MS App Center 进行发布构建,而我使用 MS App Center 创建的构建 APK 适用于 32 位和 64 位设备。但是在通过应用程序发布(在发布管理中)甚至通过内部应用程序共享(在开发工具中)上传到 Play 商店后,应用程序在启动时崩溃。该应用程序在测试时从 MS App Center 下载后运行。但是当我尝试从 Play 商店安装应用程序时,它崩溃了,甚至没有显示第一个屏幕。

我尝试了什么:

这是我使用adb logcat32 位测试设备的堆栈跟踪。所有的 logcat 都非常相似。

对于那些无法打开 pastebin 的人,这里有一个总结:

AndroidRuntime: FATAL EXCEPTION: main
Process: com.bgrs.reloaccess, PID: 29347
android.runtime.JavaProxyThrowable: System.FormatException: Input string was not in a correct format.
  at System.Number.ThrowOverflowOrFormatException (System.Boolean overflow, System.String overflowResourceKey) [0x0001a] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Number.ParseInt32 (System.ReadOnlySpan`1[T] value, System.Globalization.NumberStyles styles, System.Globalization.NumberFormatInfo info) [0x00016] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Int32.Parse (System.ReadOnlySpan`1[T] s, System.Globalization.NumberStyles style, System.IFormatProvider provider) [0x0000e] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Version.TryParseComponent (System.ReadOnlySpan`1[T] component, System.String componentName, System.Boolean throwOnFailure, System.Int32& parsedComponent) [0x0000b] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Version.ParseVersion (System.ReadOnlySpan`1[T] input, System.Boolean throwOnFailure) [0x0011a] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Version.Parse (System.String input) [0x00014] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at System.Version..ctor (System.String version) [0x00014] in <915e1956390a4a4c9eeb4e5a86a3b84f>:0 
  at ReloAccess.Droid.LoginActivity.OnCreate (Android.OS.Bundle savedInstanceState) [0x000cf] in <34564626c64d48b5bf58d931504c2b9e>:0 
  at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x00011] in <8354d046afcb48708fb91f153e8a8cb8>:0 
  at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.12(intptr,intptr,intptr)
    at md5eb9edb947e2683f0feaecf2c0d709827.LoginActivity.n_onCreate(Native Method)
    at md5eb9edb947e2683f0feaecf2c0d709827.LoginActivity.onCreate(:31)
    at android.app.Activity.performCreate(Activity.java:6251)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
ActivityManager:   Force finishing activity 

Version.Parse 发生在这个函数中。

标签: c#androidxamarinxamarin.android

解决方案


我无法弄清楚为什么该错误仅在上传到 Play 商店后才显示,我什至确保该 API 未被弃用。

在@SushiHangover 的建议之后,我尝试删除 TryParse 版本代码,但我注意到错误不存在,而是在这里:

AuthenticationManager.Instance.AppVersion = new Version (this.PackageManager.GetPackageInfo (this.PackageName, 0).VersionName);

当我在本机 Java/Kotlin 中使用 PackageManager.GetPackageInfo 时,我注意到用户为此使用了 Try-Catch,因为它看起来不太稳定并且倾向于引发可能导致应用程序崩溃的“NameNotFoundException”。因此,您应该尽量安全并假设 GetPackageInfo 引发异常。你绝对不能 TryParse 异常,所以这里有一个可能的解决方案:

try
{
    PackageInfo pInfo = PackageManager.GetPackageInfo(PackageName, 0);
    var version = pInfo.VersionName;
    if (Version.TryParse(version, out Version result))
    {
        AuthenticationManager.Instance.AppVersion = result;
    }
    else
        AuthenticationManager.Instance.AppVersion = new Version(4, 13, 17);

    Console.WriteLine("Version Name : " + version);
}
catch (PackageManager.NameNotFoundException ex)
{
    Console.WriteLine("NameNotFoundException: " + ex.Message);
    AuthenticationManager.Instance.AppVersion = new Version(4, 13, 17);
}

推荐阅读