J'essaie de convertir notre Android en version Gradle. J'ai le projet et la construction de ses bibliothèques réussies. J'essaie maintenant de créer des apks séparés pour nos différents environnements (dev/test/prod ont des URL différentes pour les services reposants qu'ils consomment).
En cherchant autour, la meilleure façon de le faire est de créer différents BuildConfig pour chaque environnement. Voici ce que j'ai essayé:
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']
}
}
}
Le problème est que mon BuildConfig.Java ne semble pas obtenir les variables statiques injectées, donc j'obtiens des erreurs similaires à:
/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
Mon fichier build/source/buildConfig/debug/com /.../ BuildConfig.Java contient:
/**
* 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;
}
Qu'est-ce que je fais mal?
Veuillez vous assurer que vous construisez la variante "dev" ou "prod". Il n'y a pas de définition BuildConfig dans la variante par défaut "debug" et "release". Dans Android Studio, vous pouvez sélectionner la variante actuelle dans le coin inférieur gauche:
Pour simplifier votre fichier build.gradle, vous pouvez définir:
buildTypes {
debug {
buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\""
// etc.
}
release {
buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\""
// etc.
}
}
puis utilisez simplement les variantes par défaut "debug" et "release".
Enfin, supprimez le point-virgule (signe: ';') de la valeur du paramètre buildConfigField.
J'ai eu le même problème et l'ai résolu comme ci-dessous:
buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
Juste au cas où cela aiderait quelqu'un d'autre, dans mon cas c'était une importation manquante: import uk.co.yourpackage.yourapp.BuildConfig;
D'une manière ou d'une autre, nulle part dans le document ne mentionne que vous avez besoin d'inclure! Cela m'a fait penser qu'il a été importé automatiquement d'une manière ou d'une autre, mais ce n'est PAS le cas. pas pour moi au moins ... Tant de temps perdu ... J'espère que ça aide un autre débutant comme moi!
Dans le tableau project.ext.envConfigFiles, assurez-vous de définir le débogage sur le bon fichier .env que vous utilisez pour le développement
J'ai eu un problème similaire lié à la configuration des types de build à l'aide de .initWith (someotherbuildtype), BuildConfig n'était pas créé correctement. J'ai dû basculer vers la variante de construction parent et la construire d'abord, puis les types de construction qui initWith le parent a bien construit.
Voici ce qui a résolu cela pour moi:
File -> Invalidate Caches/Restart... -> Invalidate and Restart