Gradle Advanced Build Plugin:无法调用canRead()?

时间:2015-08-06 23:28:10

标签: android android-studio gradle android-gradle

我试图在我的应用中使用Gradle Advanced Build Version Plugin。我按照GitHub页面中的描述进行了操作:

  1. 我在我的app的build.gradle中添加了这段代码:

    buildscript {
      repositories {
          jcenter()
      }
    
      dependencies {
          classpath 'org.moallemi.gradle.advanced-build-version:gradle-plugin:1.5.0'
      }
    }
    apply plugin: 'org.moallemi.advanced-build-version'
    
  2. 然后,在同一个文件的末尾,我像这样配置advancedVersioning

    advancedVersioning {
        outputOptions {
            renameOutput true
            nameFormat '${projectName}-${buildType}-${versionName}'
        }
    }
    
  3. 但是,当我Generate a Signed APK时,我在执行:app:assembleRelease任务时遇到错误:

    Error:
    
    02:06:47.075 [ERROR] [org.gradle.BuildExceptionReporter] 
    02:06:47.076 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE:
    Build failed with an exception. 
    02:06:47.076 [ERROR] [org.gradle.BuildExceptionReporter] 
    02:06:47.077 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
    02:06:47.077 [ERROR] [org.gradle.BuildExceptionReporter] A problem occurred
    configuring project ':app'.
    02:06:47.077 [ERROR] [org.gradle.BuildExceptionReporter]
    Cannot invoke method canRead() on null object
    02:06:47.078 [ERROR] [org.gradle.BuildExceptionReporter] 
    02:06:47.078 [ERROR] [org.gradle.BuildExceptionReporter] * Try: 
    02:06:47.078 [ERROR] [org.gradle.BuildExceptionReporter] Run with  --stacktrace option to
    get the stack trace.
    

    这是在带有gradle插件1.2.3的Android Studio 1.3上。我尝试将步骤#1中的代码移动到Project的build.gradle中,但我仍然得到相同的错误。

1 个答案:

答案 0 :(得分:2)

这似乎是导致NullPointerException的简单错误。

versionPropsFile类的VersionCodeOptions属性仅在getVersionCode getter中初始化。

但是插件在调用getVersionCode之前尝试访问此属性,从而接收到空文件引用,当它检查canRead()时是否会崩溃。

解决方法非常简单:您需要做的就是在配置插件后立即对getVersionCode getter进行虚拟调用,如下所示:

在项目的build.gradle中:

advancedVersioning {
    nameOptions {
    }
    codeOptions {
        versionCodeType VersionCodeType.AUTO_INCREMENT_ONE_STEP
        dependsOnTasks 'release'
    }
}

println advancedVersioning.versionCode

通过打印版本代码,我正在调用getter,从而创建文件对象。