Skip to content

Commit eddc288

Browse files
committed
Merge branch 'dev' into release
# Conflicts: # app/build.gradle # build.gradle # gradle.properties
2 parents 4ae052f + 718e2dd commit eddc288

File tree

25 files changed

+179
-115
lines changed

25 files changed

+179
-115
lines changed

.github/workflows/build_and_release.yml

Lines changed: 0 additions & 39 deletions
This file was deleted.

.github/workflows/build_release.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
name: Build APK and Release
2+
3+
on:
4+
push:
5+
tags:
6+
- v*
7+
8+
jobs:
9+
build:
10+
runs-on: ubuntu-latest
11+
environment: zjmok.jks # 指定环境,对应仓库 Settings Environments 中的 environment 名称
12+
steps:
13+
- uses: actions/checkout@v4
14+
- name: Set up JDK 17
15+
uses: actions/setup-java@v4
16+
with:
17+
java-version: '17'
18+
distribution: 'temurin'
19+
cache: gradle
20+
21+
# https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets#storing-base64-binary-blobs-as-secrets
22+
# 解码 Base64 签名
23+
- name: Decode Keystore
24+
# 输出路径对应 app/build.gradle 脚本中的 storeFile 路径
25+
run: echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > zjmok.jks
26+
27+
- name: Grant execute permission for gradlew
28+
run: chmod +x gradlew
29+
- name: Build with Gradle
30+
run: ./gradlew assembleGithubRelease
31+
env:
32+
# 将 Environment Secrets 注入到 Gradle 可读取的环境变量
33+
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
34+
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
35+
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
36+
37+
- name: Upload APK to GitHub Release
38+
uses: softprops/action-gh-release@v2
39+
with:
40+
files: app/build/outputs/apk/github/release/*.apk
41+
env:
42+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ local.properties
1515

1616
/config_sign.gradle
1717
/android.jks
18+
*.jks
1819

1920
lint-baseline.xml
2021
full-r8-config.txt

app/build.gradle

Lines changed: 59 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ String composeBoMVersion = "2024.12.01"
1414

1515
def time = new Date()
1616

17-
def gitCommitCount = executeCmd("git rev-list --count HEAD")?.toInteger() ?: 1
18-
def gitLastTag = executeCmd("git describe --tags --always") ?: "1.0"
19-
def gitCommitId = executeCmd("git rev-parse --short HEAD") ?: "nocommitid"
17+
def gitCommitCount = executeCmd("git rev-list --count HEAD")?.toInteger() ?: 0
18+
def gitCommitId = executeCmd("git rev-parse --short HEAD") ?: "v0.0.0" //
19+
def gitTag = executeCmd("git tag --points-at HEAD").split('\n')
20+
def gitLastTag = executeCmd("git describe --tags --always").split("-").first() ?: "v0.0.0"
2021

2122
static def executeCmd(String cmd) {
2223
try {
@@ -30,6 +31,29 @@ static def executeCmd(String cmd) {
3031
}
3132
}
3233

34+
// 兼容本地开发和 workflow 脚本
35+
def getEnvOrLocal(String key) {
36+
def value = System.getenv(key) // github secrets > CI > gradle
37+
if (value == null || value.isEmpty()) {
38+
// 尝试从 local.properties 中获取
39+
def localProperties = new Properties()
40+
def localPropertiesFile = file("../local.properties")
41+
if (localPropertiesFile.exists()) {
42+
localPropertiesFile.withInputStream { stream ->
43+
localProperties.load(stream)
44+
}
45+
} else {
46+
throw new FileNotFoundException("local.properties 文件不存在,请求队友助攻")
47+
}
48+
// 获取 key 的 value
49+
value = localProperties.getProperty(key)
50+
}
51+
if (value == null || value.isEmpty()) {
52+
throw new IllegalArgumentException("环境变量 或 local.properties 中缺少 ${key} 的值,请求队友助攻")
53+
}
54+
return value
55+
}
56+
3357
android {
3458
namespace 'com.example.wan.android'
3559
// 确定编译应用时,项目代码可以使用哪些 API。不影响应用运行时的行为,只影响编译时可以访问到哪些类和方法
@@ -42,7 +66,7 @@ android {
4266
// 指定应用在运行时目标的 Android 版本。不影响可以使用的 API,而是影响应用在运行时的行为
4367
targetSdk 35
4468
versionCode gitCommitCount
45-
versionName gitLastTag // 假如每个 tag 都是一个 release
69+
versionName gitLastTag
4670

4771
multiDexEnabled true
4872

@@ -73,63 +97,62 @@ android {
7397

7498
// ndkVersion project.properties.ndkVersion
7599

76-
/*
77100
signingConfigs {
78101
// https://developer.android.com/studio/publish/app-signing#secure_key
79-
config {
80-
storeFile file(rootProject.ext.sign.filePath)
81-
storePassword rootProject.ext.sign.storePassword
82-
keyAlias rootProject.ext.sign.keyAlias
83-
keyPassword rootProject.ext.sign.keyPassword
102+
release {
103+
storeFile file("../zjmok.jks") // 密钥库文件路径,本地开发直接放到此路径,CI 环境脚本解密输出到此路径
104+
storePassword getEnvOrLocal("KEYSTORE_PASSWORD")
105+
keyAlias getEnvOrLocal("KEY_ALIAS")
106+
keyPassword getEnvOrLocal("KEY_PASSWORD")
107+
}
108+
// Android 自动生成的 debug.keystore 签名
109+
debugAsRelease {
110+
storeFile file("${System.getenv('ANDROID_SDK_HOME') ?: System.getProperty('user.home')}/.android/debug.keystore")
111+
storePassword "android"
112+
keyAlias "androiddebugkey"
113+
keyPassword "android"
84114
}
85115
}
86-
*/
87116

