Proguard在构建aar时无法保留类

12

从这个参考链接中:

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文件时,所有aar中的课程都会消失。

有什么想法吗?


请分享您的consumer-proguard-rules.pro文件。 - Aditya
这是我的consumer-proguard-rules.pro文件。 - lostintranslation
@lostintranslation,请看下面您的ProGuard规则的更正。 - Martin Zeitler
3个回答

11
你应该将 minifyEnabled 设置为 false(默认值): consumerProguardFiles 不用于立即缩小(即构建库本身时)。它用于构建库的使用者(例如应用程序)。
在消费之前缩小库不被推荐,因为在最终构建之前你无法知道哪些部分实际上会被使用。通常库不这样做,例如:LeakCanaryACRAButter Knife

我试图跟随这样的内容。https://medium.com/google-developers/smallerapk-part-2-minifying-code-554560d2ed40 如果我将minify设置为false,那么proguard仍然会运行吗? - lostintranslation
不会立即运行,只有当使用者选择使用它(通过自己的minifyEnabled)时,ProGuard 才会运行。如果确实使用了它,你的 consumer-proguard-rules.pro 文件将被合并并应用。 - bwt
1
如果它不是一个开源库(并且仅对消费者应用程序可访问的代码被排除在混淆和缩小范围之外),该怎么办? - amar

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>;}

这个问题的答案可能是:

# 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插件允许定义ProGuard规则,这些规则将嵌入到AAR中。当消费者应用程序将minifyEnabled设置为true时,这些ProGuard规则会自动应用。必须使用build.gradle文件中的'consumerProguardFiles'属性来定义自定义规则文件。即使库本身未被处理,它仍然可以带来其ProGuard规则-以便在构建整个项目时被消费。

0

我不太明白你想做什么,但我可以给你一个建议,就是不要使用assembleRelease,而是在另一个项目中导入,清理项目并构建,然后使用从/build/outputs/aar/目录生成的aar文件。同时一定要检查你没有在任何地方使用混淆类的引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接