2013-12-20 11 views
39

Ich versuche, unsere Android-Anwendung zu einem Gravel Build zu konvertieren. Ich habe das Projekt und die Bibliotheken bauen erfolgreich. Ich versuche jetzt, separate APKs für unsere verschiedenen Umgebungen zu erstellen (dev/test/prod haben unterschiedliche URLs für die Dienste, die sie verbrauchen).BuildConfig wird nicht korrekt erstellt (Gradle Android)

Bei der Suche ist der beste Weg, dies zu tun, mit verschiedenen BuildConfig für jede Umgebung. Das ist, was ich versucht:

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'] 
     } 
    } 
} 

Das Problem ist, dass mein BuildConfig.java scheint nicht die statischen Variablen injiziert zu bekommen, deshalb bekomme ich Fehler ähnlich wie:

/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 

Meine build/Quelle /buildConfig/debug/com/.../BuildConfig.java Datei enthält:

/** 
* 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; 
} 

Was mache ich falsch?

+0

Sinn machen könnte, diese Freiheit Verweise zu entfernen. Nicht, dass es irgendein kritischer Code hier, aber es ist am besten zu vermeiden auf Stackoverflow proprietäre Code-Sharing;) – antonpug

+0

Link unten sehen: http://stackoverflow.com/questions/22604627/gradle-buildconfigfield-buildconfig-cannot-resolve-symbol – Michael

Antwort

50

Bitte stellen Sie sicher, dass Sie "dev" oder "prod" Variante bauen. Es gibt keine BuildConfig-Definition in der Standardvariante "debug" und "release". In Android Studio können Sie aktuelle Variante in der unteren linken Ecke wählen:

Build Variants

Ihre build.gradle Datei zu vereinfachen, können Sie definieren:

buildTypes { 
    debug { 
     buildConfigField "String", "URL_SEARCH", "\"https://dev-search.example.com\"" 
     // etc. 
    } 
    release { 
     buildConfigField "String", "URL_SEARCH", "\"https://search.example.com\"" 
     // etc.  
    } 
} 

und dann nur default "debug" verwenden und "Release" -Varianten.

Zuletzt Semikolon (Zeichen: ';') aus dem Wert des buildConfigField-Parameters löschen.

+0

Danke ... es war ich, wie ich es erwartet hatte. "Gradle installDev" funktioniert gut .... "gradle build" gab mir Fehler. – Innova

+4

Sie können auch wie folgt gehen 'buildConfigField 'String', 'URL_SEARCH', '" https://search.example.com "'' – Androiderson

0

Ich hatte ähnliches Problem im Zusammenhang mit Erstellungsarten, die mit .initWith (someotherbuildtype) eingerichtet wurden, BuildConfig wurde nicht ordnungsgemäß erstellt. Ich musste auf die Eltern-Build-Variante wechseln und zuerst diese Builds erstellen, dann die Build-Typen, die mit dem Elternteil initWord erstellt wurden.

6

Nur für den Fall, dass es war ein fehlender Import jemand anderes in meinem Fall hilft: import uk.co.yourpackage.yourapp.BuildConfig;

Irgendwie nirgends in dem doc macht es erwähnt Sie brauchen, dass schließen! Hat mich gedacht, dass es irgendwie automatisch importiert wurde, aber es ist NICHT. zumindest nicht für mich ... So viel Zeit verloren ... Hoffe das hilft einem anderen Neuling wie mir!

+0

Erstaunlich, es war Import-Problem, ich wurde von android.support.v4.BuildConfig importieren Danke :) –

41

hatte ich gleiches Problem und reparierte es unten wie:

buildConfigField 'String', 'BASE_URL', '"https://api.example.com"' 
+3

für 'String', double-Zitat wird nicht ordnungsgemäß generiert. Nur einzelnes Zitat generiert die Variable erfolgreich. – Youngjae

+0

Arbeitete für mich.Danke :) –

+0

Für diejenigen wie mich, die es beim ersten Mal verpasst haben, ist der Schlüssel Teil, dass der Wert in Anführungszeichen innerhalb der einfachen Anführungszeichen ist. – speckledcarp

Verwandte Themen