【问题标题】:Is it possible to use proguard in debug mode?是否可以在调试模式下使用 proguard?
【发布时间】:2013-05-09 17:03:15
【问题描述】:

在我的 android 应用程序中,我想在开启 proguard 的情况下测试一些功能。

我不需要真正“调试”它,但我希望 proguard 在我在 Eclipse 中运行时运行。我不想每次都导出二进制文件(所以,在发布模式下)并保存为 apk 并将其发送到设备进行测试。

有没有办法这样运行proguard?

更新:

如果您使用 Eclipse,这似乎是可能的;由于问题标题不包含 Eclipse,因此该问题有多个正确答案。

【问题讨论】:

  • 您可能想在这里更改接受的答案,因为包括发帖人在内的每个人都同意这是错误的,但他们不会删除它
  • 谢谢你。我会更新这个问题。当前答案对 Eclipse 是正确的,但问题标题不包括 Eclipse。其他答案对于 Eclipse 以外的 IDE 都是正确的。

标签: android eclipse proguard


【解决方案1】:

如果您想让整个构建过程更轻松,您应该切换到 gradle 和 Android Studio IDE。

然后您可以轻松地将以下内容添加到您的 build.gradle 文件中以运行 ProGuard:

android {
    buildTypes {
        release {
        }
        debug {
            minifyEnabled true
            proguardFile 'proguard-android.txt'
            zipAlignEnabled true
        }
    }
}

这将在您的调试版本上运行 ProGuard,配置文件“proguard-android.txt”,该文件应放在项目的根文件夹中。此外,您的 apk 正在 zip 对齐(如果您不希望发生这种情况,只需删除“zipAlignEnabled true”)。如果你想为你的发布版本做同样的事情,只需在“发布”下添加这三行。

有点题外话:像添加依赖项、签署你的 apk 或在你的构建过程中添加其他自定义任务之类的东西也使用 gradle 更简单。此外,您不仅可以通过 Android Studio IDE 构建您的 apk,还可以通过命令行上的简单命令(例如 ./gradlew assembleDebug)。因此,如果您在一个团队中工作,那么新成员的设置过程只需一个“./gradlew assembleDebug”即可。根本不需要任何 IDE 配置。导入包含所有依赖项的项目就像一键式过程一样简单

编辑: 从 Gradle Android Build Tools 版本 0.14.0 开始,属性名称已更改 (http://tools.android.com/tech-docs/new-build-system):

  • BuildType.runProguard -> minifyEnabled
  • BuildType.zipAlign -> zipAlignEnabled

我已经更新了上面的代码。

【讨论】:

【解决方案2】:

旧答案:

http://developer.android.com/tools/help/proguard.html

ProGuard 仅在您以发布模式构建应用程序时运行,因此您在以调试模式构建应用程序时不必处理混淆代码。

当您在 release 模式下构建应用程序时,无论是通过运行 ant release 还是使用 Eclipse 中的导出向导,构建系统都会自动检查是否设置了 proguard.config 属性。如果是,ProGuard 会在将所有内容打包到 .apk 文件之前自动处理应用程序的字节码。 在调试模式下构建不会调用 ProGuard,因为它会使调试更加麻烦。

更新:2016 年 13 月 3 日

可以使用新的 gradle 构建系统。您需要在 build.gradle 文件中将 minifyEnabled 设置为 true。通常你有 pro-guard 在 release 模式下运行。还有其他可用的选项,例如缩减资源。你可以找到一些有用的信息@http://tools.android.com/tech-docs/new-build-system

也看看@

http://developer.android.com/tools/building/configuring-gradle.html

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

        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
   }
 }

【讨论】:

  • 但是有办法吗?我接受它很麻烦。我不需要混淆代码,但我会根据它的配置文件使用 proguard 的处理能力来剥离日志功能等。
  • @frankish 根据文档所说的不。但是我不知道另一种方法。引用文档“ProGuard 仅在您以发布模式构建应用程序时运行”。根据这个声明,它是一个直接的否定
  • 你应该删除你的答案,对别人公平。这是误导。
  • 如果您使用的是 Eclipse,这个答案似乎仍然是正确的。其他答案也是正确的,但前提是您不使用 Eclipse。目前很难同时更改已接受的答案并编辑问题内容和标题,因为这个问题及其答案包含大量信息。
  • @frankish 如果您觉得需要使用更好的信息进行编辑,您可以随时编辑帖子
【解决方案3】:

关于自定义 Ant 构建(并基于 Victor 的回答),将以下内容添加到我的 build.xml 文件对我有用:

<target name="-debug-obfuscation-check">
    <!-- enable proguard even in debug mode -->
    <property name="proguard.enabled" value="true"/>

    <!-- Secondary dx input (jar files) is empty since all the jar files will be in the obfuscated jar -->
    <path id="out.dex.jar.input.ref" />
</target>

请注意,我必须覆盖(实际上是预先设置的)out.dex.jar.input.ref;否则,稍后运行 dx 将尝试合并非不相交的 jar 并抛出 DexException: Multiple dex files define Xxx。

【讨论】:

    【解决方案4】:

    如果您使用 Ant 构建,这是可能的。请参阅Android custom build using Ant,了解如何使用 ant 构建项目。然后,只需在项目的 build.xml 中覆盖目标“-debug-obfuscation-check”并将 proguard.enabled 设置为 true:

    <target name="-debug-obfuscation-check">
        <!-- proguard is never enabled in debug mode -->
        <property name="proguard.enabled" value="true"/>
    </target>
    

    【讨论】:

    • 谢谢!这几乎对我有用。我添加了一个基于您的新答案。
    【解决方案5】:

    使用 Android Studio,您可以在 Proguard 规则文件中使用 -dontobfuscate 选项,调试器将正常工作。我不确定它是否也适用于 Eclip。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多