79

在我的 android 应用程序中,我想测试一些使用 proguard 的功能。

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

有没有办法以这种方式运行proguard?

更新:

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

4

5 回答 5

74

如果您想让整个构建过程更轻松,您应该切换到 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

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

于 2014-01-18T14:41:14.023 回答
47

旧答案:

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

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

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

更新:2016 年 13 月 3 日

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

也看看@

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'
    }
   }
 }
于 2013-05-15T08:04:14.453 回答
11

关于自定义 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 defined Xxx.

于 2014-05-19T08:57:33.297 回答
7

如果您使用 Ant 构建,这是可能的。有关如何使用 ant 构建项目的信息,请参阅使用 Ant 的 Android 自定义构建。然后,只需在项目的 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>
于 2014-04-08T11:52:40.487 回答
0

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

于 2016-06-13T16:57:12.877 回答