首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Proguard (R8)否定操作符,除某些包外不保存任何东西。

Proguard (R8)否定操作符,除某些包外不保存任何东西。
EN

Stack Overflow用户
提问于 2019-12-09 12:10:51
回答 2查看 2.4K关注 0票数 5

proguard中的否定符(感叹号)应该允许我保留一个除了apache库之外的东西:

代码语言:javascript
复制
-keep class !org.apache.**

根据这些答案。这就是要走的路:

然而,它混淆了我的APK中的所有类。

这是我的build.gradle的一部分(我有AndroidStudio3.5.3)

代码语言:javascript
复制
compileSdkVersion 29
buildToolsVersion "29.0.2"
//...
buildTypes {

    release {

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

        // Enables resource shrinking, which is performed by the
        // Android Gradle plugin.
        shrinkResources false
    }
}

dependencies {
    //Utility libs
    implementation 'org.apache.commons:commons-collections4:4.1'
    implementation 'org.apache.commons:commons-lang3:3.4'
    implementation group: 'commons-io', name: 'commons-io', version: '2.5'
}

在我将-printconfiguration添加到proguard-rules.pro文件后,我看到在proguard-rules.pro文件中有许多-keep规则跟随着-keep class !org.apache.**

代码语言:javascript
复制
-printconfiguration
-keep class !org.apache.**

# Referenced at ***anonymized***\app\build\intermediates\merged_manifests\release\AndroidManifest.xml:180
-keep class android.support.v4.app.CoreComponentFactory { <init>(); }
# Referenced at ***anonymized***\app\build\intermediates\merged_manifests\release\AndroidManifest.xml:180
-keep class com.mycompany.MyApplication { <init>(); }
# Referenced at C:\Users\***anonymized***\.gradle\caches\transforms-2\files-2.1\7f5f0b3369d8fa8a72a20e2278ec0acc\appcompat-v7-28.0.0\res\layout\abc_action_menu_item_layout.xml:17
-keep class android.support.v7.view.menu.ActionMenuItemView { <init>(...); }

Ezekiel Baniaga建议的这种方法也不起作用。相反,它保留了包括apache包在内的所有内容:

proguard-rules.pro

代码语言:javascript
复制
-printconfiguration

-dontshrink

-dontoptimize

-dontobfuscate

-keep,allowshrinking,allowoptimization,allowobfuscation class org.apache.**
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-13 11:12:52

我必须添加,**才能让它正常工作。谢谢T. Neidhart

代码语言:javascript
复制
-keep class !org.apache.**,**

前面的示例保留类名,但仍然混淆成员。所以我不得不添加{ *; }

代码语言:javascript
复制
-keep class !org.apache.**,** { *; }

这就是我如何混淆多个包(我必须使用它们在一个保持规则!)

代码语言:javascript
复制
-keep class !org.apache.**, !org.zeroturnaround.**, !com.drew.**, ** { *; }

为了找出-dontshrink -dontoptimize -dontobfuscate -keep,allowshrinking,allowoptimization,allowobfuscation class org.apache.**的问题所在,我可以根据https://www.guardsquare.com/en/products/proguard/manual/usage添加-whyareyoukeeping

票数 5
EN

Stack Overflow用户

发布于 2019-12-10 19:02:54

如果R8项目不再起作用,您应该向该项目提交一个bug报告。

为了在此期间继续使用Proguard,可以将其添加到gradle.properties文件中:

android.enableR8=false

进一步的测试表明,ProGuard的隐式行为并不像在R8中那样实现。

所以这样的规则是:

代码语言:javascript
复制
-keep class !org.apache.**

在使用ProGuard时隐式保留所有其他类,但在使用R8时不保留。要在R8中实现相同的行为,请将规则更改为:

代码语言:javascript
复制
-keep class !org.apache.**,**
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59248681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档