5

我有一个关于 R8 的问题。在MyLib我有公共摘要MyLibsClass中,我在其中保护了方法。MyChildClass从R8 的魔法MyLibsClass中和之后扩展,所有受保护的方法(包括受保护的抽象)都更改为公共方法,当然我在尝试覆盖受保护的抽象方法时遇到了问题。MyAppMyLibsClassMyChildClass"attempting to assign weaker access privileges ('protected'); was 'public')

附加信息

gradle-6.0.1

MyLib 的 build.gradle

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}

proguard-rules.pro

-keep class com.example.mylib.*{
    public protected *; }

-keep class com.example.mylib.*$*{
    public protected *; }

有人遇到过这种问题或知道解决方法吗?

4

3 回答 3

4

所以根据这里的讨论,

不要对库使用默认的 PROGUARD 设置

asallowAccessModification在默认的 proguard 设置中启用,它位于 Android SDK 中(\Android\Sdk\tools\proguard\proguard-android-optimize.txt),我的错误是在我的库中使用它。

来自proguard 手册的引用

在处理要用作库的代码时,您可能不应该使用此选项,因为未设计为在 API 中公开的类和类成员可能会变成公开的。

因此,如果有人有同样的问题,我会建议创建您自己的基本配置文件proguard并复制过去的整个默认配置而不复制"allowAccessModification"到其中。

此外,如果有人更感兴趣,您可以跟踪问题。希望能在近功能中为库获得单独的配置文件。

于 2020-01-13T11:21:42.177 回答
1

这也报告在 R8 错误跟踪器上,并在那里解决。请参阅http://issuetracker.google.com/147447502

于 2020-01-13T11:04:38.923 回答
0

我遇到了同样的问题,感谢@Hayk Nahapetyan 的回答,我可以解决它。

这是我的解决方案,其中包含更多细节。

在 library 模块的 build.gradle 中,从buildTypes'srelease闭包中删除默认文件:

release {
    minifyEnabled true
    proguardFiles 'proguard-rules.pro'
}

R8 不再使用 Android SDK 中提供的默认文件。它在构建时生成一个,并将其放在模块的构建目录中build/intermediates/default_proguard_files/global

proguard-android-optimize.txt-a.b.c将该位置的内容(a.b.c库版本在哪里,如果已设置)复制到模块的proguard-rules.pro. 然后删除-allowaccessmodification;两次,如果它最初出现在两个文件中。

于 2021-10-14T08:11:39.067 回答