应用程序在发布时崩溃,但在调试模式下工作正常

Posted

技术标签:

【中文标题】应用程序在发布时崩溃,但在调试模式下工作正常【英文标题】:App Crashes in release but works fine in Debug mode 【发布时间】:2019-12-05 16:57:55 【问题描述】:

我在 Play 商店上传了应用程序。它在调试模式下运行良好,但是当我从 Play 商店下载相同的 APK(发布模式)时,它会崩溃。我无法弄清楚,堆栈跟踪没有给出确切的错误位置。

java.lang.RuntimeException: 在 android.os.AsyncTask$3.done (AsyncTask.java:318) 在 java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354) 在 java.util.concurrent.FutureTask.setException (FutureTask.java:223) 在 java.util.concurrent.FutureTask.run (FutureTask.java:242) 在 android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607) 在 java.lang.Thread.run (Thread.java:761) 引起:java.lang.NullPointerException: 在 com.biocare.fots.HomeActivity$GetEmpDetailsTask.doInBackground (HomeActivity.java) 或 .onPostExecute (HomeActivity.java) 在 com.biocare.fots.HomeActivity$GetEmpDetailsTask.doInBackground (HomeActivity.java) 在 android.os.AsyncTask$2.call (AsyncTask.java:304) 在 java.util.concurrent.FutureTask.run (FutureTask.java:237) 在 android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243) 在 java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607) 在 java.lang.Thread.run (Thread.java:761)

上面的堆栈跟踪是从 Play 商店开发者控制台复制的。 Firebase 控制台中显示相同的错误。

这是我的 AsyncTask 代码:

 private static class GetEmpDetailsTask extends AsyncTask<Void, Void, Void> 

    WeakReference<HomeActivity> mContext;

    GetEmpDetailsTask(HomeActivity context) 
        mContext = new WeakReference<>(context);
    

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
    

    @Override
    protected Void doInBackground(Void... voids) 
        if(android.os.Debug.isDebuggerConnected())
            android.os.Debug.waitForDebugger();
        AppDatabase appDatabase = AppDatabase.getAppDatabaseInstance(
                mContext.get());
        Employee employee = appDatabase.employeeDAO().get();
        FotApplication.Employee.Id = employee.employeeId;
        FotApplication.Employee.Name = employee.firstName + " "
                + employee.lastName;
        FotApplication.Employee.Designation = employee.empDesignationName;
        FotApplication.Employee.DesignationDesc = employee.empDesignationName;
        FotApplication.Employee.Email = employee.email;
        return null;
    


    @Override
    protected void onPostExecute(Void aVoid) 
        mContext.get().mTvEmpName.setText(FotApplication.Employee.Name);
        mContext.get().mTvEmpEmail.setText(FotApplication.Employee.Email);
    

这是我的build.gradle(模块:app)

apply plugin: 'com.android.application'


android 
    signingConfigs 
        config 
            keyAlias 'abc'
            keyPassword 'test'
            storeFile file('path/to/keystore.jks')
            storePassword 'testpass'
        
    
    compileSdkVersion 29
    defaultConfig 
        applicationId "com.myapp.fats"
        minSdkVersion 22
        targetSdkVersion 29
        versionCode 38
        versionName "2.1.9"
        vectorDrawables.useSupportLibrary = true
    
    buildTypes 
        debug 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        
    
    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
    productFlavors 
    


dependencies 
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.google.android.gms:play-services-location:17.0.0'
    implementation 'com.google.android.gms:play-services-maps:17.0.0'
    implementation 'com.google.android.gms:play-services-places:17.0.0'
    implementation 'com.jakewharton:butterknife:8.6.0'
    implementation 'com.google.firebase:firebase-messaging:19.0.1'
    implementation 'com.google.firebase:firebase-core:17.0.1'
    implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    implementation 'androidx.vectordrawable:vectordrawable:1.0.1'
    annotationProcessor 'com.jakewharton:butterknife:8.6.0'
    annotationProcessor 'androidx.room:room-compiler:2.1.0'
    implementation 'androidx.room:room-runtime:2.1.0'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.afollestad.material-dialogs:commons:0.9.6.0'
    implementation 'de.hdodenhof:circleimageview:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel:2.0.0'
    implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
    implementation 'com.wang.avi:library:2.1.3'
    implementation 'androidx.gridlayout:gridlayout:1.0.0'
    implementation ('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') 
        transitive = true
    

repositories 
    mavenCentral()


apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'

编辑 1:

来自 Android Studio 的 Logcat:

 Process: com.biocare.fots, PID: 15978
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:353)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
    at java.util.concurrent.FutureTask.run(FutureTask.java:271)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.biocare.database.n.b' on a null object reference
    at com.biocare.fots.HomeActivity$a.a(Unknown Source:20)
    at com.biocare.fots.HomeActivity$a.doInBackground(Unknown Source:2)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)

【问题讨论】:

【参考方案1】:

我猜,如果您的 DAO(例如 Room)使用反射,当您使用 minifyEnable=true 构建发布 apk 时,您的 DAO 找不到任何东西。尝试检查你的 proguard。

UPD 是的,你有混淆的问题。 'java.lang.String com.biocare.database.n.b' 这个'n.b' 意味着你在混淆之前有正确的路径,但是在混淆之后路径被更改为值'n'和'b'。您应该在 proguard 排除列表中添加这些文件(我不知道某些文件,因为我不知道您的代码)。

您可以在 proguard 文档中阅读更多内容。 This 也很有用

【讨论】:

如何查看proguard? 我不知道,您应该检查什么。您可以在发布风格中关闭 minify 并构建它。如果你没有崩溃,那么你有混淆的问题,你需要改变 proguard。如何使用它,您可以阅读文档。否则,您将处理另一个问题(使用空上下文 f.e)。在这种情况下,您可以将“断言”置于可能崩溃的地方。 当实时应用程序崩溃时,我添加了来自 Android Studio 的日志。请看这个。诊断问题可能会有所帮助。 您的方向是正确的。我应该在proguard规则中的哪里添加排除列表?喜欢这个-keep public class com.myapp.customcomponents.*?我应该将它添加到 Module: app 文件的末尾吗? 项目的 app 文件夹中有 proguard-rules.pro 文件。你可以在上面放几行

以上是关于应用程序在发布时崩溃,但在调试模式下工作正常的主要内容,如果未能解决你的问题,请参考以下文章

ios 应用程序在调试模式下完美运行,但在发布时崩溃

Xamarin App 在调试时运行,但在发布时崩溃

QPainter::begin 在调试模式下使程序崩溃

为啥我的应用程序在发布模式下崩溃但在调试模式下不崩溃?

应用程序仅在调试模式下崩溃

Xamarin App在调试时运行但在发布时崩溃