内部接口实现类的ProGuard配置问题求助
解决ProGuard混淆内部类访问合成方法的警告问题
首先,咱们先搞清楚问题根源:从警告里的com.example.DownloadService$Downloader能看出来,Downloader是DownloadService的内部类。当内部类访问外部类的私有/包级成员时,Java编译器会自动生成access$XXX这类合成方法,用来让内部类突破访问权限限制。ProGuard混淆时如果误删了这些合成方法,或者重命名后内部类找不到它们,就会抛出这种警告。
你之前的配置无效,主要是两个原因:
- 没有明确保留
DownloadService的内部类Downloader及其依赖的合成方法 Callback接口的路径写错了(如果Downloader是内部类,它的接口应该是com.example.DownloadService$Downloader$Callback,而不是com.example.tasks.Downloader$Callback)
正确的ProGuard配置方案
把下面的配置添加到你的proguard.cfg文件里:
# 保留DownloadService本身及其所有内部类,包括所有成员和方法(含合成的access$XXX方法) -keep class com.example.DownloadService { *; } -keep class com.example.DownloadService$* { *; } # 保留Downloader内部的Callback接口,确保回调方法不被混淆 -keep public interface com.example.DownloadService$Downloader$Callback { public protected <methods>; }
如果想更简洁,也可以用通配符合并配置:
-keep class com.example.DownloadService** { *; } -keep public interface com.example.DownloadService$Downloader$Callback { public protected <methods>; }
额外说明
如果你的Downloader确实是独立的顶级类(不是内部类),那警告里的$就很奇怪,这时候你需要检查代码结构是否和你提供的示例一致。但根据警告信息来看,Downloader肯定是DownloadService的内部类,所以上面的配置应该能解决问题。
内容的提问来源于stack exchange,提问作者Binoy Babu
相关产品推荐
相关产品推荐

