我目前正在开发一个应用程序,我想将其开源。但它使用了一些我不想共享的数据,例如 signing configs
或 api credentials
等等。
我在 this 中找到了signing configs
的解决方案邮政。 signing config
数据被提取并存储在 repo 之外,可以在构建脚本中使用“apply from”来应用。
现在我有了使用构建脚本额外属性、metadata
或 buildconfig
变量以相同方式注入(inject)我的敏感数据的想法。但他们没有得到应用。我发现一些较旧的博客文章是这样完成的,但我也发现一些资源说 gradle 已更改为不再允许它。所以这就是我发现的:我可以在我的 build.gradle
中定义所有内容时注入(inject)它,但是一旦我想从外部 gradle 文件中注入(inject)它,它就不再起作用了。
我知道,我可以在存储库之外定义额外的源文件夹,但这会阻止其他人在 fork 我的存储库时构建项目。
所以我的问题是:拥有开源项目但使用私有(private)数据构建和发布项目的最佳方法是使用正确运行项目所需的一些私有(private)数据?我正在使用 Android Studio 1.5.1
和 build tools 23.0.2
。
最佳答案
定义项目属性如
APP_KEYSTORE=/path/to/keystore
APP_KEYSTORE_PWD=pwd
APP_KEY_ALIAS=alias
APP_KEY_PWD=pwd
在 ~/.gradle/gradle.properties
然后在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
}
这让每个人都可以在需要时使用自己的签名 key 来发布版本。
您可以通过 buildConfigField 和 resValue 进一步从 gradle.properties 注入(inject)数据以在应用中使用:
android {
defaultConfig {
buildConfigField, 'String' 'CONFIG_NAME', '"' + CONFIG_PROPERTY + '"'
resValue, 'string', 'CONFIG_NAME', CONFIG_PROPERTY
}
}
buildConfig 将在应用程序生成的 BuildConfig 类中创建一个名为 CONFIG_NAME 的成员,其值在 gradle 属性 CONFIG_PROPERTY 中定义。请注意字符串值所需的引号 - 其他类型不需要。
resValue 将创建一个字符串资源,该资源将像应用中的任何其他资源一样被添加。
这些在 gradle build system doc 中进行了简要讨论。 .
但是,像这样将 API key 之类的值放入您的应用时要小心,因为它们基本上对任何关心反汇编您的 APK 的人都是可见的。
关于android - 如何处理 Android Studio 项目中的私有(private)数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35968015/