BuildConfig не создается правильно (Gradle Android)

Я пытаюсь преобразовать наше приложение для Android в сборку Gradle. У меня есть проект, и его библиотеки успешно строятся. Сейчас я пытаюсь создать отдельные apks для наших различных сред (у dev / test / prod разные URL-адреса для остальных служб, которые они используют).

При поиске вокруг, лучший способ, который я чувствую, это сделать разные BuildConfig для каждой среды. Вот что я попробовал:

import java.util.regex.Pattern

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:+'
    }
}

apply plugin: 'android'

task('increaseVersionCode') << {
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

tasks.whenTaskAdded { task ->
    if (task.name == 'generateReleaseBuildConfig') {
        task.dependsOn 'increaseVersionCode'
    }
}

dependencies {
    compile 'com.android.support:support-v4:19.0.0' 
    compile files('libs/commons-io-2.4.jar',
                  'libs/google-play-services.jar',
                  'libs/gson-2.2.4.jar',
                  'libs/universal-image-loader-1.8.6.jar',
                  'libs/wakeful-1.0.1.jar')
    compile project(':pulltorefresh_lib')
    compile project(':edgeeffect_lib')
    compile project(':viewpagerindicator_lib')        
}

android {
    buildToolsVersion "18.1.1"
    compileSdkVersion "Google Inc.:Google APIs:18"

    defaultConfig { 
       minSdkVersion 14
       targetSdkVersion 18
    }

    buildTypes {
        debug {
            packageNameSuffix ".debug"
        }
        dev.initWith(buildTypes.debug)
        dev {
            buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\";"
            buildConfigField "String", "URL_CONNECT", "\"https://dev-connect.example.com\";"
            buildConfigField "String", "URL_SVC_NEWSLIST", "\"https://dev-mobilenews.example.com/newslist\";"
            buildConfigField "String", "URL_SVC_NEWSDETAIL", "\"https://dev-mobilenews.example.com/newsdetail\";"
            buildConfigField "String", "URL_SVC_REGISTERENDPOINTS", "\"https://dev-mobilenews.example.com/registerendpoints\";"
        }
        prod.initWith(buildTypes.release)
        prod {
            buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\";"
            buildConfigField "String", "URL_CONNECT", "\"https://connect.example.com\";"
            buildConfigField "String", "URL_SVC_NEWSLIST", "\"https://mobilenews.example.com/newslist\";"
            buildConfigField "String", "URL_SVC_NEWSDETAIL", "\"https://mobilenews.example.com/newsdetail\";"
            buildConfigField "String", "URL_SVC_REGISTERENDPOINTS", "\"https://mobilenews.pdc-np-cf.lmig.com/registerendpoints\";"          
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}

Проблема в том, что мой BuildConfig.java, похоже, не вводит статические переменные, поэтому я получаю ошибки, похожие на:

/Users/path/to/project/MainActivity.java:348: error: cannot find symbol
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.URL_SEARCH)));
                                                                              ^
  symbol:   variable URL_SEARCH
  location: class BuildConfig
/Users/path/to/project/MainActivity.java:359: error: cannot find symbol
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(BuildConfig.URL_CONNECT)));
                                                                              ^
  symbol:   variable URL_CONNECT
  location: class BuildConfig
/Users/path/to/project/MainActivity.java:600: error: cannot find symbol
            HttpPost httpPost = new HttpPost(BuildConfig.URL_SVC_REGISTERENDPOINTS);
                                                        ^
  symbol:   variable URL_SVC_REGISTERENDPOINTS
  location: class BuildConfig
/Users/path/to/project/service/AlarmNotificationService.java:145: error: cannot find symbol
        String requestUrl = BuildConfig.URL_SVC_NEWSLIST + "?"
                                       ^
  symbol:   variable URL_SVC_NEWSLIST
  location: class BuildConfig
/Users/path/to/project/service/NewsService.java:240: error: cannot find symbol
        String requestUrl = BuildConfig.URL_SVC_NEWSLIST + "?"
                                       ^
  symbol:   variable URL_SVC_NEWSLIST
  location: class BuildConfig
/Users/path/to/project/service/NewsService.java:530: error: cannot find symbol
            HttpPost httpPost = new HttpPost(BuildConfig.URL_SVC_NEWSDETAIL);
                                                        ^
  symbol:   variable URL_SVC_NEWSDETAIL
  location: class BuildConfig
6 errors

Мой файл build / source / buildConfig / debug / com /.../ BuildConfig.java содержит:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com....;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String PACKAGE_NAME = "com.....debug";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 5;
}

Что я делаю неправильно?

20 ответов

Решение

Пожалуйста, убедитесь, что вы создаете вариант "dev" или "prod". В варианте "отладка" и "выпуск" по умолчанию нет определения BuildConfig. В Android Studio вы можете выбрать текущий вариант в левом нижнем углу:

Варианты сборки

Чтобы упростить ваш файл build.gradle, вы можете определить:

buildTypes {
    debug {
        buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\""
        // etc.
    }
    release {
        buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\""
        // etc.      
    }
}

