android - 如何处理 Android Studio 项目中的私有(private)数据?

标签 android android-studio gradle android-gradle-plugin

我目前正在开发一个应用程序,我想将其开源。但它使用了一些我不想共享的数据,例如 signing configsapi credentials 等等。

我在 this 中找到了signing configs 的解决方案邮政。 signing config 数据被提取并存储在 repo 之外,可以在构建脚本中使用“apply from”来应用。

现在我有了使用构建脚本额外属性、metadatabuildconfig 变量以相同方式注入(inject)我的敏感数据的想法。但他们没有得到应用。我发现一些较旧的博客文章是这样完成的,但我也发现一些资源说 gradle 已更改为不再允许它。所以这就是我发现的:我可以在我的 build.gradle 中定义所有内容时注入(inject)它,但是一旦我想从外部 gradle 文件中注入(inject)它,它就不再起作用了。

我知道,我可以在存储库之外定义额外的源文件夹,但这会阻止其他人在 fork 我的存储库时构建项目。

所以我的问题是:拥有开源项目但使用私有(private)数据构建和发布项目的最佳方法是使用正确运行项目所需的一些私有(private)数据?我正在使用 Android Studio 1.5.1build 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/

相关文章:

java - 有没有一种简单的方法可以让android studio自动添加版权声明?

android - 改造 response.errorBody.string() 给了我暂停函数中不适当的阻塞方法调用的警告

java - 导入com.google.api无法解析

gradle - 配置 'compile'已过时。替换为实现后出现错误

android - RecyclerView 未在后按时填充

android - 在 Android 上使用 google http 客户端的 HttpDigest 身份验证

java - 广播接收器 - 在应用程序之间发送字符串

java - CardView 和 LinearLayout 的 TextView 子项根本不显示

java - Android Studio 给 FOR 循环一个延迟

java - 错误 : java. util.concurrent.ExecutionException : com. android.builder.internal.aapt.v2.Aapt2Exception: 在 Windows 10 上编译时出现 AAPT2 错误