问题描述
我正在尝试将我们的 Android 应用程序转换为 gradle 版本.我有这个项目,它的图书馆建设成功.我现在正在尝试为我们的各种环境创建单独的 apk(dev/test/prod 对它们使用的 restful 服务有不同的 url).
I am trying to convert our Android application to a gradle build. I have the project and it's libraries building successfully. I am now trying to create separate apks for our various environments (dev/test/prod have different urls for the restful services they consume).
在四处搜索时,我认为最好的方法是为每个环境制作不同的 BuildConfig.这是我尝试过的:
In searching around, the best way that I feel to do this is with making different BuildConfig for each environment. This is what I tried:
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 似乎没有注入静态变量,因此我收到类似以下的错误:
The problem is that my BuildConfig.java doesn't seem to get the static variables injected, therefore I get errors similar to:
/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/.../BuildConfig.java 文件包含:
My build/source/buildConfig/debug/com/.../BuildConfig.java file contains:
/**
* 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;
}
我做错了什么?
推荐答案
请确保您正在构建dev"或prod"变体.默认的调试"和发布"变体中没有 BuildConfig 定义.在 Android Studio 中,您可以在左下角选择当前变体:
Please, be sure that you are building "dev" or "prod" variant. There is no BuildConfig definition in default "debug" and "release" variant. In Android Studio, you can select current variant in bottom left corner:
为了简化您的 build.gradle 文件,您可以定义:
To simplify your build.gradle file, you can define:
buildTypes {
debug {
buildConfigField "String", "URL_SEARCH", ""https://dev-search.example.com""
// etc.
}
release {
buildConfigField "String", "URL_SEARCH", ""https://search.example.com""
// etc.
}
}
然后只使用默认的调试"和发布"变体.
and then just use default "debug" and "release" variants.
最后,从 buildConfigField 参数的值中删除分号(符号:';').
At last, delete semicolon (sign: ';') from the value of buildConfigField parameter.
这篇关于BuildConfig 未正确创建(Gradle Android)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!