将依赖关系更新到最新版本后,由于缺少接口实现,我们在发行版本中遇到了运行时崩溃
java.lang.IncompatibleClassChangeError:
Class 'com.mypackage.app.data.cache.query.user.QueryUserFollowersCountById'
does not implement interface 'com.mypackage.app.data.cache.query.Query'
in call to 'java.lang.String[] com.mypackage.app.data.cache.query.Query.c()'
(declaration of 'com.mypackage.app.data.cache.database.util.Db'
appears in /data/app/com.mypackage.app-2/base.apk:classes2.dex)
经过两天的调试,我们认为问题与Proguard在收缩阶段剥离“实现查询”有关。该接口本身保留不变,因为它在数百个其他类中使用,但仅在3个类中丢失。我们还发现在某些地方以相同的方式剥离了一些RxJava Func0和Action0接口。因此,该应用程序可以在95%的屏幕上完美运行,但显然会在缺少界面实现的地方崩溃。
使用Dagger 2.11或-dontshrink构建的字节码
.class public Lcom/mypackage/app/data/cache/query/user/QueryUserFollowersCountById;
.super Ljava/lang/Object;
.source "SourceFile"
# interfaces
.implements Lcom/mypackage/app/data/cache/query/Query;
# annotations
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Object;",
"Lcom/mypackage/app/data/cache/query/Query<",
"Ljava/lang/Integer;",
">;"
}
.end annotation
......
使用Dagger 2.12或更高版本构建时的字节码
.class public Lcom/mypackage/app/data/cache/query/user/QueryUserFollowersCountById;
.super Ljava/lang/Object;
.source "SourceFile"
# annotations
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/lang/Object;"
}
.end annotation
......
我们显然希望使用Dagger2的最新版本,并希望通过Proguard继续缩小和优化我们的代码。
答案 0 :(得分:0)
如果proguard删除了工具部分,则在优化阶段,proguard更有可能将其视为无效代码。
您已经提到
通过将minifyEnabled设置为false或对Proguard使用-dontshrink标志可以解决此问题
这证实了我的假设,即实现部分可能是无效代码
请仔细阅读此thread,这说明了如何获取无效代码列表。换句话说,有关使用-printusage [filename]
添加调试日志的查询的答案