- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Android Studio 中使用 native 代码构建了一个库。它有一些时间相关的部分(在 C 中)必须处于一定的延迟水平,我需要测量它们。所以我实现了一些测量程序。但是,我不希望测量例程在发布编译中工作。
所以我定义了宏,允许我根据构建类型编译或不编译代码:
在我的原生代码中:
#ifdef MEASURE
measureRoutine1();
if (MEASURE == 1) {
measureRoutine2();
}
#endif
在我的 gradle 文件中:
buildTypes {
release {
signingConfig signingConfigs.storeSignature
debuggable false
jniDebuggable false
versionNameSuffix "2.3"
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
jniDebuggable true
minifyEnabled false
versionNameSuffix '2.3.1'
}
measure1 {
initWith debug
externalNativeBuild {
cmake {
cppFlags += "-DMEASURE=0"
cFlags += "-DMEASURE=0"
}
}
}
measure2 {
initWith debug
externalNativeBuild {
cmake {
cppFlags += "-DMEASURE=1"
cFlags += "-DMEASURE=1"
}
}
}
}
现在,我的问题是无论我编译什么 buildType,MEASURE 标志都没有在我的 native 代码中定义,所以测量代码永远不会被编译。
我做错了什么?我怎样才能达到我的需要?
附言:获得在 native 中定义的 MEASURE 宏的唯一方法是将 cFlags 放在 defaultConfig 空间中的 buildTypes 之外。以下代码有效,但每次我想使用测量值进行编译时,我都需要对 MEASURE 宏进行硬编码。
defaultConfig {
minSdkVersion 21
targetSdkVersion 25
versionCode 6
versionName "2.3"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -fexceptions -O2 -ffast-math -DMEASURE=0"
cFlags "-O2 -ffast-math -DMEASURE=0"
}
}
}
更新 1:
如果我在 buildType release 下定义 MEASURE 宏(仅在 release 下或同时在 release 和 debug 下),该宏出现在我的 native 代码中定义,de 值在 release 中定义。似乎它只是没有在调试构建类型下定义。对可能发生的事情有任何想法吗?
我使用的是具有最新稳定更新的 Android Studio 2.3.3。此外,我还创建了一个新的测试项目来检查我的旧项目是否存在错误,但两者的情况相同。
更新 2:
我开始认为 Android Studio 可能没有构建正确的 buildType。另一件有趣的事情正在发生,我尝试在调试 buildType 中为 java 定义一个 bool 构建配置字段,即使自动生成的 BuildConfig.java 将该字段设置为 true,但在执行调试时我得到一个错误,即变量不存在(除非我将变量放在发布 buildType 下)。所以看起来无论我在我的构建变体中选择什么,它总是构建发布构建类型。
这是我完整的测试项目构建 gradle:
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "26.0.0"
defaultConfig {
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
versionNameSuffix '2.3.1'
externalNativeBuild {
cmake {
cppFlags += "-DMEASURE=0"
cFlags += "-DMEASURE=0"
}
}
buildConfigField "Boolean", "DEBUG_MODE", "Boolean.parseBoolean(\"true\")"
}
}
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
}
这是自动生成的 BuildConfig.java 文件:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.company.TestApp";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.02.3.1";
// Fields from build type: debug
public static final Boolean DEBUG_MODE = Boolean.parseBoolean("true");
}
这是我在代码中使用 BuildConfig.DEBUG_MODE 时在执行时遇到的错误:
Error:(14, 27) error: cannot find symbol variable DEBUG_MODE
可能会发生什么?
最佳答案
我找到了一个解决方案:
问题不在于宏的定义方式,它工作正常,问题在于 gradle。
有this issue编译库时:基本上,每次您使用 make project 时,无论为它们选择了何种构建变体,“app”项目旁边的所有项目都会在其发布版本中编译。
所以在这种情况下,问题是即使我在“nativelibrary”模块的构建变体框中选择了调试,发布构建类型也会编译 + 我为“app”构建变体选择的任何内容。
解决方案:
将以下代码添加到“nativelibrary”gradle 文件中:
defaultConfig {
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
//DEFINE THE DEFAULT PUBLISH CONFIG WHICH IS RELEASE
defaultPublishConfig 'release'
//ALLOW IT TO PUBLISH A NON DEFAULT WHICH WILL BE THE DEBUG OR
//A CUSTOM BUILD TYPE
publishNonDefault true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
将compile project(':nativelib')以下代码替换为app build gradle:
dependencies {
//ERASE THE FOLLOWING LINE
//compile project(':nativelib')
//ADD BUILD TYPE SPECIFIC COMPILE TYPES AND REQUEST A SPECIFIC
//CONFIGURATION FOR THE 'nativelibrary' DEPENDING ON THE
//REQUESTED BUILD TYPE.
releaseCompile project(path: ':nativelib', configuration: "release")
debugCompile project(path: ':nativelib', configuration: "debug")
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
这解决了我的问题,现在正在为调试创建宏。
关于c - 如何在 gradle 中的构建类型中为 native 代码定义宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44552332/
在 spring-security项目,在 build.gradle文件,以下插件可用: apply plugin: 'io.spring.nohttp' apply plugin: 'locks'
我正在尝试使用gradle任务作为“与操作系统无关的shell脚本”。我在编写构建文件的逻辑时没有问题,但是我希望能够从任何文件夹中运行它。 我的第一次尝试是在路径上放置一个带有build.gradl
我在同一目录下有三个具有不同名称的build.gradle dev.build.gradle uat.build.gradle prd.build.gradle 我有4期 “gradle build”
乡亲们 有谁知道如何使用gradle与自定义的build.gradle和settings.gradle一起运行-即两者在一起? 我认为我可以有一个自定义的build.gradle文件(-b标志)-但这
Gradle 配置有两个属性,称为 dependencies和 incoming .根据我的理解,我们可以通过 Gradle 依赖 block 向配置添加依赖,如下所示: dependencies {
我正在测试将我的工件推送到 Nexus Maven 存储库。我正在使用 gradle这样做。 gradle upload有什么区别和 gradle publish ? 最佳答案 目前gradle提供了
这里有一个类似的问题:Gradle properties not being read from ~/.gradle/gradle.properties,但它不能解决我的问题。 在我看来,gradle
如何检索 Gradle 本身的版本 以编程方式从 Gradle 插件中? 最佳答案 刚刚发现可以使用任何一种方法来解决它 getProject().getGradle().getGradleVersi
2 个 gradle 项目,A 和 B,其中 A 定义了对 B 的编译依赖。为 maven 和 gradle 项目启用了 JAR 的重新映射。我试过启用和禁用自定义工具模型。我在 init.d 目录下
如何从 gradle 运行另一个 gradle 脚本。我有多个 gradle 脚本可以在 /test 下运行测试目录。 /build.gradle使用要运行的测试 gradle 文件的名称调用。例如
我已经看到了多模块项目的不同布局,其中有些项目只有一个 build.gradle。而其他项目将有 build.gradle在根和 build.gradle在每个子项目中。我想知道有什么区别以及首选哪种
我对 Gradle 生命周期有一个基本的询问。我的项目是一个多模块项目。 我注意到以下命令: ./gradlew clean bignibou-server:run 不等于运行以下两个命令按顺序运行:
我有一个项目,其中包含一个子项目,如下所示: Root Project |----gradle.build |----SubProject |----|----gradle.build 这里的子项目包
我有 gradle 项目,我想向不使用 gradle 或 maven 等构建工具的项目添加依赖项。 目录结构如下: commonfolder\ gradleProject\ b
我想创建一个类来帮助我加载不同类型的属性(local.properties,gradle.properties,$GRADLE_HOME/gradle.properties,环境变量,系统属性和自定义
我有一个多模块项目,其目录结构如下: proj |-modA |-modB |-modMain \-modSysTest 依赖项是: modB -> modA modMain -> modB modM
我正在尝试创建一个可以在 --offline 模式下工作的 gradle 项目的副本。除了一个步骤,我已经自动化了所有步骤。我无法自动将插件 jar 下载到 gradle 缓存中。 我的离线分发通过指
基本上我想这样做: Use Gradle function from other gradle file 也就是说,从另一个 gradle 脚本中调用一个函数。问题是我的 build.gradle 在
我有一个简单的 gradle 插件,我想试用一下,但我不确定如何“请求”gradle 运行我的测试 这是我要修改的 block (在我的 gradle 构建文件的顶部) buildscript {
在 Android Studio 中创建项目时,我收到以下错误消息。 Failed to import new Gradle project: Could not install Gradle dis
我是一名优秀的程序员,十分优秀!