是否可以在调试模式下使用proguard?


77

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

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

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

更新:

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


1
您可能想在此处更改已接受的答案,因为包括海报者在内的所有人都同意这是错误的,但他们不会删除
Michael Mrozek 2015年

保护你。我将更新问题。当前答案对于Eclipse是正确的,但是问题标题不包括Eclipse。对于Eclipse以外的其他IDE,其他答案也是正确的。
2015年

Answers:


44

旧答案:

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

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

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

更新:13-3-2016

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

也可以看看@

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'
    }
   }
 }

4
但是有办法吗?我接受它很麻烦。我不需要混淆的代码,但我将根据其配置文件使用proguard的处理能力来剥离日志功能等。
坦率的说

@frankish根据文档说的是不。但是我不知道一种替代方法。引用文档“ ProGuard仅在以发布模式构建应用程序时运行”。根据此声明,这是直接的否定
Raghunandan

9
您应该删除答案,对他人公平。这是误导。
Radu 2015年

1
如果您正在使用Eclipse,则此答案似乎仍然正确。其他答案也是正确的,但前提是您不使用Eclipse。由于此问题及其答案包含很多信息,因此此时很难更改接受的答案并编辑问题的内容和标题。
2015年

@frankish,如果您认为需要以更好的信息进行编辑,则可以随时对其进行编辑
Raghunandan 2015年

73

如果您想简化整个构建过程,则应切换到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)来构建apk。因此,如果您在团队中工作,那么新成员的设置过程就只需一个“ ./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

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


谢谢@MrMaffen!走这条路要容易得多。
杰克·斯托弗勒

2
Android Studio会自动对齐您的APK。developer.android.com/studio/command-line/zipalign.html
Daniel Storm,

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:多个dex文件定义了Xxx。


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>

1
谢谢!这几乎对我有用。我添加了一个基于您的新答案。
约瑟夫·约翰逊

0

在Android Studio中,您可以-dontobfuscate在Proguard规则文件中使用选项,调试器将正常运行。我不确定它是否也可以与Eclipe一起使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.