minifyEnabled 导致应用程序在发布模式下崩溃

问题描述 投票:0回答:4

我的应用程序在调试模式下运行良好。不幸的是,上传到 Google Play 商店后,我发现该应用程序崩溃了。我搜索了几个类似的问题,所有这些问题都建议禁用 Proguard 或检查日志输出。然而,我在使用 release Build Variant 时遇到了以下情况:

1- 在正常情况下,当

minifyEnabled
true
时,应用程序崩溃,我看不到任何日志输出。 没有可调试进程

release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }

2- 制作

debuggable true
我的应用程序运行良好。但我再次看不到任何错误日志,因为该应用程序工作正常。

release {
            debuggable true
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }

3- 评论

minifyEnabled true
该应用程序可以运行。但我失去了缩小的好处。

release {
            shrinkResources true
            //minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }

还尝试在 AndroidManifest.XML 中硬编码

android:debuggable="true"
,这给出了错误。

奇怪的是,通过将 debuggable 设置为 true,应用程序可以正常工作。我不确定是否应该将

debuggable true
保持在发布模式或禁用缩小,或任何其他解决方法来解决此问题。

如果有人能分享如何解决这个问题,我将非常感激。

更新:通过运行Android设备监视器我能够找到问题:

01-28 00:28:13.764: E/AndroidRuntime(4806): FATAL EXCEPTION: main
01-28 00:28:13.764: E/AndroidRuntime(4806): Process: com.example.myapp, PID: 4806
01-28 00:28:13.764: E/AndroidRuntime(4806): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference
01-28 00:28:13.764: E/AndroidRuntime(4806):     at com.example.myapp.MainActivity.onCreateOptionsMenu(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.app.Activity.onCreatePanelMenu(Activity.java:3142)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v4.b.n.onCreatePanelMenu(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v7.app.h$b.onCreatePanelMenu(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v7.view.i.onCreatePanelMenu(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v7.app.q.j(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.support.v7.app.q$1.run(Unknown Source)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.os.Handler.handleCallback(Handler.java:739)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.os.Looper.loop(Looper.java:148)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at android.app.ActivityThread.main(ActivityThread.java:7329)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at java.lang.reflect.Method.invoke(Native Method)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
01-28 00:28:13.764: E/AndroidRuntime(4806):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
java android logging gradle
4个回答
16
投票

看起来 Proguard 无法正确处理 SearchView 小部件。我将以下行添加到位于 app 文件夹内的 proguard-rules.pro 文件中,问题消失了:

-保留类 android.support.v7.widget.SearchView { *; }

现在我不需要将 minifyEnabled 设置为 false。

更新:

对于那些仍然无法在 android studio 中查看错误日志或在发布版本中重现崩溃的人,他们可以使用在线崩溃报告工具。


3
投票

我也遇到了同样的应用程序崩溃问题。就我而言,我从 assets 读取 JSON 文件,并使用 Gson 库将其转换为 Kotlin 数据类。这些是课程:

data class JournalData(
    val name: String,
    val url: String,
    val category: Categories
)

enum class Categories { POLITICS, SPORTS, TECHNOLOGY }

我在使用时遇到两个问题

minifyEnabled=true
:

  1. 数据类属性随机名称混淆。例如,属性
    name
    被混淆为
    XYZ
    或任何其他随机名称。
  2. 类别枚举类常量也被混淆,因此解析器无法将 JSON 文本与这些枚举常量相关联。

解决方案

  • 我向数据类和枚举类添加了
    @Keep
    注释,如下所示:
@Keep
data class JournalData(
    val name: String,
    val url: String,
    val category: Categories
)

@Keep
enum class Categories { POLITICS, SPORTS, TECHNOLOGY }

通过这样做,您可以指定在启用缩小功能时,这些类和相应的属性/常量不能由 ProGuard 修改。

此外,检查 logcat 将帮助您找到确切的错误。

另请参阅:


0
投票

检查您在项目中使用的库的 proguard 规则,也许您需要添加一些特定规则

就我而言,这是因为混淆了 protobuf,下一条规则解决了问题

-keep public class * extends com.google.protobuf.GeneratedMessageLite { *; }

0
投票

就我而言,我已将我的应用程序与 crashlytics 集成,并且我在发布模式下发现了 classNotFoundException

minifyEnabled=false
确实对我有帮助,但也不推荐。所以,我将
minifyEnabled=true
设置为 optimzereduce app size
minifyEnabled=true
重命名和函数,因此它重命名了我的类,这给了我错误。所以,我在
proguard
文件中添加了一行来 keep 该类名,就像这样

proguard-rules.pro 文件

-keep class package.class
© www.soinside.com 2019 - 2024. All rights reserved.