android - Proguard (R8) 否定运算符(operator)不工作以保留某些包以外的任何东西

标签 android apk proguard android-r8

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

-keep class !org.apache.**

根据这些答案。这就是要走的路:
  • How to negate classname with Proguard
  • Enable Proguard for only two packages in large Android application
  • Android proguard Ignore All Classes except of one
  • Proguard Android do not obfuscate anything except few classes
  • Proguard: How to keep everything except specific condition?
  • Can we shrink all classes but only obfuscate some with proguard?

  • 但是,它混淆了我的 APK 中的所有类。

    这是我的 build.gradle 的一部分(我有 Android Studio 3.5.3)
    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我看到的文件有很多-keep遵循我的-keep class !org.apache.** 的规则
    -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
    -printconfiguration
    
    -dontshrink
    
    -dontoptimize
    
    -dontobfuscate
    
    -keep,allowshrinking,allowoptimization,allowobfuscation class org.apache.**
    

    最佳答案

    如果这不再起作用,您应该向 R8 项目提交错误报告。

    为了同时继续使用 Proguard,您可以将其添加到您的 gradle.properties 文件中:

    android.enableR8=false

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

    所以像这样的规则:

    -keep class !org.apache.**
    

    使用 ProGuard 时将隐式保留所有其他类,但在使用 R8 时不会。要使用 R8 实现相同的行为,请将规则更改为:
    -keep class !org.apache.**,**
    

    关于android - Proguard (R8) 否定运算符(operator)不工作以保留某些包以外的任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59248681/

    相关文章:

    android - proguard.cfg文件丢失

    android - 如何从 ProGuard 混淆中排除这个特定的类

    java - Android:闹钟应用程序的结构

    android - 如何插入具有值的新联系人?

    java - 在 Android 中解析 XML (XmlPullParserException)

    java - 如何修复空指针异常 Firebase Auth

    android - 从 apk 中读取 res 文件夹

    java - Android APK:重复条目:org/objectweb/asm/AnnotationVisitor.class

    android - 安装在 sdcard 上的应用程序的 .apk 位置在哪里?

    java - Play 商店发布的应用程序“网络无法访问”,但调试版本有效