問(wèn)題描述
我正在嘗試將我們的 Android 應(yīng)用程序轉(zhuǎn)換為 gradle 版本.我有這個(gè)項(xiàng)目,它的圖書館建設(shè)成功.我現(xiàn)在正在嘗試為我們的各種環(huán)境創(chuàng)建單獨(dú)的 apk(dev/test/prod 對(duì)它們使用的 restful 服務(wù)有不同的 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).
在四處搜索時(shí),我認(rèn)為最好的方法是為每個(gè)環(huán)境制作不同的 BuildConfig.這是我嘗試過(guò)的:
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']
}
}
}
問(wèn)題是我的 BuildConfig.java 似乎沒(méi)有注入靜態(tài)變量,因此我收到類似以下的錯(cuò)誤:
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;
}
我做錯(cuò)了什么?
推薦答案
請(qǐng)確保您正在構(gòu)建dev"或prod"變體.默認(rèn)的調(diào)試"和發(fā)布"變體中沒(méi)有 BuildConfig 定義.在 Android Studio 中,您可以在左下角選擇當(dāng)前變體:
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:
為了簡(jiǎn)化您的 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.
}
}
然后只使用默認(rèn)的調(diào)試"和發(fā)布"變體.
and then just use default "debug" and "release" variants.
最后,從 buildConfigField 參數(shù)的值中刪除分號(hào)(符號(hào):';').
At last, delete semicolon (sign: ';') from the value of buildConfigField parameter.
這篇關(guān)于BuildConfig 未正確創(chuàng)建(Gradle Android)的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!