【问题标题】:Android debugging with minifyEnabled true使用 minifyEnabled true 进行 Android 调试
【发布时间】:2015-08-10 18:02:28
【问题描述】:

我正在调查一个只有在 Gradle 中将 minifyEnabled 设置为 true 时才会出现的问题。

我正在使用日志语句进行调试,但问题显然很深。有什么办法可以将 minifyEnabled 设置为 true,但仍然可以使用 Android Studio 调试器?

我知道答案可能是“不”,但我还是想问。

简而言之:是否可以将minifyEnabled 设置为true 来运行Android Studio 调试器?

【问题讨论】:

  • 添加一些代码并展示您为尝试解决问题所做的工作
  • 所以,这实际上不是一个特定于代码的问题。它更像是:是否可以在 minifyEnabled 设置为 true 的情况下运行调试器
  • 行为是我无法使用 minifyEnabled 运行调试器。 Android Studio 永远不会进入代码或命中任何断点。
  • 看,我在这里尽我所能。显然,您对我要问的具体问题一无所知。没关系。也许如果你不理解像“断点不会被命中”这样不言自明的陈述,你可以对自己说“嗯......这似乎不是我熟悉的东西。我会通过”。另外,如果我收到错误消息,我会提到这一点。就像大多数开发人员一样。
  • 这里有类似的问题。尽管我已选择 debug 作为构建变体,并且 minifyEnabled 仅在 build.gradle 的 release 部分中为 true,但在将其更改为 false 之前我无法调试...

标签: android android-studio


【解决方案1】:

已经可以调试缩小的应用程序。 首先,编辑您的proguard-rules.pro 并添加行:

-dontobfuscate
-keepattributes SourceFile,LineNumberTable

另外,请务必注释掉这一行:

# -renamesourcefileattribute SourceFile

然后,编辑您的应用程序build.gradle 文件并按以下方式定义您的调试构建类型:

debug {
    minifyEnabled true
    useProguard false
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

所有这些更改都是必要的(如果您跳过keepattributesrenamesourcefileattribute,那么调试将起作用,但日志记录仍会指向代码中的错误位置)

然后,使用调试器运行应用程序。

现在,日志记录将准确地指向代码中的正确位置。此外,如果设置了任何断点,这些将正确执行。 Android Studio 将允许您调查变量、检查条件和评估代码。

请记住在构建版本之前删除proguard-rules.pro 文件中的更改。您还可以在单​​独的 proguard 文件中定义调试和发布设置。

【讨论】:

  • 这应该是公认的答案。这正是我想要的。
  • 是的,这确实应该被接受。像魅力一样工作。
  • 如果我添加 useProguard false 行,我会得到神秘的 gradle 错误:Caused by: groovy.lang.MissingMethodException: No signature of method: build_e2affs1uiae8d7dqn7brhtd9x.android() ... ??
  • commenting -renamesourcefileattribute SourceFile 对我有用。谢谢+1
【解决方案2】:

没有..但是您应该避免在调试版本中使用它。它会减慢您的应用程序。当您发布 APK 用于测试目的时它很有用,但在此之前,请让您了解使用 MinifyEnabled。按照这个链接。它用于启用代码收缩。(未使用的代码将被收缩)。

official documentation

【讨论】:

    【解决方案3】:

    @KrzysztofSroga https://stackoverflow.com/a/61705347/2425851的修改答案

    buildTypes 处创建新的stage buildType

    buildTypes {
            release {
                minifyEnabled true
                useProguard true
                debuggable false
    
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
            stage {
                minifyEnabled true
                useProguard false
                debuggable true
    
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', 'proguard-rules-stage.pro'
            }
    
            debug {
                debuggable true     
            }
        }
    

    proguard-rules.pro附近创建新文件proguard-rules-stage.pro

    proguard-rules-stage.pro:

    -dontobfuscate
    -keepattributes SourceFile,LineNumberTable
    
    

    现在您可以在窗口Build Variants 中切换可调试的构建类型

    【讨论】:

      【解决方案4】:

      只需在 ProguardFile 中添加这些拖线即可:

      -keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
      -keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
      

      因为你使用时的问题

      { }.getType() 
      

      当您将 JSON 字符串反序列化为 ArrayList 时

      【讨论】:

        猜你喜欢
        • 2018-11-13
        • 2019-01-10
        • 2017-10-16
        • 2019-01-07
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        相关资源
        最近更新 更多