Proguard 在构建 aar 时不保留 类
Proguard not keeping classes when building aar
来自这个参考:
https://github.com/codepath/android_guides/wiki/Building-your-own-Android-library
我有以下 gradle 文件:
android {
compileSdkVersion 25
buildToolsVersion "26.0.2"
buildTypes {
release {
minifyEnabled true
consumerProguardFiles 'consumer-proguard-rules.pro'
}
}
}
以及以下混淆器文件:
-dontobfuscate
-optimizations !code/allocation/variable
-keep public class * {
public protected *;
}
然而,当我 运行 'assembleRelease' 构建我的发布 aar 文件的任务时,我在 aar 中的所有 类 都丢失了。
有什么想法吗?
您应该将 minifyEnabled
设置为 false
(默认值):
consumerProguardFiles
不用于立即缩小(即在构建库本身时)。它在构建库的使用者(例如应用程序)时使用。
不建议在使用前压缩库,因为在最终构建之前你无法知道哪些部分将被实际使用。图书馆通常不这样做。例如LeakCanary, ACRA, Butter Knife
一般来说,一个库必须保留操作它所需的所有方法和方法名称;例如:
-verbose
# -libraryjars ../app/libs
# -dontpreverify
# -dontobfuscate
# -dontshrink
# -dontoptimize
# keep class BuildConfig
-keep public class **.BuildConfig { *; }
# keep class members of R
-keepclassmembers class **.R$* {public static <fields>;}
问题的答案大概应该是:
# keep all public and protected method names,
# which could be used by Java reflection.
-keepclassmembernames class * {
public protected <methods>;
}
很可能需要更多的规则,而 -verbose
标志告诉人们要在其中写入什么。当针对其他代码构建库时(如上所述),仍然需要为库添加或多或少相同的规则。还有相当多的非开源库具有混淆的 class 名称。
图书馆的 build.gradle
可能看起来像这样:
android {
defaultConfig {
consumerProguardFiles 'proguard-consumer-rules.pro'
}
buildTypes {
release {
minifyEnabled false // don't proguard the library itself.
}
}
}
默认值proguard-consumer-rules.pro
解释:
The Android Gradle plugin allows to define ProGuard rules which get embedded in the AAR.
These ProGuard rules are automatically applied when a consumer app sets minifyEnabled to true.
The custom rule file must be defined using the 'consumerProguardFiles' property in your build.gradle file.
当一个库本身没有被处理时,它仍然可以带来它的 ProGuard 规则 - 为了在构建整个项目时被使用。
我没有得到你真正想做的事情,但我可以建议你一件事就是不要做 assembleRelease 而是在你的另一个项目中导入,清理项目并构建然后使用生成的 aar 来自 /build/outputs/aar/
目录。 并且必须检查您没有在任何地方使用混淆的 class 的引用。
来自这个参考:
https://github.com/codepath/android_guides/wiki/Building-your-own-Android-library
我有以下 gradle 文件:
android {
compileSdkVersion 25
buildToolsVersion "26.0.2"
buildTypes {
release {
minifyEnabled true
consumerProguardFiles 'consumer-proguard-rules.pro'
}
}
}
以及以下混淆器文件:
-dontobfuscate
-optimizations !code/allocation/variable
-keep public class * {
public protected *;
}
然而,当我 运行 'assembleRelease' 构建我的发布 aar 文件的任务时,我在 aar 中的所有 类 都丢失了。
有什么想法吗?
您应该将 minifyEnabled
设置为 false
(默认值):
consumerProguardFiles
不用于立即缩小(即在构建库本身时)。它在构建库的使用者(例如应用程序)时使用。
不建议在使用前压缩库,因为在最终构建之前你无法知道哪些部分将被实际使用。图书馆通常不这样做。例如LeakCanary, ACRA, Butter Knife
一般来说,一个库必须保留操作它所需的所有方法和方法名称;例如:
-verbose
# -libraryjars ../app/libs
# -dontpreverify
# -dontobfuscate
# -dontshrink
# -dontoptimize
# keep class BuildConfig
-keep public class **.BuildConfig { *; }
# keep class members of R
-keepclassmembers class **.R$* {public static <fields>;}
问题的答案大概应该是:
# keep all public and protected method names,
# which could be used by Java reflection.
-keepclassmembernames class * {
public protected <methods>;
}
很可能需要更多的规则,而 -verbose
标志告诉人们要在其中写入什么。当针对其他代码构建库时(如上所述),仍然需要为库添加或多或少相同的规则。还有相当多的非开源库具有混淆的 class 名称。
图书馆的 build.gradle
可能看起来像这样:
android {
defaultConfig {
consumerProguardFiles 'proguard-consumer-rules.pro'
}
buildTypes {
release {
minifyEnabled false // don't proguard the library itself.
}
}
}
默认值proguard-consumer-rules.pro
解释:
The Android Gradle plugin allows to define ProGuard rules which get embedded in the AAR.
These ProGuard rules are automatically applied when a consumer app sets minifyEnabled to true.
The custom rule file must be defined using the 'consumerProguardFiles' property in your build.gradle file.
当一个库本身没有被处理时,它仍然可以带来它的 ProGuard 规则 - 为了在构建整个项目时被使用。
我没有得到你真正想做的事情,但我可以建议你一件事就是不要做 assembleRelease 而是在你的另一个项目中导入,清理项目并构建然后使用生成的 aar 来自 /build/outputs/aar/
目录。 并且必须检查您没有在任何地方使用混淆的 class 的引用。