在c#中有一种方法可以使用像"#if DEBUG"这样的自定义配置
我需要一个"#if OFFLINE",因为我的Build-Config名称是"离线"(仅用于进一步的调试目的)...
谢谢!
我正在使用Gradle来构建我的Android应用程序.我试图使用基于构建类型(发布或调试)的一些标志.
我的Gradle文件如下所示:
android {
buildTypes {
debug {
buildConfigField 'boolean', 'PREPROD', 'true'
buildConfigField 'boolean', 'STAGING', 'false'
}
release {
buildConfigField 'boolean', 'PREPROD', 'false'
buildConfigField 'boolean', 'STAGING', 'false'
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我试图打电话BuildConfig.PREPROD
或BuildConfig.STAGING
我得到一个"无法解决符号"错误.Gradle同步成功,所以我不知道是否忘记了一些步骤才能使用此功能?
生成的BuildConfig.java
文件如下(in build/source/buildConfig/debug/com.example.myapp
):
package com.example.myapp;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String PACKAGE_NAME = "com.example.myapp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE …
Run Code Online (Sandbox Code Playgroud) 我的(gradle 1.10和gradle插件0.8)基于android的项目包含一个大的android-library,它是3个不同的android-app的依赖
在我的图书馆,我希望能够使用这样的结构
if (BuildConfig.SOME_FLAG) {
callToBigLibraries()
}
Run Code Online (Sandbox Code Playgroud)
因为proguard可以根据SOME_FLAG的最终值减小生成的apk的大小
但我无法想象如何用gradle做到:
* the BuildConfig produced by the library doesn't have the same package name than the app
* I have to import the BuildConfig with the library package in the library
* The apk of an apps includes the BuildConfig with the package of the app but not the one with the package of the library.
Run Code Online (Sandbox Code Playgroud)
我尝试使用BuildTypes和类似的东西没有成功
release {
// packageNameSuffix "library"
buildConfigField "boolean", "SOME_FLAG", "true"
}
debug {
//packageNameSuffix "library" …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将我们的Android应用程序转换为gradle构建.我有项目,它的库成功建立.我现在正在尝试为我们的各种环境创建单独的apks(dev/test/prod为他们使用的restful服务提供了不同的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') …
Run Code Online (Sandbox Code Playgroud) android buildconfig gradle android-build android-gradle-plugin
我正在编写Android应用程序,这里最好的方法可能与一般的Java相同或不同.
我只是希望能够设置一个调试标志,当它设置为true时只执行某些代码部分 - 相当于C++设置预处理器#define DEBUG并使用#ifdef DEBUG.
在Java中有没有可接受的或最好的方法来实现这一目标?
现在我只是在我的Application对象中设置一个变量,但我不认为这是最好的方法.
如果我们正在运行Android单元测试,我的应用程序的一部分我不想运行,因此我想用类似的东西包围它们
if (!BuildConfig.TESTING) {
// Code here that I don't want to run during tests.
}
Run Code Online (Sandbox Code Playgroud)
是否可以BuildConfig
根据是否使用connectedAndroidTest
gradle任务来填充此标志?这是解决这个问题的理智方式吗?
在查看BuildConfig
由Android Studio和Gradle插件生成的类时,可以看到该BuildConfig.DEBUG
字段是使用Boolean.parseBoolean(String)
调用初始化的,而不是使用其中一个布尔文字true
或false
.
当我使用Gradle添加自定义构建属性时,我会这样做:
android {
buildTypes.debug.buildConfigField 'boolean', 'SOME_SETTING', 'true'
}
Run Code Online (Sandbox Code Playgroud)
但是看看生成的信息BuildConfig
告诉我谷歌采用了与DEBUG
旗帜不同的方法:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
// more fields here
// Fields from build type: debug
public static final boolean SOME_SETTING = true;
}
Run Code Online (Sandbox Code Playgroud)
使用Boolean.parseBoolean(String)
而不是文字有什么好处?
我想定义一个构建配置文件,我可以在它自己使用gradle脚本中定义的变量:
def someVar = 512
android {
...
buildConfigField 'int', 'SOME_INT_FIELD', someVar
}
Run Code Online (Sandbox Code Playgroud)
但这会产生以下错误:
错误:(25,0)未找到Gradle DSL方法:'buildConfigField()'
可能的原因:
项目"PROJECT"可能正在使用不包含该方法的Gradle版本. 构建文件可能缺少Gradle插件.
我可以使用以下引用:
def someVar = 0
android {
...
buildConfigField 'int', 'SOME_INT_FIELD', '"' + someVar + '"'
}
Run Code Online (Sandbox Code Playgroud)
但这导致BuildConfig中的编译器错误
// Fields from default config.
public static final int SOME_INT_FILED = "512";
Run Code Online (Sandbox Code Playgroud)
所以现在我留下来:
def someVar = 0
android {
...
buildConfigField 'String', 'SOME_INT_FIELD', '"' + someVar + '"'
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
final int value = Integer.valueOf(BuildConfig.SOME_INT_FIELD);
Run Code Online (Sandbox Code Playgroud)
有没有人有更好的解决方案或我使用buildConfigField错误?
(我也尝试将括号与上述任何可能性结合使用.)
我是一位探索Android世界的新开发者.我目前正在通过Udacity教程创建Sunshine应用程序.在片段活动类中,为了从openweathermap获取数据,我必须将从我的帐户获得的API密钥添加到生成的URL的末尾.在Fragment活动中调用BuildConfig.java (单击以查看对作为String apiKey的一部分在第6行的BuildConfig.java的调用).
build.gradle文件如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.example.android.sunshine.app"
minSdkVersion 10
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
buildTypes.each {
it.buildConfigField 'String', 'OPEN_WEATHER_MAP_API_KEY', 'c882c94be45fff9d16a1cf845fc16ec5'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.1.0'
}
Run Code Online (Sandbox Code Playgroud)
在buildTypes.each it.buildConfigField中使用'String','OPEN_WEATHER_MAP_API_KEY','c882c94be45fff9d16a1cf845fc16ec5'调用
public static final String OPEN_WEATHER_MAP_API_KEY = c882c94be45fff9d16a1cf845fc16ec5;
Run Code Online (Sandbox Code Playgroud)
在BuildConfig.java中生成,但我不断收到此错误: 无法解析符号(单击以查看错误消息和BuildConfig.java文件)我不明白为什么字符串OPEN_WEATHER_MAP_API_KEY自动创建为一组字母和数字而没有引用它们,但如果我编辑代码阅读:
public static final String OPEN_WEATHER_MAP_API_KEY = "c882c94be45fff9d16a1cf845fc16ec5";
Run Code Online (Sandbox Code Playgroud)
要么
public static final …
Run Code Online (Sandbox Code Playgroud) 我正在修改当前的android项目,因此它可以安装在同一设备上,用于多种口味和构建配置.
的build.gradle:
{
// ...
defaultConfig {
applicationId "com.myapp"
manifestPlaceholders = [
manifestApplicationId: "${applicationId}",
onesignal_app_id: "xxxx",
onesignal_google_project_number: "xxxx"
]
// ...
}
productFlavors {
production {
applicationId "com.myapp"
// ...
}
dev {
applicationId "com.myapp.dev"
// ...
}
// ...
}
buildTypes {
release {
// ...
}
debug {
applicationIdSuffix ".debug"
// ...
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
AndroidManifest.xml:
<manifest ... >
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<!-- ... -->
<receiver
android:name="com.onesignal.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action …
Run Code Online (Sandbox Code Playgroud) android buildconfig gradle android-manifest manifest-merging