我在其中一个应用程序中使用了不再维护的Umano的AndroidSlidingUpPanel库:
dependencies {
// .. redacted
implementation 'com.sothree.slidinguppanel:library:3.4.0'
}
到目前为止一切正常。今天,我尝试将compileSdkVersion
从27更改为28,并且发布版本因Proguard错误(minifyEnabled
设置为 true )而开始失败:
$ ./gradlew clean assembleRelease
> Task :app:transformClassesAndResourcesWithProguardForRelease FAILED
ProGuard, version 6.0.3
Reading input...
// many lines with 'Reading program jar...', redacted
Initializing...
Warning: com.sothree.slidinguppanel.SlidingUpPanelLayout: can't find referenced method 'int save(int)' in library class android.graphics.Canvas
// redacted
Warning: there were 1 unresolved references to library class members.
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
> java.io.IOException: Please correct the above warnings first.
BUILD FAILED in 2s
我使用的是AGP v3.5.0,其配置为android.enableR8=false
,以使Proguard优于R8。
this issue中的注释之一建议使用-dontwarn com.sothree.**
忽略警告,这实际上会使构建通过。
为什么这个警告首先开始出现,并且忽略它会有任何后果吗?
答案 0 :(得分:1)
让我们分析警告消息:
警告:com.sothree.slidinguppanel.SlidingUpPanelLayout:找不到 库类中引用的方法'int save(int)' android.graphics.Canvas
库的SlidingUpPanelLayout.java
源文件确实includes是android.graphics.Canvas#save(int)
方法调用:
final int save = canvas.save(Canvas.CLIP_SAVE_FLAG);
此方法是deprecated since API 26,以前是marked as @removed in API 28。
doclava工具(AOSP工具会生成公共框架API存根,又名@removed
)使用@hide
注释(以及android.jar
注释)将公共类方法标记为隐。
总结:android.graphics.Canvas#save(int)
方法已从公共API中删除,但它仍然是运行时/框架的一部分(另请参见this)。在缩小阶段,Proguard会分析字节码,显然无法找到not-anymore-public-api android.graphics.Canvas#save(int)
方法并显示以上警告。
此方法仍在运行时中存在,因此在给出以下两个警告后,可以忽略Proguard警告:
警告忽略规则可以缩小为:
-dontwarn com.sothree.slidinguppanel.SlidingUpPanelLayout
从长远来看,我建议考虑自己修补此库(通过更改功能以使用无参数的android.graphics.Canvas#save()
方法),或者如果不可能,则迁移到另一个解决方案。