Androidアプリケーションをgradleビルドに変換しようとしています。プロジェクトがあり、ライブラリは正常にビルドされています。さまざまな環境(dev/test/prod消費する安らかなサービス用に異なるURLがあります)。
周りを検索するとき、私がこれを行う最善の方法は、環境ごとに異なる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 /.../ 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;
}
何が間違っていますか?
「dev」または「prod」バリアントをビルドしていることを確認してください。デフォルトの「デバッグ」および「リリース」バリアントにはBuildConfig定義はありません。 Android Studioでは、左下隅で現在のバリアントを選択できます。
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パラメーターの値からセミコロン(記号: ';')を削除します。
私は同じ問題を抱えていて、以下のように修正しました:
buildConfigField 'String', 'BASE_URL', '"https://api.example.com"'
それが他の誰かを助ける場合に備えて、私の場合はインポートが欠落していました:import uk.co.yourpackage.yourapp.BuildConfig;
どういうわけか、ドキュメントのどこにも、そのインクルードが必要であると記載されていません!どういうわけか自動的にインポートされたと思わせましたが、そうではありません。少なくとも私にとってはそうではありません...多くの時間が失われました...私のような別の初心者を助けてくれることを願っています!
Project.ext.envConfigFiles配列で、開発に使用している正しい.envファイルにデバッグを設定していることを確認します
.initWith(someotherbuildtype)を使用してセットアップされているビルドタイプに関連する同様の問題があり、BuildConfigが正しく作成されていませんでした。親のビルドバリアントに切り替えて、最初にビルドし、次に親が初期化されたビルドタイプを正常にビルドする必要がありました。
これは私のためにこれを修正したものです:
File -> Invalidate Caches/Restart... -> Invalidate and Restart