将com.android.tools.build:gradle更新为3.3.0或3.4.X

时间:2019-07-10 15:28:45

标签: android android-studio intellij-idea

我有一个简单的类(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

enter image description here

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并被允许在调试应用程序中禁用最小化,无论如何这是推荐的方法