BuildConfig 无法得到正确创建 (Gradle Android)



               


我想转换我们向 gradle 生成的 Android 应用程序。我有项目,这是图书馆建设成功。我现在正在努力创建单独的 apks 为我们各种环境 (开发/测试/产品有不同的 url 供他们消费的 rest 风格的服务)。

在找来找去,我觉得这样做的最佳方式是以使不同 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

我的 build/source/buildConfig/debug/com/lmig/ets/mobile/libertynewsreader/BuildConfig.java 文件包含:

/**
 * Automatically generated file. DO NOT MODIFY
 */
package com.lmig.ets.mobile.libertynewsreader;

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String PACKAGE_NAME = "com.lmig.ets.mobile.libertynewsreader.debug";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 5;
}

我究竟做错了?

解决方法 1:

请请务必您正在构建"dev"督促"变形。没有 BuildConfig 定义的默认"调试"和"释放"的变形。在 Android Studio 中,您可以选择左下角中的当前变量:

Build Variants

为了简化您的 build.gradle 文件,您可以定义:

buildTypes {
    debug {
        packageNameSuffix ".debug"

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

然后只使用默认的"调试"和"释放"变形。

最后,删除分号 (标志:;) 从 buildConfigField 参数的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Androidbuild.gradle文件可以读取YAML文件,并将其中的内容用作变量进行配置。以下是一个完整的例子,可以帮助您实现这一目标: 1. 首先,您需要在您的项目根目录下创建一个名为config.yaml的文件,并在其中定义您需要的变量。例如,您可以在config.yaml文件中定义以下内容: ``` # config.yaml app_name: "My Awesome App" version_code: 1 version_name: "1.0.0" ``` 2. 接下来,您需要在build.gradle文件中添加以下代码,以读取config.yaml文件并将其中的内容用作变量: ``` // build.gradle import org.yaml.snakeyaml.Yaml def config = new File("${rootDir}/config.yaml") def yaml = new Yaml().load(config.text) android { defaultConfig { applicationId "com.example.myawesomeapp" minSdkVersion 21 targetSdkVersion 30 versionCode yaml.version_code versionName yaml.version_name } } // You can also use the variables in other parts of your build.gradle file task printAppName { doLast { println "The app name is: ${yaml.app_name}" } } ``` 在上面的代码中,我们使用YAML库来读取config.yaml文件的内容,并将其存储在yaml变量中。然后,我们可以在build.gradle文件的其他部分使用这些变量,例如在defaultConfig块中设置versionCode和versionName属性。 3. 最后,在您的命令行终端中运行以下命令,以确保您的项目可以正确读取config.yaml文件: ``` ./gradlew printAppName ``` 这将运行我们在build.gradle文件中定义的printAppName任务,并输出应用程序名称(即我们在config.yaml文件中定义的“My Awesome App”)。如果输出正确,那么您的项目已经可以正确读取config.yaml文件中的内容,并将其用作变量进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值