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 的引用。