Android项目Fastfile如何从非Git追踪文件读取密钥等敏感配置
实现方案
方案1:从local.properties读取(适配本地开发习惯)
首先确保local.properties已经加入项目根目录的.gitignore文件,避免被提交到Git仓库。
然后在Fastfile的开头加入读取local.properties的代码:
# 读取local.properties配置 require 'java-properties' properties_file = "#{Dir.pwd}/local.properties" if File.exist?(properties_file) local_props = JavaProperties.load(properties_file) # 将配置转为全局可访问的哈希,key统一转为字符串 $local_config = local_props.transform_keys(&:to_s) else UI.user_error!("未找到local.properties文件,请在项目根目录创建后再执行构建") end
之后替换原有的硬编码部分即可:
- 构建lane的签名配置替换
lane :build_test_app do gradle( task: "assemble", build_type: "Release", flavor: "Dev", print_command: false, properties: { "android.injected.signing.store.file" => $local_config["signing.store.file"], "android.injected.signing.store.password" => $local_config["signing.store.password"], "android.injected.signing.key.alias" => $local_config["signing.key.alias"], "android.injected.signing.key.password" => $local_config["signing.key.password"], } ) end
- AppCenter上传配置替换
private_lane :upload_apk_to_appcenter do appcenter_upload( api_token: $local_config["appcenter.api_token"], owner_name: "MyCompany", owner_type: "user", app_os: 'Android', app_platform: 'Java', app_name: "MyApp", file: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], ) end
- Slack配置替换
before_all do ENV["SLACK_URL"] = $local_config["slack.webhook_url"] end
最后在local.properties里添加对应的配置项:
# 签名配置 signing.store.file=/Users/user/Desktop/appjks signing.store.password=asd123 signing.key.alias=asd123456 signing.key.password=asd1234 # AppCenter配置 appcenter.api_token=0123..... # Slack配置 slack.webhook_url=https://hooks.slack.com/services/123asd.......
方案2:使用环境变量(最优通用方案,支持本地+CI/CD场景)
该方案是行业通用最佳实践,同时适配本地开发和CI构建环境,不需要额外编写读取文件的代码。
本地使用方式
- 在项目根目录创建
.env文件,加入.gitignore避免提交。 - 在
.env中添加所有敏感配置:
SIGNING_STORE_FILE=/Users/user/Desktop/appjks SIGNING_STORE_PASSWORD=asd123 SIGNING_KEY_ALIAS=asd123456 SIGNING_KEY_PASSWORD=asd1234 APPCENTER_API_TOKEN=0123..... SLACK_URL=https://hooks.slack.com/services/123asd.......
- Fastlane原生支持dotenv,会自动加载.env文件的配置,直接在Fastfile中通过
ENV读取即可:
lane :build_test_app do gradle( task: "assemble", build_type: "Release", flavor: "Dev", print_command: false, properties: { "android.injected.signing.store.file" => ENV["SIGNING_STORE_FILE"], "android.injected.signing.store.password" => ENV["SIGNING_STORE_PASSWORD"], "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], } ) end private_lane :upload_apk_to_appcenter do appcenter_upload( api_token: ENV["APPCENTER_API_TOKEN"], owner_name: "MyCompany", owner_type: "user", app_os: 'Android', app_platform: 'Java', app_name: "MyApp", file: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], ) end before_all do # SLACK_URL已经在.env里配置,不需要额外赋值 end
CI/CD环境使用方式
直接在CI平台(比如GitHub Actions、Jenkins、GitLab CI)的敏感变量配置页面对应添加上述环境变量即可,不需要上传.env或者local.properties文件,完全避免敏感信息泄露风险。
注意事项
- 所有存储敏感信息的文件(local.properties、.env、签名jks文件)必须加入.gitignore,防止误提交到代码仓库
- 团队协作时可以提交
local.properties.example或者.env.example文件,仅保留配置key,去掉实际敏感值,方便新成员快速配置本地环境 - 不要在代码打印、日志输出中暴露这些敏感配置的值
内容的提问来源于stack exchange,提问作者enjektor0
相关产品推荐
相关产品推荐

