警告:在库类android.graphics.Canvas中找不到引用的方法'int save(int)'

时间:2019-09-07 18:26:24

标签: android proguard

我在其中一个应用程序中使用了不再维护的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.**忽略警告,这实际上会使构建通过。

为什么这个警告首先开始出现,并且忽略它会有任何后果吗?

1 个答案:

答案 0 :(得分:1)

让我们分析警告消息:

  

警告:com.sothree.slidinguppanel.SlidingUpPanelLayout:找不到   库类中引用的方法'int save(int)'   android.graphics.Canvas

库的SlidingUpPanelLayout.java源文件确实includesandroid.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警告:

  • 由于此方法不再是公共API的一部分,因此特定供应商可能会以导致运行时错误的方式更改框架类(即,通过重命名/删除此方法)。
  • 此方法可能会在将来的AOSP版本中删除,直到在受影响的设备上调用此方法之前,您可能不会注意到。

警告忽略规则可以缩小为:

-dontwarn com.sothree.slidinguppanel.SlidingUpPanelLayout

从长远来看,我建议考虑自己修补此库(通过更改功能以使用无参数的android.graphics.Canvas#save()方法),或者如果不可能,则迁移到另一个解决方案。