c - 如何在 gradle 中的构建类型中为本机代码定义宏?



我在Android Studio中用原生代码构建了一个库。它有一些与时间相关的部分(在 C 中),必须处于一定的延迟水平,我需要测量它们。因此,我实现了一些测量例程。但是,我不希望度量例程在发布编译中起作用。

所以我定义了宏,允许我根据构建类型编译或不编译代码:

在我的本机代码中:

#ifdef MEASURE
measureRoutine1();
if (MEASURE == 1) {
measureRoutine2();
}
#endif

在我的毕业文件中:

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标志没有在我的本机代码中定义,因此测量代码永远不会被编译。

我做错了什么?我怎样才能实现我需要的?

附注: 我让 MEASURE 宏在本机中定义的唯一方法是将 cFlags 放在 defaultConfig 空间中的 buildType 之外。 以下代码有效,但每次我想使用度量进行编译时,我都需要对 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版本下定义MEASURE宏(仅在发布下或在发布和调试下同时定义),则宏将显示在我的本机代码中定义,并在发布中定义de值。似乎它只是没有在调试构建类型下定义。对可能发生的事情有什么想法吗?

我使用的是Android Studio 2.3.3,其中包含最新的稳定更新。此外,我还创建了一个新的测试项目来检查我的旧项目是否被窃听,但两者中的故事相同。

更新 2:

我开始认为也许Android Studio没有构建正确的buildType。另一个有趣的事情正在发生,我尝试在调试buildType中为java定义一个布尔构建配置字段,即使自动生成的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。

编译库时存在此问题:基本上,每次使用 make project 时,"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"
}

将编译项目(':nativelib') 以下代码替换为应用程序构建 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'
}

这解决了我的问题,现在正在创建宏以进行调试。

相关内容

  • 没有找到相关文章

最新更新