android BuildConfig सही ढंग से नहीं बनाया जा रहा है(एंड्रॉइड ग्रैडल)




gradle android-build (4)

कृपया, सुनिश्चित करें कि आप "देव" या "प्रोड" संस्करण बना रहे हैं। डिफ़ॉल्ट "डीबग" और "रिलीज" संस्करण में कोई BuildConfig परिभाषा नहीं है। एंड्रॉइड स्टूडियो में, आप नीचे बाएं कोने में वर्तमान संस्करण का चयन कर सकते हैं:

अपनी build.gradle फ़ाइल को सरल बनाने के लिए, आप परिभाषित कर सकते हैं:

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

और उसके बाद बस डिफ़ॉल्ट "डीबग" और "रिलीज" संस्करणों का उपयोग करें।

अंत में, buildConfigField पैरामीटर के मान से अर्धविराम (साइन: ';') हटाएं।

मैं अपने एंड्रॉइड एप्लिकेशन को एक ग्रेबल बिल्ड में बदलने की कोशिश कर रहा हूं। मेरे पास प्रोजेक्ट है और इसकी लाइब्रेरी सफलतापूर्वक निर्माण कर रही है। अब मैं अपने विभिन्न परिवेशों के लिए अलग-अलग एपीके बनाने की कोशिश कर रहा हूं (dev / test / prod में उनके द्वारा उपयोग की जाने वाली शेष सेवाओं के लिए अलग-अलग यूआरएल हैं)।

चारों ओर खोज में, मुझे यह करने का सबसे अच्छा तरीका यह है कि प्रत्येक वातावरण के लिए अलग BuildConfig बनाना है। मैंने यही कोशिश की:

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

समस्या यह है कि मेरा BuildConfig.java स्थिर चर इंजेक्शन प्राप्त नहीं कर रहा है, इसलिए मुझे इस तरह की त्रुटियां मिलती हैं:

/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

मेरा निर्माण / स्रोत / buildConfig / डीबग / com /.../ BuildConfig.java फ़ाइल में शामिल हैं:

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

मैं क्या गलत कर रहा हूं?


मेरे पास एक ही समस्या थी और इसे नीचे की तरह तय किया गया:

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

मुझे .initWith (someotherbuildtype) का उपयोग करके सेटअप प्रकारों के सेटअप से संबंधित एक ही समस्या थी, BuildConfig ठीक से नहीं बनाया जा रहा था। मुझे पैरेंट बिल्ड वैरिएंट पर स्विच करना था और पहले इसे बनाना था, फिर निर्माण प्रकार जो कि माता-पिता के साथ ठीक से बनाया गया था।


बस अगर किसी और की मदद करता है, तो मेरे मामले में यह एक गायब आयात था: import uk.co.yourpackage.yourapp.BuildConfig;

किसी भी तरह, डॉक्टर में कहीं भी यह उल्लेख नहीं करता है कि आपको इसमें शामिल होना चाहिए! मुझे लगता है कि यह किसी भी तरह से स्वचालित रूप से आयात किया गया था लेकिन यह नहीं है। मेरे लिए कम से कम नहीं ... इतना समय गुम हो गया ... उम्मीद है कि मेरे जैसे एक और नौसिखिया मदद करता है!





buildconfig