BuildConfig не создается правильно (Gradle Android)
Я пытаюсь преобразовать наше приложение для Android в сборку gradle. У меня есть проект, и он успешно строится. Теперь я пытаюсь создать отдельные apks для наших различных сред (dev/test/prod имеют разные URL-адреса для служб restful, которые они потребляют).
в поиске вокруг, лучший способ, который я чувствую, чтобы сделать это, - это сделать разные 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
моя сборка / источник / 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;
}
что я делаю не так?
4 ответов
пожалуйста, убедитесь, что вы создаете вариант "dev" или "prod". В варианте "debug" и "release" по умолчанию нет определения BuildConfig. В Android Studio вы можете выбрать текущий вариант в левом нижнем углу:
для упрощения сборки.файл 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 параметр.
У меня была такая же проблема и исправлена, как показано ниже:
buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
на всякий случай, если это поможет кому-то еще, в моем случае это был отсутствующий импорт:
import uk.co.yourpackage.yourapp.BuildConfig;
Как-то, нигде в документе не упоминается, что вам нужно это включить! Заставил меня думать, что он был автоматически импортирован, но это не так. по крайней мере, для меня... Так много времени потеряно... Надеюсь, это поможет другому новичку, как я!
У меня была аналогичная проблема, связанная с использованием типов сборки.initWith (someotherbuildtype), BuildConfig не был создан должным образом. Мне пришлось перейти в родительскую построить вариант и построить что то типа, что initWith родительского причине штрафа.