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
My 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;
}
Что я делаю неправильно?
Ответы
Ответ 1
Пожалуйста, убедитесь, что вы строите вариант "dev" или "prod". В определении по умолчанию "debug" и "release" нет определения BuildConfig. В Android Studio вы можете выбрать текущий вариант в левом нижнем углу:
![Build Variants]()
Чтобы упростить файл build.gradle, вы можете определить:
buildTypes {
debug {
buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\""
// etc.
}
release {
buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\""
// etc.
}
}
а затем просто используйте варианты "отладки" и "выпуска" по умолчанию.
Наконец, удалите точку с запятой (знак: ';') из значения параметра buildConfigField.
Ответ 2
У меня была такая же проблема и исправил ее, как показано ниже:
buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
Ответ 3
На всякий случай, который помогает кому-то другому, в моем случае это был недостающий импорт:
import uk.co.yourpackage.yourapp.BuildConfig;
Как-то, нигде в документе не упоминается, что вы нуждаетесь в этом! Сделал меня думать, что он был автоматически импортирован как-то, но это НЕ. не для меня, по крайней мере... Так много времени потеряно... Надеюсь, что поможет другому новичку, как я!
Ответ 4
У меня была аналогичная проблема, связанная с настройкой типов сборки с использованием .initWith(someotherbuildtype), BuildConfig не создавался должным образом. Мне пришлось переключиться на родительский вариант сборки и построить его сначала, а затем типы сборки, которые initWith родительский построил отлично.
Ответ 5
Вот что исправило это для меня:
File -> Invalidate Caches/Restart... -> Invalidate and Restart
Ответ 6
В массиве project.ext.envConfigFiles убедитесь, что для отладки задан правильный файл .env, который вы используете для разработки