关于java:buildConfigField无法从gradle.properties中恢复我的api密钥

buildConfigField does not recover my api key from gradle.properties

我要保护我的API密钥是因为我想上传一个公共存储库,因此在我的gradle上进行了尝试,并将密钥添加到了gradle.properties文件

build.gradle

1
2
3
4
5
6
7
8
9
10
11
 buildTypes {

        debug {
            buildConfigField 'String',"FIRST_APIKEY",""FIRST_APIKEY""
            buildConfigField 'String',"SECOND_APIKEY",""SECOND_APIKEY""
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

gradle.properties

1
2
FIRST_APIKEY ="apikey"
SECOND_APIKEY ="apikey"

它说apikey是当前的字母数字apikey

,当我将其实现到类中以获取该apikey时,它不会返回apikey

例如,此处我试图从该apikey解析数据,但我什么也没得到,因为无法访问它

1
service.getData(BuildConfig.FIRST_APIKEY)....

使用调试器生成BuildConfig.FIRST_APIKEY的结果如下

result = FIRST_APIKEY

而不是FIRST_APIKEY,它应该实现我先前在gradle.properties文件中配置的apikey

感谢任何提示


首先,在gradle的配置阶段将属性加载到Properties对象:

1
2
3
4
apply plugin: 'com.android.application'

Properties localProperties = new Properties()
localProperties.load(project.rootProject.file('local.properties').newDataInputStream())

然后您可以找到buildConfigField的属性:

1
2
buildConfigField 'String',"FIRST_APIKEY", localProperties.getProperty('FIRST_APIKEY')
buildConfigField 'String',"SECOND_APIKEY", localProperties.getProperty('SECOND_APIKEY')

如果您的属性如下所示:

1
2
FIRST_APIKEY=apikey
SECOND_APIKEY=apikey

然后您需要将localProperties.getProperty('FIRST_APIKEY')替换为""${props.getProperty('FIRST_APIKEY')}""


您不应分配静态字符串,而应分配变量:

1
2
buildConfigField("String","FIRST_APIKEY",""${firstApiKey}"")
resValue("string","first_api_key","${firstApiKey}")

,它可能不关心任何.properties,除非加载它们。例如:

1
2
3
def apikeys = new Properties()
apikeys.load(new FileInputStream(rootProject.file('apikeys.properties')))
project.ext.set('firstApiKey', apikeys['firstApiKey'])