web-dev-qa-db-fra.com

BuildConfig n'est pas créé correctement (Gradle Android)

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?

44
Innova

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:

Build Variants

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.

54
Peter Knut

J'ai eu le même problème et l'ai résolu comme ci-dessous:

buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
45
savepopulation

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!

10
Litome

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

1
chisom onwuegbuzie

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.

0
straya

Voici ce qui a résolu cela pour moi:

File -> Invalidate Caches/Restart... -> Invalidate and Restart 
0
roobyroo