我有一个简单的类(KeyManagementViewModel),它引用了我的另一个类(UserConfigRepository):
public class KeyManagementViewModel extends ViewModel {
private LiveData<ErrorWrapper<UserConfig>> userConfig;
private UserConfigRepository repo;
public LiveData<ErrorWrapper<UserConfig>> getUserConfig() {
if (userConfig == null) {
repo = new UserConfigRepository(userId); //BREAKPOINT HERE
userConfig = repo.getUserConfigLive(); //CAN'T RESOLVE "repo" here
}
return userConfig;
}
}
在我的build.gradle项目中,我有
buildscript {
repositories {
jcenter()
google()
maven {
url 'https://maven.fabric.io/public'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1' //CAN'T BE UPGRADED
classpath 'com.google.gms:google-services:4.2.0'
classpath 'io.fabric.tools:gradle:1.29.0'
}
}
通过这种配置,我可以在我评论的行中的KeyManagementViewModel.getUserConfig
中放置一个断点,如果我进入仓库的getUserConfigLive
,一切都可以正常工作。但是,当我将com.android.tools.build:gradle更新为3.3.0或3.4.2 时,现在断点仍然可以正常工作,但是如果我进入仓库的getUserConfigLive()
,我看不到我的类的源代码,并且在repo类内的任何断点都不会被击中。我知道代码正在执行,因为我在repo类中的日志仍显示在控制台中。我注意到的另一件事是,如果我在“ BREAKPOINT HERE”注释后的之后插入行,即使repo
是“ repo = No such instance field:'repo'”在行之前实例化。好像调试器处于无法识别我的Repo类或当前状态的怪异状态。这是进入getUserConfigLive()
之后的堆栈跟踪,表明它无法将repo类识别为我自己的或该字段为有效。知道是什么原因引起的或如何解决?我在最新的IntellJ Idea和最新的Android Studio中有相同的问题。我正在使用Gradle 5.1.1
答案 0 :(得分:0)
罪魁祸首是gradle插件3.3.0中引入的新R8收缩器 https://developer.android.com/studio/releases/gradle-plugin#behavior-changes
由于某种原因,R8混淆了我的UserConfigRepository
类,而Proguard却没有。这不是一个长期的解决方案,但是禁用缩小功能是一个很好的测试。我的长期解决方案是将minSdkVersion
增加到21,所以我得到了新的implicit multidex support并被允许在调试应用程序中禁用最小化,无论如何这是推荐的方法