首页 > 解决方案 > Android 应用程序在调试中工作,但在发布时不工作

问题描述

我正在开发一个 Android 应用程序,当我在发布模式下运行该应用程序时遇到问题。如果我在调试模式下启动应用程序,我会在 Logcat 中收到此类消息(应用程序无法启动):

E/AndroidRuntime:致命异常:GoogleApiHandler 进程:it.planner,PID:27326 java.lang.SecurityException:为了使用模拟模式功能应用程序 it.planner 必须在开发人员设置中选择为模拟位置应用程序。在 com.google.android.gms.internal.zzeu.zzb 的 android.os.Parcel.readException(Parcel.java:2008) 的 android.os.Parcel.readException(Parcel.java:1954)(未知来源:10)在 com.google.android.gms.internal.zzcfa.zzbj(未知来源:9) 在 com.google.android.gms.internal.zzcfd.zzbj(未知来源:13) 在 com.google.android.gms.internal .zzcfk.zzbj(Unknown Source:2) at com.google.android.gms.internal.zzcee.zza(Unknown Source:4) at com.google.android.gms.common.api.internal.zzm.zzb(Unknown来源:8) 在 com.google。

显然,如果我在Developer Options中选择模拟位置,应用程序将启动并正常工作

如果我安装发行版 apk并尝试启动应用程序,应用程序不会启动,并且我在 Logcat 中收到这种消息:

E/AndroidRuntime: FATAL EXCEPTION: main Process: it.planner, PID: 29448 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2054) at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2077) 在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:678) 在 android.support.v4.app.BackStackRecord.commit( BackStackRecord.java:632) 在 it.planner.Home.mainMenu(Home.java:374) 在 it.planner.Home.computeGeolocation(Home.java:487) 在 it..planner.Home.access$100(Home.java :80) at it.planner.Home$3$1.onLocationResult(Home.java:344) at com.google.android.gms.internal.zzcff.zzu(未知来源:4) 在 com.google.android.gms.common.api.internal.zzci.zzb(Unknown Source:8) at com.google.android.gms.common.api.internal.zzcj.handleMessage(Unknown Source:16)在 android.os.Handler.dispatchMessage(Handler.java:109) 在 android.os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7377) 在 java.lang。 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) 上的 reflect.Method.invoke(Native Method) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7377) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os。 RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)os.Looper.loop(Looper.java:166) 在 android.app.ActivityThread.main(ActivityThread.java:7377) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os。 RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)

一旦应用程序处于发布模式,就无法选择模拟位置,因此它不想启动。我已经处理这个问题很多天了。我也尝试在 Gradle 文件中使用minifyEnabled false,但它不起作用。

gradle 文件如下:

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
        }
    }
    sourceSets {
        main { assets.srcDirs = ['src/main/assets', 'src/main/assets/'] }
        debug {
            manifest.srcFile 'src/main/AndroidManifest.xml'
        }
    }

标签: androidandroid-studioandroid-fragmentsandroid-gradle-plugin

解决方案


这个问题可能是因为没有使用正确的 API 提交 Fragment 事务。尝试去找

transaction.commit();

并将其替换为

transaction.commitAllowingStateLoss();

更多讨论在这里:https ://github.com/OneBusAway/onebusaway-android/issues/529#issuecomment-224974339


推荐阅读