В моем Android Studio
проекте их два build configuration
с некоторыми buildConfigField
:
buildTypes {
def SERVER_URL = "SERVER_URL"
def APP_VERSION = "APP_VERSION"
debug {
buildConfigField "String", SERVER_URL, "http://dev.myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
}
release {
buildConfigField "String", SERVER_URL, "https://myserver.com"
buildConfigField "String", APP_VERSION, "0.0.1"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Я получаю следующее сообщение об ошибке:
/path/to/generated/BuildConfig.java
Error:(14, 47) error: ';' expected
Error:(15, 47) error: ';' expected
сгенерированный BuildConfig.java
выглядит следующим образом:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.mycuteoffice.mcoapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final String APP_VERSION = 0.0.1;
public static final String SERVER_URL = http://dev.mycuteoffice.com;
}
Я думаю, что APP_VERSION
и SERVER_URL
не генерируются должным образом, поскольку являются типом String, у них нет кавычек.
Я не уверен, почему он создается таким образом. Пожалуйста, дайте мне знать, как я могу решить эту проблему.
android
android-gradle-plugin
Абдулла
источник
источник
buildConfigField "String", APP_VERSION, ' "0.0.1" '
(без пробелов, конечно)Ответы:
Поля конфигурации сборки строкового типа должны быть объявлены следующим образом:
buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
имя поля в кавычках, значение поля в экранированных кавычках дополнительно.
источник
def FIELD_NAME = "SERVER_URL"
иbuildConfigField "boolean", FIELD_NAME, "false"
прекрасно работают вместе. Если вам не хватает определения SERVER_URL, произойдет сбой, вероятно, вы делаете неправильно.Почему все так без ума от двойных кавычек? Выглядит некрасиво! Это Groovy, ребята, вы можете просто смешивать одинарные и двойные кавычки:
buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"' buildConfigField "String", 'APP_VERSION', '"0.0.1"'
источник
String
двойные кавычки иSERVER_URL
одинарные кавычки?'
и другое"
можно использовать.Если под «решением проблем» вы имеете в виду отсутствие необходимости использовать литералы в двойных кавычках, я ничего не встречал, поскольку, похоже, он работает так, как задумано.
Я экспериментировал с перемещением литералов в « gradle.properties » в качестве обходного пути, превращая потенциально несколько уродливых строк в одну уродливую.
Вот так:
buildTypes { def SERVER_URL = "SERVER_URL" def APP_VERSION = "APP_VERSION" def CONFIG = { k -> "\"${project.properties.get(k)}\"" } debug { buildConfigField "String", SERVER_URL, CONFIG("debug.server.url") buildConfigField "String", APP_VERSION, CONFIG("version") } release { buildConfigField "String", SERVER_URL, CONFIG("release.server.url") buildConfigField "String", APP_VERSION, CONFIG("version") minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
gradle.properties
version=0.1.1 ... debug.server.url=http://dev.myserver.com ... release.server.url=http://myserver.com ...
Дальнейшие мысли:
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" } def CONFIG_DEBUG = { k -> CONFIG('debug',k) } def CONFIG_RELEASE = { k -> CONFIG('release',k) }
def CONFIG = { b,k -> "\"${project.properties.get(b+'.'+k)}\"" } def CONFIG_INT = { b,k -> "${project.properties.get(b+'.'+k)}" } ...
источник
CONFIG = { k -> if (project.properties.containsKey(k)) "\"${project.properties.get(k)}\"" else throw new RuntimeException("No such variable: " + k) }
Избегайте строковых кавычек:
buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\"" buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
источник
Я тоже был сбит с толку. Но есть смысл - «Строка» определяет тип поля, тогда как значение поля не цитируется автоматически, чтобы мы могли использовать здесь выражения:
buildConfigField "String", "TEST", "new Integer(10).toString()"
В противном случае это было бы невозможно.
источник
Использовать
buildConfigField "String", "FILE_NAME", "\"{$fileName}\""
для переменной. Ссылка отсюда
источник
в приложении build.gradle
def buildTimeAndVersion = releaseTime() + "-" + getSvnVersion() buildTypes { debug { signingConfig signingConfigs.config buildConfigField "String", 'BIULD_TIME', "\"${buildTimeAndVersion}\"" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } ... } static def releaseTime() { return new Date().format("yyyyMMdd", TimeZone.getDefault()) } def getSvnVersion() { def pro = ("svnversion -c " + getBuildDir().parent).execute() pro.waitFor() def version = pro.in.text Pattern p = Pattern.compile("(\\d+\\:)?(\\d+)\\D?") Matcher m = p.matcher(version) if (m.find()) { version = m.group(m.groupCount()) } try { return version } catch (e) { println e.getMessage() } return 0 }
затем в BuildConfig
public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "xxx.xxxxxxxx.xxx"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = ""; public static final int VERSION_CODE = 53; public static final String VERSION_NAME = "5.4.4"; // Fields from build type: debug public static final String BIULD_TIME = "20181030-2595"; }
источник
Мы должны убрать нашу константу Gradle, определенную в наших свойствах Gradle или где-то еще:
buildConfigField "String", "CONSTANT_NAME", "\"${CONSTANT_VALUE}\""
Где
CONSTANT_VALUE
определено в нашемgradle.properties
или еще где-то:CONSTANT_VALUE=string_goes_here
То же самое применяется и при получении констант, полученных из нашей среды:
buildConfigField "String", "CONSTANT_NAME", "\"${System.getenv('PATH')}\""
Решение, получившее наибольшее количество голосов, работает в случае, если нам просто нужно добавить String вручную , это решение просто идет дальше.
источник
Только \ "
my stuff
\" у меня сработало. И у меня есть много странных персонажейmy stuff
.источник