使用minifyEnabled为true的Android调试

47

我正在研究一个只有在Gradle的minifyEnabled设置为true时才存在的问题。

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

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

简而言之:是否可能在minifyEnabled设置为true的情况下运行Android Studio调试器?


5
这并不是一个与代码特定相关的问题,更多地是询问:是否可以在将minifyEnabled设置为true的情况下运行调试器。 - Marc DiNino
看起来你已经很好地总结了你的问题。也许考虑添加一下你在调试时遇到的行为是什么。注意:“它不起作用”并不能充分解释任何问题。 - Blake Yarbrough
8
问题是当minifyEnabled开启时,我无法使用调试器。Android Studio无法进入代码或命中任何断点。 - Marc DiNino
12
看,我在尽力。显然,你对我所询问的特定问题没有了解,但这没关系。如果你不能理解类似“断点不会被命中”这样的公理陈述,那也无妨。也许你可以对自己说,“嗯...好像不是我熟悉的东西,我会放弃。”另外,如果我遇到错误信息,我会提到的,就像大多数开发者一样。 - Marc DiNino
1
类似的问题在这里。虽然我已经选择了 debug 作为构建变体,并且 minifyEnabled 只在 build.gradle 中的 release 部分是 true,但我不能进行调试,直到我将其更改为 false... - Klaus
显示剩余7条评论
4个回答

28

现在已经可以调试被压缩的应用程序了。首先,编辑您的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文件中定义调试和发布设置。


这应该是被接受的答案。这正是我在寻找的内容。 - DevinM
是的,这确实应该被接受为答案。非常有效。 - Danish Ansari
4
如果我添加了 useProguard false 这一行,我会得到晦涩的 gradle 错误信息: Caused by: groovy.lang.MissingMethodException: No signature of method: build_e2affs1uiae8d7dqn7brhtd9x.android() ... ?? 如果我加入了 useProguard false 这一行,我会收到晦涩的 Gradle 错误消息: Caused by: groovy.lang.MissingMethodException: No signature of method: build_e2affs1uiae8d7dqn7brhtd9x.android() ... ?? - Rob N
注释-renamesourcefileattribute SourceFile 对我有效。谢谢 +1 - bluetoothfx
对我不起作用,和@RobN一样的问题。 - tenprint

4
不,但是你应该避免在调试构建中使用它。它会减慢你的应用程序速度。当你发布APK进行测试之前,它是有用的,但在此之前,请确保你使用了MinifyEnabled。请点击此链接。它用于启用代码缩小。(未使用的代码将被缩小)。
请参阅官方文档

1

修改了@KrzysztofSroga的答案https://dev59.com/VFwZ5IYBdhLWcg3wC8f4#61705347

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


现在你可以在窗口的“构建变体”中切换可调试的构建类型。

0

只需在ProguardFile中添加这两行:

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

因为在使用时出现了问题

{ }.getType() 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接