我想在我的库上使用proguard,但是应该在库中设置文件(规则)。这意味着我不想在我的app模块中明确设置规则w(属于库)。
我发现有类似 consumerProguardFiles 属性的内容。我的设置:
库gradle:
buildTypes {
debug {
debuggable true
minifyEnabled false
}
release {
minifyEnabled true
consumerProguardFiles 'proguard-rules.pro'
}
}
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'
}
}
为什么上面的配置不起作用?我发现无法找到来自库中的包/符号的错误。
编辑:
重要的是我的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
(...)
超过一个手工错误。我可以看到我的所有课程都缺失了。
答案 0 :(得分:5)
您需要弄清楚是否要
BEFORE 它到达应用程序。您的库proguard规则负责使所有代码都可访问和存在,但您可能会混淆内部类。
这是库build.gradle:
android {
defaultConfig {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
buildTypes {
release {
minifyEnabled true // Yes, run proguard on the library itself.
}
}
}
如果您将此库作为开源发布,则不需要此项。如果您不将该库公开发布,则不需要此。
我发现无法找到库中的包/符号的错误。
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.
}
}
}
您需要告诉proguard要保留哪些代码以及要保留的名称。 Proguard删除了所有未使用的代码并拼写了你不想留下的名字。
你不告诉proguard要删除什么,你告诉proguard要保留什么。
答案 1 :(得分:0)
好的,既然proguard可能会耗尽您的课程,请在app
的proguard-rules.pro文件中尝试这样的事情:
keepclass my.library.package.name.** { *;}
应告诉proguard保存my.library.package.name
中的所有classess,所以希望它们不会再丢失了。