From 40415d8f76242f5ff5d2cc7dfc65ce9d5657f4c6 Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 11 Nov 2026 23:29:15 +0800 Subject: [PATCH] =?UTF-8?q?chore(android):=20=E5=8F=91=E5=B8=83=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E8=AF=81=E4=B9=A6=E4=B8=8E=E5=8F=A3=E4=BB=A4=E9=9A=8F?= =?UTF-8?q?=E7=A7=81=E6=9C=89=E4=BB=93=E5=BA=93=E6=89=98=E7=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按用户要求把 dadao-release.jks 与 keystore.properties 入库,保证任何机器 clone 后可直接 assembleRelease;证书从 .local/keystore 挪到 android/keystore,.gitignore 对这两个文件开例外。仓库泄露即等于证书泄露,届时需换证书重新发版。 --- .gitignore | 3 +++ android/app/build.gradle.kts | 13 ++++++++----- android/keystore.properties | 5 +++++ android/keystore/dadao-release.jks | Bin 0 -> 2726 bytes 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 android/keystore.properties create mode 100644 android/keystore/dadao-release.jks diff --git a/.gitignore b/.gitignore index 9c96374..c1a8db2 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,9 @@ android/local.properties # 发布签名证书与口令(只在发布者本机;仓库里没有它就用调试签名) android/keystore.properties *.jks +# 例外:发布签名证书与口令按用户要求入库(私有仓库),保证任何机器 clone 下来都能出正式包 +!android/keystore.properties +!android/keystore/dadao-release.jks # 编辑器 / 系统 .DS_Store diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 5d3f286..0a26859 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -43,7 +43,7 @@ android { * 原因:CI 与受限沙箱里 `~/.android` 常常不可写,AGP 会去建 * `debug.keystore.lock` 然后 AccessDenied,构建在 validateSigningDebug 这一步失败。 * 放在工程里就能在任何机器上直接 assembleDebug。 - * 注意:这只是调试签名,release 必须换成真正的证书并走 secret 注入。 + * 注意:这只是调试签名,release 用 android/keystore/dadao-release.jks。 */ signingConfigs { getByName("debug") { @@ -53,11 +53,14 @@ android { keyPassword = "android" } /** - * 发布签名从 android/keystore.properties 读,证书本身不进仓库。 + * 发布签名从 android/keystore.properties 读。 * - * 没有这个文件(别人 clone 下来、CI 没注入)时回落到调试签名: - * assembleRelease 依然能跑,只是装不上已经装了正式版的机器—— - * 而这正是应该发生的:发布包的签名只能由发布者本人持有。 + * 证书和口令按用户要求随私有仓库托管(.gitignore 对这两个文件开了例外), + * 这样任何机器 clone 下来都能直接出正式包;代价是仓库泄露即等于证书泄露, + * 届时必须换证书并让 OTA 重新发版。 + * + * 没有 keystore.properties 时回落到调试签名,assembleRelease 依然能跑, + * 只是装不上已经装了正式版的机器。 */ create("release") { val file = rootProject.file("keystore.properties") diff --git a/android/keystore.properties b/android/keystore.properties new file mode 100644 index 0000000..46e0fdc --- /dev/null +++ b/android/keystore.properties @@ -0,0 +1,5 @@ +# 发布签名(证书与口令按用户明确要求随仓库托管,本仓库为私有库) +storeFile=keystore/dadao-release.jks +storePassword=dadao-release-2026 +keyAlias=dadao +keyPassword=dadao-release-2026 diff --git a/android/keystore/dadao-release.jks b/android/keystore/dadao-release.jks new file mode 100644 index 0000000000000000000000000000000000000000..c59bd017a7f6ac1192a084ec17a3c7c7d1530288 GIT binary patch literal 2726 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