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

los*_*ion 11 android aar android-proguard

从这个参考:

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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下proguard文件:

-dontobfuscate
-optimizations !code/allocation/variable

-keep public class * {
    public protected *;
}
Run Code Online (Sandbox Code Playgroud)

但是当我运行'assembleRelease'任务来构建我的发布aar文件时,aar中的所有类都丢失了.

有任何想法吗?

bwt*_*bwt 7

您应该设置minifyEnabledfalse(默认值): consumerProguardFiles不用于立即缩小(即构建库本身时).它是在构建库(例如应用程序)的使用者时使用的.

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


Mar*_*ler 5

一般来说,一个库必须保留操作它所需的所有方法和方法名称;例如:

-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>;}
Run Code Online (Sandbox Code Playgroud)

问题的答案可能应该是:

# keep all public and protected method names,
# which could be used by Java reflection.
-keepclassmembernames class * {
    public protected <methods>;
}
Run Code Online (Sandbox Code Playgroud)

很可能还需要一些更多的规则,而-verbose标志告诉人们要写入其中的内容。当针对其他代码构建库时(如上所述),仍然需要为库添加或多或少相同的规则。还有相当多的非开源库具有模糊的类名。

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

android {
    defaultConfig {
        consumerProguardFiles 'proguard-consumer-rules.pro' 
    }
    buildTypes {
        release {
            minifyEnabled false // don't proguard the library itself.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

默认proguard-consumer-rules.pro解释如下:

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

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

必须使用 build.gradle 文件中的“consumerProguardFiles”属性定义自定义规则文件。

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