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 для варианта сборки, который я менял:
-
File > invalidate cache and restart
вместе сBuild > Clean Project
&Build > Rebuild Project
- один
- один
Что сработало
Затем я попробовал комбинацию, которая на удивление ХОРОШО РАБОТАЕТ :
- Первая попытка
Build > Make Project
- Затем
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