BuildConfig wird nicht korrekt erstellt (Gradle Android)

Lesezeit: 6 Minuten

Benutzer-Avatar
Innovation

Ich versuche, unsere Android-Anwendung in einen Gradle-Build zu konvertieren. Ich habe das Projekt und seine Bibliotheken bauen erfolgreich. Ich versuche jetzt, separate APKs für unsere verschiedenen Umgebungen zu erstellen (dev/test/prod haben unterschiedliche URLs für die erholsamen Dienste, die sie verbrauchen).

Beim Herumsuchen ist der beste Weg, dies meiner Meinung nach zu tun, das Erstellen unterschiedlicher BuildConfig für jede Umgebung. Das habe 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 meine BuildConfig.java die statischen Variablen nicht injiziert zu bekommen scheint, daher bekomme ich ähnliche Fehler 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 Datei build/source/buildConfig/debug/com/…/BuildConfig.java 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?

  • Es könnte sinnvoll sein, diese Liberty-Referenzen zu entfernen. Nicht, dass es hier kritischen Code gibt, aber es ist am besten, zu vermeiden, proprietären Code auf StackOverflow zu teilen;)

    – Antonpug

    30. Mai 2014 um 18:27 Uhr

  • siehe Link unten: stackoverflow.com/questions/22604627/…

    – Michael

    27. Juni 2016 um 9:29 Uhr

  • Überprüfen Sie die Antwort hier stackoverflow.com/questions/22604627/…

    – Muhammad Noman

    4. Oktober 2018 um 12:49 Uhr

Benutzer-Avatar
Peter Knut

Bitte vergewissern Sie sich, dass Sie eine “dev”- oder “prod”-Variante bauen. In der Standardvariante „debug“ und „release“ gibt es keine BuildConfig-Definition. In Android Studio können Sie die aktuelle Variante unten links auswählen:

Varianten bauen

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

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

und verwenden Sie dann einfach die Standardvarianten “Debug” und “Release”.

Löschen Sie zuletzt das Semikolon (Zeichen: ‘;’) aus dem Wert des buildConfigField-Parameters.

  • Danke … ich war dumm, wie ich erwartet hatte. “gradle installDev” funktioniert gut … “gradle build” gab mir Fehler.

    – Innovationen

    20. Dezember 2013 um 16:19 Uhr

  • du kannst auch so gehen buildConfigField 'String', 'URL_SEARCH', '"https://search.example.com"'

    – Androiderson

    3. Juli 2015 um 23:03 Uhr

  • Ich möchte hinzufügen, dass Sie möglicherweise das Projekt neu erstellen müssen (Build -> Rebuild Project) beim Wechsel der aktiven Build-Variante sonst die BuildConfig wird nicht regeneriert.

    – Akarlstein

    14. September 2021 um 20:52 Uhr

Benutzer-Avatar
Bevölkerung retten

Ich hatte das gleiche Problem und habe es wie folgt behoben:

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

  • zum String, doppelte Anführungszeichen werden NICHT richtig generiert. Nur einfache Anführungszeichen generieren eine Variable erfolgreich.

    – Youngjae

    19. November 2015 um 5:02 Uhr

  • Für diejenigen wie mich, die es beim ersten Mal verpasst haben, ist der Schlüsselteil, dass der Wert in doppelten Anführungszeichen innerhalb der einfachen Anführungszeichen steht.

    – Gesprenkelter Karpfen

    30. Dezember 2016 um 20:34 Uhr

zuerst tun

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

dann mach

Build -> Clean Project

dann mach

Build - > Rebuild Project 

  • Danach berichtete Gradle schließlich, dass das minimale SDK einer der verwendeten Bibliotheken höher ist als das minsdk der Apps

    – Mars

    29. August 2020 um 22:43 Uhr

  • bestätigen, es hat funktioniert

    – vuhung3990

    20. September 2021 um 5:10 Uhr

  • Hurra! Es klappt! Danke @Mirza Ahmed

    – Avramo

    17. Januar um 13:54 Uhr

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

Irgendwie wird nirgendwo im Dokument erwähnt, dass Sie dieses Include benötigen! Ich dachte, es wurde irgendwie automatisch importiert, aber das ist es nicht. zumindest nicht für mich … So viel verlorene Zeit … Hoffe, das hilft einem anderen Neuling wie mir!

Benutzer-Avatar
Rifat

Versuche es

Erstellen -> Projekt bereinigen

dann mach

Erstellen -> Projekt neu erstellen

Wenn es nicht funktioniert, versuchen Sie es

Datei -> Caches ungültig machen/Neu starten… -> Ungültig machen und neu starten

dann mach

Erstellen -> Projekt bereinigen

dann mach

Erstellen -> Projekt neu erstellen

  • Reinigen und neu erstellen sollte funktionieren – hat bei mir funktioniert.

    – Srinij

    12. Januar 2021 um 3:11 Uhr

Benutzer-Avatar
bartonstanley

Hier ist, was das für mich behoben hat:

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

  • Reinigen und neu erstellen sollte funktionieren – hat bei mir funktioniert.

    – Srinij

    12. Januar 2021 um 3:11 Uhr

Benutzer-Avatar
Jmz

Wenn Sie Ihre Umgebungsvariablen ändern und sie in Android Studio nicht korrekt wiedergegeben werden, versuchen Sie Folgendes:

Build -> Clean Project 
File -> Invalidate Caches/Restart... -> Invalidate and Restart 

1256340cookie-checkBuildConfig wird nicht korrekt erstellt (Gradle Android)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy