Dans mon projet Android Studio
, il y a deux build configuration
avec quelque 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'
}
}
Je reçois et erreur comme suit:
/path/to/generated/BuildConfig.Java
Error:(14, 47) error: ';' expected
Error:(15, 47) error: ';' expected
buildCofig.Java généré est le suivant:
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;
}
Je pense que les APP_VERSION
et SERVER_URL
ne sont pas générés correctement car ils sont de type String, ils n'ont pas de guillemets.
Je ne sais pas pourquoi cela est généré de cette manière. S'il vous plaît laissez-moi savoir comment puis-je résoudre ces problèmes.
Les champs de configuration de construction de type chaîne doivent être déclarés comme suit:
buildConfigField "String", "SERVER_URL", "\"http://dev.myserver.com\""
le nom du champ entre guillemets, la valeur du champ entre guillemets échappés.
Pourquoi tout le monde est tellement fou d'échapper aux guillemets? C'est moche! C'est Groovy, les gars, vous pouvez juste mélanger des guillemets simples et doubles:
buildConfigField "String", 'SERVER_URL', '"http://dev.myserver.com"'
buildConfigField "String", 'APP_VERSION', '"0.0.1"'
Si vous entendez par «résoudre les problèmes» le fait de ne pas avoir à doubler les littéraux, je n'ai rien trouvé car cela semble fonctionner comme prévu.
J'ai essayé de déplacer les littéraux dans "gradle.properties" comme solution de contournement, transformant potentiellement plusieurs lignes laides en une seule ligne laide.
Ainsi:
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
...
Autres réflexions:
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)}" }
...
Échappez à vos guillemets:
buildConfigField "String", 'SERVER_URL', "\"http://dev.myserver.com\""
buildConfigField "String", 'APP_VERSION', "\"0.0.1\""
Utilisation
buildConfigField "String", "FILE_NAME", "\"{$fileName}\""
pour variable. Référence de ici
Seul\"my stuff
\" a fonctionné pour moi. Et j'ai toutes sortes de caractères étranges dans my stuff
.
dans l'application 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
}
puis dans 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";
}