启用 proguard 的 Android 单元测试

Posted

技术标签:

【中文标题】启用 proguard 的 Android 单元测试【英文标题】:Android Unit Tests with proguard enabled 【发布时间】:2014-12-16 09:46:55 【问题描述】:

我有一个问题,即 Proguard 会删除我的调试 APK 的方法(由于方法 dex 文件限制,我需要在调试时运行 proguard),即使它们在测试 apk 中使用。例如。我在单元测试中使用 GSON addProeprty 方法,但不在 App apk 中。此方法被剥离并导致测试失败。但是由于 dex 文件的限制,我不想将 proguard 配置为只保留所有 GSOn,也不想单独列出所有方法。有没有办法告诉 rpguard 将单元测试视为源代码入口点?

【问题讨论】:

【参考方案1】:

这就是我所做的。

添加自定义的 proguard 规则文件。

/project/app/proguard-test-rules.pro

# Proguard rules that are applied to your test apk/code.
-ignorewarnings

-keepattributes *Annotation*

-dontnote junit.framework.**
-dontnote junit.runner.**

-dontwarn android.test.**
-dontwarn android.support.test.**
-dontwarn org.junit.**
-dontwarn org.hamcrest.**
-dontwarn com.squareup.javawriter.JavaWriter
# Uncomment this if you use Mockito
#-dontwarn org.mockito.**

将以下内容添加到您的应用程序的 build.gradle 中。测试时使用proguard文件。

/project/app/build.gradle

android 
    debug 
        minifyEnabled true
        testProguardFile 'proguard-test-rules.pro'
    

【讨论】:

你先生,真棒! 我第一次尝试这个解决方案时错过了 testProguardFile 中的“测试”,谢谢! 尝试使用 android 库。没有运气。 aar 被混淆了,但是 test apk 没有被混淆。 检查共享该文件的google sample project。【参考方案2】:

以上答案都没有对我有用。我有两个问题:我还需要使用默认的 proguard 文件进行测试,而我的默认 proguard 文件是错误的。

    要使用默认的 proguard 文件,除了你自己的:

    android 
        debug 
            minifyEnabled true
            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project-test.pro'
        
    
    

    当您通过 Android Studio 更新 SDK 工具时,默认的 proguard 文件(以及所有 tools/proguard 文件夹)显然是 not replaced by default。我的机器使用了一个过时的配置文件,这导致了奇怪的 proguard 问题。要更新 proguard 的默认配置,请将 ~/Library/Android/Sdk/tools/proguard/proguard-android.txt 替换为 this。

【讨论】:

刚刚解决了第二个问题。我认为值得一提的是,从 2.2.0 版的 gradle android 插件开始,proguard-android.txt 不再使用,而是在构建时生成默认规则。来源:Android plugin for Gradle, revision 2.2.0【参考方案3】:

仪器测试(和其他?)不使用与您的调试/发布 apk 相同的 proguard 文件。您可以尝试在调试和发布块中设置testProguardFile 选项。这个特定于测试的 proguard 文件可能非常宽松,因为它不用于调试/发布 apk。

【讨论】:

【参考方案4】:

我已经在我的构建中解决了这个问题,方法是添加一个额外的“dev”buildType,我在其中启用了 proguard,但将其配置为将所有代码保留在我自己的包中,以及一些碰巧使用的特定库类仅来自测试。我还在开发者buildType 中禁用了混淆功能,以便可以从 IDE 中对其进行调试。

对于调试和发布版本,我使用“真正的”proguard 设置,包括混淆和优化。

【讨论】:

你能分享一个类似的proguard文件吗? 谢谢,应该可以。但是,我们有几种风格和模块,并且为所有这些风格和模块设置另一种构建类型有点混乱。来自其他答案的自定义 proguard 规则有所帮助。

以上是关于启用 proguard 的 Android 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中启用proguard? [复制]

Xamarin Android ProGuard 启用

如何在android studio中启用proguard? [重复]

如何在 Android Studio 中启用 ProGuard 混淆功能?

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

Proguard 启用 NoSuchMethodException