我目前正在开发一款应用,我希望将其开源。但它使用了一些我不想分享的数据,例如signing configs
或api credentials
等等。
我在this帖子中找到了signing configs
的解决方案。在那里提取signing config
数据并将其存储在repo之外,并且可以使用构建脚本中的“apply from”来应用。
现在我有了使用构建脚本额外属性metadata
或buildconfig
变量以相同方式注入敏感数据的想法。但他们没有得到应用。我找到了一些较旧的博客文章,但是我也发现了一些资源说gradle改为不再允许它。这就是我发现的内容:我可以在build.gradle
中定义所有内容时注入所有内容,但只要我想从外部gradle文件中注入它,它就不再起作用了。
我知道,我可以定义存储库之外的其他源文件夹,但这会阻止其他人在我们的仓库交叉时构建项目。
所以我的问题是:拥有开源项目的最佳方法是什么,但使用私有数据来构建和发布项目需要使用正确运行它所需的一些私有数据?我正在使用Android Studio 1.5.1
和build tools 23.0.2
。
答案 0 :(得分:1)
定义项目属性,例如
APP_KEYSTORE=/path/to/keystore
APP_KEYSTORE_PWD=pwd
APP_KEY_ALIAS=alias
APP_KEY_PWD=pwd
在中
然后在build.gradle中使用它们:
if (project.hasProperty('APP_KEYSTORE')) {
android.signingConfigs.release.storeFile = file(APP_KEYSTORE.toString())
android.signingConfigs.release.storePassword = APP_KEYSTORE_PWD
android.signingConfigs.release.keyAlias = APP_KEY_ALIAS
android.signingConfigs.release.keyPassword = APP_KEY_PWD
}
else {
android.buildTypes.release.signingConfig = null
}
如果需要,每个人都可以使用自己的签名密钥进行发布。
您可以从gradle.properties中进一步注入数据,以便通过buildConfigField和resValue在应用程序中使用:
android {
defaultConfig {
buildConfigField, 'String' 'CONFIG_NAME', '"' + CONFIG_PROPERTY + '"'
resValue, 'string', 'CONFIG_NAME', CONFIG_PROPERTY
}
}
buildConfig将在应用程序生成的名为CONFIG_NAME的BuildConfig类中创建一个成员,其值在gradle属性CONFIG_PROPERTY中定义。请注意字符串值所需的引用 - 其他类型不需要。
resValue将创建一个字符串资源,该资源将像应用程序中的任何其他资源一样被添加。
gradle build system doc中简要讨论了这些内容。
但是,请注意将API键之类的值放入您的应用中,因为对于任何关心您的APK的人来说,它们基本上都是可见的。
答案 1 :(得分:0)
Dougs回答指出了一个有效的解决方案。额外属性ext {...}无法再加载,但我可以从属性文件中加载值。
project.ext.apiKey = "";
// extra properties
if(new File(extrasFile).exists()) {
Properties properties = new Properties()
properties.load(new FileInputStream(extrasFile))
project.ext.apiRootUrl = properties.getProperty("apiKey")
}
defaultConfig {
...
buildConfigField "String", "API_KEY", project.ext.apiRootUrl
}
现在我的buildconfig字段已正确填充。