Ошибка сборки Gradle после обновления Android studio: исключение NumberFormatException для versionCode

#android-studio #gradle

#android-studio #gradle

Вопрос:

Я получил ошибку, которой раньше не было:

 Execution failed for task ':app:generateDebugBuildConfig'.
> Failed to calculate the value of task ':app:generateDebugBuildConfig' property 'buildConfigPackageName'.
   > Failed to query the value of property 'packageName'.
      > java.lang.NumberFormatException: For input string: "${versionCode}"
 

Версия Android studio:

 Android Studio 4.1.1
Build #AI-201.8743.12.41.6953283, built on November 5, 2020
Runtime version: 1.8.0_242-release-1644-b3-6222593 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
 

Файл build.gradle(:app) содержит следующее:

 apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

apply plugin: 'kotlin-kapt' //< for image visualization with glide

//Serialization
apply plugin: 'kotlinx-serialization'


android {
    signingConfigs {
        release {
            storeFile file('xxxx.jks')
            storePassword 'xxxxxxx'
            keyPassword 'xxxxxxxx'
            keyAlias 'my-app'
        }
    }
    compileSdkVersion propCompileSdkVersion
    buildToolsVersion propBuildToolsVersion

    defaultConfig {
        applicationId "com.user.myapp"
        minSdkVersion propMinSdkVersion
        targetSdkVersion propTargetSdkVersion
        versionCode 3
        versionName "2.0-beta.26"
        manifestPlaceholders = [versionCode:"3", versionName:"2.0-beta.26"]
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            applicationIdSuffix ".debug"
            debuggable true
            resValue "string", "app_name", "myapp-dev"
        }

        optimizedDebug {
            initWith debug
            minifyEnabled false
            applicationIdSuffix ".optimizedDebug"
            debuggable false
            resValue "string", "app_name", "myapp-optimized-dev"
        }

        debugProd {
            initWith debug
            minifyEnabled false
            applicationIdSuffix ".debugProd"
            debuggable true
            resValue "string", "app_name", "myapp-logs-in-prod"
        }

        release {
            minifyEnabled false
            resValue "string", "app_name", "myapp"
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

    applicationVariants.all { variant ->
        variant.resValue "string", 'images_file_path', "Android/data/"${applicationId}"/files/Pictures"
    }

    /* Necessary to have Parcelable / @Parcelize functionalities */
    androidExtensions {
        experimental = true
    }


    lintOptions {
        checkReleaseBuilds false
        abortOnError true
    }
}

dependencies {
    ...
}

repositories {
    mavenCentral()
}
 

Я аннулировал кеши и перезапускал несколько раз, ничего не меняется.
Я хотел бы точно определить, что происходит, чтобы, по крайней мере, иметь возможность понять, что вызывает путаницу gradle.
Может кто-нибудь указать мне на пошаговый запуск gradle, чтобы выяснить, в чем проблема?

Комментарии:

1. Примечание: он отлично работает с Android studio 4.1.0

Ответ №1:

Я обнаружил, что в манифесте у меня была следующая ошибка, аннотированная android studio:

     <?xml version="1.0" encoding="utf-8"?>
    <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.user.myapp"
        android:versionCode={$versionCode}
        android:versionName={$versionName}
        >
        ...
    </manifest>
 

Похоже, что в версии 4.1.1 android studio
android:versionCode={$versionCode}
больше не работает.

Этот пост https://commonsware.com/blog/2020/10/14/android-studio-4p1-library-modules-version-code.html говорит, что мы больше не должны использовать VERSION_CODE и VERSION_NAME. Поэтому я полностью удаляю их из своего кода и заменяю его пользовательскими переменными BuildConfigField gradle:

в gradle:

     defaultConfig {
        ...
        buildConfigField 'int', 'MYAPP_VERSION_CODE', "3"
        buildConfigField 'String', 'MYAPP_VERSION_NAME', ""2.0-beta.26""
        ...
    }
 

в манифесте удалите часть, ссылающуюся на android: versionXXXX:

     <?xml version="1.0" encoding="utf-8"?>
    <manifest
        xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.user.myapp"
        >
        ...
    </manifest>
 

в коде kotlin для отображения кода и названия версии:

     val versionCode = BuildConfig.MYAPP_VERSION_CODE.toString()
    val versionName = BuildConfig.MYAPP_VERSION_NAME
 

После этого все работает хорошо.