Proguard在建造aar时没有保持课程

时间:2018-01-02 20:22:38

标签: android android-proguard 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'
        }
    }
}

以下proguard文件:

-dontobfuscate
-optimizations !code/allocation/variable

-keep public class * {
    public protected *;
}

然而,当我运行' assembleRelease'时,我的所有课程都缺失了。任务来构建我的发布aar文件。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

您应该将minifyEnabled设置为false(默认值): consumerProguardFiles不用于立即缩小(即在构建库本身时)。它是在构建库的消费者(例如应用程序)时使用的。

建议不要在消费之前缩小库,因为在最终构建之前您无法知道实际使用哪些部分。图书馆通常不会这样做。例如LeakCanaryACRAButter Knife

答案 1 :(得分:4)

通常,库必须保留操作它所需的所有方法和方法名称;例如:

-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标志告诉一个要写入的内容。当针对其他代码构建库时(如上所述),仍然需要为库添加或多或少相同的规则。还有一些非开源的库具有模糊的类名。

图书馆的build.gradle可能看起来像这样:

android {
    defaultConfig {
        consumerProguardFiles 'proguard-consumer-rules.pro' 
    }
    buildTypes {
        release {
            minifyEnabled false // don't proguard the library itself.
        }
    }
}

默认proguard-consumer-rules.pro解释了它:

  

Android Gradle插件允许定义嵌入AAR的ProGuard规则。

     

当消费者应用将minifyEnabled设置为true时,会自动应用这些ProGuard规则。

     

必须使用&#39; consumerProguardFiles&#39;定义自定义规则文件。 build.gradle文件中的属性。

当图书馆本身没有被处理时,它仍然可以带来它的ProGuard规则 - 以便在构建整个项目时使用它。

答案 2 :(得分:1)

我没有得到你真正想要做的事情,但是我可以建议你做一件事就是不做汇编而是在你的另一个项目中导入,清理项目并构建然后使用生成的 aar 来自/build/outputs/aar/目录。 并且必须检查您是否在任何地方都没有使用混淆类的引用。