88117
// https://developer.android.com/build/build-variants
89118
buildTypes {
90119
debug {
120+
versionNameSuffix ".${gitCommitId}"
91121
debuggable true // 可调试
92122
minifyEnabled false // 代码压缩 (R8/ProGuard)
93123
shrinkResources false // 资源压缩 (shrinkResources)
94-
signingConfig signingConfigs.debug
95124
}
96125
release {
97126
debuggable false
98127
minifyEnabled true
99128
shrinkResources true
100129
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
101-
signingConfig signingConfigs.debug
130+
// signingConfig signingConfigs.debugAsRelease
131+
signingConfig signingConfigs.release
102132
}
103133
}
104134
android.applicationVariants.all { variant ->
105135
variant.outputs.all {
106-
def flavorType = variant.productFlavors.collect { it.name.capitalize() }.join() + variant.buildType.name.capitalize() // 格式 GithubRelease
107-
def name
108-
if (variant.productFlavors[0].name == "github") {
109-
// 与 github actions 脚本获取的名称对应
110-
name = ("${model.name}" +
111-
"-${variant.buildType.name}" +
112-
".apk")
113-
} else {
114-
name = ("${model.name}" +
115-
"_${variant.versionName}" +
116-
"_${variant.versionCode}" +
117-
// "_${variant.buildType.name}" +
118-
"_${flavorType}" +
119-
"_${gitCommitId}" +
120-
"_${time.time}" +
121-
".apk")
122-
}
136+
def flavorType = variant.productFlavors.collect {
137+
it.name.capitalize()
138+
}.join() + variant.buildType.name.capitalize() // 格式 GithubRelease
139+
def name = ("WanAndroid" +
140+
"_${variant.versionName}" +
141+
// "_${variant.versionCode}" +
142+
// "_${variant.buildType.name}" +
143+
// "_${flavorType}" +
144+
// "_${gitCommitId}" +
145+
// "_${time.time}" +
146+
".apk")
123147
println("${flavorType} outputFileName = ${name}")
124148
outputFileName = name
125149
}
126150
}
127-
// 变体、维度
151+
// 维度、风味,组合生成最终变体
128152
// https://developer.android.com/build/build-variants
129-
flavorDimensions += ["channel"] // 可以使用多个维度,最终构建的安装包会包含每个维度的一个变体
130-
productFlavors {
131-
// 维度1 渠道
132-
normal {
153+
flavorDimensions += ["channel"] // 维度
154+
productFlavors { // 风味
155+
app {
133156
dimension "channel"
134157
manifestPlaceholders = [app_channel: "\"${name}\""]
135158
buildConfigField "String", "APP_CHANNEL", "\"${name}\""
@@ -225,7 +248,7 @@ dependencies {
225248
// `project` 使用指定模块
226249
// `lintChecks` 是 lint-checks 库的,Lint 专用
227250
//noinspection DependencyNotationArgument
228-
lintChecks project(':module_lint')
251+
// lintChecks project(':module_lint')
229252

230253
// Test
231254
testImplementation "junit:junit:4.13.2"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-bo</string>
3+
<string name="values">bo</string>
44
<string name="language">སྐད་ཡིག</string>
55
</resources>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-en</string>
3+
<string name="values">en</string>
44
<string name="language">language</string>
55
</resources>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-fr</string>
3+
<string name="values">fr</string>
44
<string name="language">langue</string>
55
</resources>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-ii</string>
3+
<string name="values">ii</string>
44
<string name="language">ꉙꏓ</string>
55
</resources>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-ja</string>
3+
<string name="values">ja</string>
44
<string name="language">言語</string>
55
</resources>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
3-
<string name="values">values-ko</string>
3+
<string name="values">ko</string>
44
<string name="language">언어</string>
55
</resources>

0 commit comments

Comments
 (0)