а затем просто используйте стандартные варианты "debug" и "release".

Наконец, удалите точку с запятой (знак: ';') из значения параметра buildConfigField.

В моем случае мне пришлось включить buildConfig как функцию сборки.

      android {
    buildFeatures {
        buildConfig true
    }
}

Сначала сделать

File -> Invalidate Caches/Restart... -> Invalidate and Restart 

тогда делай

Build -> Clean Project

тогда делай

Build - > Rebuild Project 

У меня была та же проблема, и я исправил ее как показано ниже:

buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'

На всякий случай это поможет кому-то другому, в моем случае это был отсутствующий импорт:import uk.co.yourpackage.yourapp.BuildConfig;

Так или иначе, нигде в документе не упоминается, что вам нужно это включить! Заставил меня подумать, что он каким-то образом автоматически импортировался, но это не так. По крайней мере, не для меня... Так много времени потеряно... Надеюсь, это поможет другому новичку, как я!

Стараться сделать

Сборка -> Чистый проект

тогда делай

Сборка -> Перестроить проект

Если не работает, попробуйте

File -> Invalidate Caches/Restart... -> Invalidate and Restart

тогда делай

Сборка -> Чистый проект

тогда делай

Сборка -> Перестроить проект

Вам необходимо иметь эту строку в своемgradle.propertiesфайл:

      android.defaults.buildfeatures.buildconfig=true

Надеюсь это поможет

Я решаю эту проблему, как указано ниже, в этом случае студия Android сама сгенерирует файл конфигурации сборки.

      File -> Sync Project with Gradle Files

Очень логичный ответ, если это не хеппенинг в сочинении

          buildFeatures {
    // The first line should already be in your project!
    compose = true
    buildConfig = true
    }

Теперь будет сгенерирован файл, и вы сможете использовать BuildConfig.Debug в приложении и везде.

Для версии Android Studio

Android-студия «Дельфин» | 2021.3.1 Исправление 1

Сборка № АИ-213.7172.25.2113.9123335 от 30 сентября 2022 г.

Версия среды выполнения: 11.0.13+0-b1751.21-8125866 aarch64 VM: 64-разрядная виртуальная машина сервера OpenJDK от JetBrains sro

Что я пытался сделать?

Я настроил три варианта сборки для модуля приложения, я хотел, чтобы BuildConfig менялся каждый раз, когда я меняю вариант сборки, для этой конкретной переменной, определенной в конфигурациях build.gradle (приложения).

Что не сработало

Я пробовал все три метода, ВООБЩЕ НЕ РАБОТАЛИ , чтобы восстановить мой BuildConfig для варианта сборки, который я менял:

  1. File > invalidate cache and restartвместе сBuild > Clean Project&Build > Rebuild Project
  2. один
  3. один

Что сработало

Затем я попробовал комбинацию, которая на удивление ХОРОШО РАБОТАЕТ :

  1. Первая попыткаBuild > Make Project
  2. ЗатемFile > Sync Project with Gradle Files

Я надеюсь, что это сработает для этой конкретной версии. Я не уверен, что для других версий Android Studio.

Спасибо @ravi и @ibrokhim за частичный ответ по делу.

Вот что исправило это для меня:

File -> Invalidate Caches/Restart... -> Invalidate and Restart 

Если вы изменяете свои переменные среды, и они неправильно отображаются в студии Android, попробуйте сделать:

Build -> Clean Project 
File -> Invalidate Caches/Restart... -> Invalidate and Restart 

Следуй этим шагам:

Шаг 1

      File -> Invalidate Caches/Restart... -> Invalidate and Restart 

Шаг 2

      Build -> Clean Project

Шаг 3

      Build - > Rebuild Project 

Попробовав все, у меня сработало переключение варианта сборки и выбор « Сборка»> «Сделать проект» .

Я сделал все, что было в ответах, но все равно не сработал. Я решил свою проблему, изменив имя пакета в manifest.xml файл, который еще не был обновлен:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android">

В массиве project.ext.envConfigFiles убедитесь, что вы установили отладку в правильный файл.env, который вы используете для разработки.

В моем случае я ожидал, что BuildConfig для моего нового созданного модуля gradle. Но забыл добавить его как зависимость в app: module.

Ни одно из решений не сработало для меня, я закрыл проект и снова открыл его, а затем перестроил его, потому что он очищает все сгенерированные данные при закрытии, и это сработало, спасибо.

У меня была похожая проблема, связанная с типами сборки, которые настраивались с использованием.initWith(someotherbuildtype), BuildConfig создавался неправильно. Мне пришлось переключиться на родительский вариант сборки и сначала собрать его, затем типы сборки, которые initWith родительского построил нормально.

В моем случае было строковое поле resValue "string", "app_name", "MyApp"в strings.xml, а также во вкусах продуктов.

Я сделал Invalidate Cachesтогда Rebuildзатем android studion с учетом фактической ошибки дублирования ресурсов.

так Invalidate caches -> Rebuild -> Remove string resources which were already in buildconfigfield resvalueработал на меня

я использовал Android Studio Bumblebee 2021.1.1

Другие вопросы по тегам