用于库的Android Studio consumerProguardFiles不起作用

App*_*evo 2 android proguard android-library android-studio android-proguard

我想在我的库上使用proguard,但文件(规则)应该在库中设置.这意味着我不想在我的app模块中明确设置规则w(属于库).

我发现有类似consumerProguardFiles的属性.我的设置:

库gradle:

buildTypes {
    debug {
        debuggable true
        minifyEnabled false
    }
    release {
        minifyEnabled true
        consumerProguardFiles 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

app gradle:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        debuggable true
        minifyEnabled false
        signingConfig signingConfigs.debug
    }
    release {
        debuggable false
        minifyEnabled true
        signingConfig signingConfigs.release
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么上面的配置不起作用?我收到错误,无法找到库中的包/符号.


编辑:

重要的是我的proguard-rules.pro用于库和proguard-rules.pro用于主应用程序模块都是空的.

示例错误:

Error:(3, 60) error: package (my library package here) does not exist
(...)
Error:(16, 9) error: cannot find symbol class NavigationStructureModel
(...)
Run Code Online (Sandbox Code Playgroud)

超过一个handrued错误.我可以看到我的库中的所有课程都丢失了.

Eug*_*nec 8

你需要弄清楚你是否愿意

  1. 在库上运行proguard
  2. 在app上运行proguard(提示:就是这个.)

在库上运行proguard

那是它到达应用程序之前.您的库proguard规则负责使所有代码都可访问和存在,但您可能会混淆内部类.

这是库build.gradle:

android {
    defaultConfig {
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    buildTypes {
        release {
            minifyEnabled true // Yes, run proguard on the library itself.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您将此库作为开源发布,则不需要此.如果您不将库发布为公共,则不需要此.

我收到错误,无法找到库中的包/符号.

Proguard构建了类之间的依赖关系图.此时,库是一个独立的单元,因此如果您没有提供任何规则,则不会使用任何类,因此proguard会将它们全部删除.

在应用程序上运行proguard

让消费者(应用程序)知道要保留哪些类库.

这是库build.gradle:

android {
    defaultConfig {
        // Here's what proguard on the app should do on the library's behalf.
        consumerProguardFiles 'proguard-consumer-rules.pro' 
    }
    buildTypes {
        release {
            minifyEnabled false // No, don't proguard the library itself.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

proguard如何工作

您需要告诉proguard要保留哪些代码以及要保留的名称.Proguard会删除所有未使用的代码并拼写您不想留下的名称.

你不告诉proguard要删除什么,你告诉proguard要保留什么.


Sha*_*ark 0

好吧,由于 proguard 可能会占用您的类,请在您的appproguard-rules.pro 文件中尝试类似的操作:

keepclass my.library.package.name.** { *;}
Run Code Online (Sandbox Code Playgroud)

这应该告诉 proguard 保存所有类my.library.package.name,希望它们不会再丢失。