Skip to content

Commit 8ad1248

Browse files
committed
build: refactor build logic
1 parent 1dfcefc commit 8ad1248

File tree

12 files changed

+266
-160
lines changed

12 files changed

+266
-160
lines changed

app/build.gradle.kts

Lines changed: 11 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,18 @@
11
@file:Suppress("UnstableApiUsage")
22

3-
import android.databinding.tool.ext.capitalizeUS
43
import com.android.build.gradle.internal.tasks.factory.dependsOn
5-
import com.google.common.hash.Hashing
6-
import com.google.common.io.Files
7-
import groovy.json.JsonOutput
8-
import groovy.json.JsonSlurper
9-
import java.io.ByteArrayOutputStream
10-
import java.nio.charset.Charset
11-
import java.io.StringWriter
124
import java.util.Properties
13-
import java.util.TimeZone
14-
import java.util.Date
15-
import java.text.SimpleDateFormat
5+
import org.gradle.configurationcache.extensions.capitalized
166

177
plugins {
8+
id("com.osfans.trime.data-checksums")
189
id("com.android.application")
1910
kotlin("android")
2011
kotlin("plugin.serialization") version Versions.kotlin
2112
id("com.google.devtools.ksp") version Versions.ksp
2213
id("com.mikepenz.aboutlibraries.plugin")
2314
}
2415

25-
fun exec(cmd: String): String = ByteArrayOutputStream().use {
26-
project.exec {
27-
commandLine = cmd.split(" ")
28-
standardOutput = it
29-
}
30-
it.toString().trim()
31-
}
32-
fun envOrDefault(env: String, default: () -> String): String {
33-
val v = System.getenv(env)
34-
return if (v.isNullOrBlank()) default() else v
35-
}
36-
37-
val gitUserOrCIName = envOrDefault("CI_NAME") {
38-
exec("git config user.name")
39-
}
40-
val gitVersionName = exec("git describe --tags --long --always")
41-
val gitHashShort = exec("git rev-parse --short HEAD")
42-
val gitRemoteUrl = exec("git remote get-url origin")
43-
.replaceFirst("^git@github\\.com:", "https://github.com/")
44-
.replaceFirst("\\.git\$", "")
45-
46-
fun buildInfo(): String {
47-
val writer = StringWriter()
48-
val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").apply {
49-
timeZone = TimeZone.getTimeZone("UTC")
50-
}.format(Date(System.currentTimeMillis()))
51-
writer.append("Builder: ${gitUserOrCIName}\\n")
52-
writer.append("Build Time: $time UTC\\n")
53-
writer.append("Build Version Name: ${gitVersionName}\\n")
54-
writer.append("Git Hash: ${gitHashShort}\\n")
55-
writer.append("Git Repo: $gitRemoteUrl")
56-
val info = writer.toString()
57-
println(info)
58-
return info
59-
}
60-
6116
android {
6217
namespace = "com.osfans.trime"
6318
compileSdk = 34
@@ -73,10 +28,11 @@ android {
7328

7429
multiDexEnabled = true
7530
setProperty("archivesBaseName", "trime-$versionName")
76-
buildConfigField("String", "BUILD_GIT_HASH", "\"${gitHashShort}\"")
77-
buildConfigField("String", "BUILD_GIT_REPO", "\"${gitRemoteUrl}\"")
78-
buildConfigField("String", "BUILD_VERSION_NAME", "\"${gitVersionName}\"")
79-
buildConfigField("String", "BUILD_INFO", "\"${buildInfo()}\"")
31+
buildConfigField("String", "BUILDER", "\"${project.builder}\"")
32+
buildConfigField("long", "BUILD_TIMESTAMP", project.buildTimestamp)
33+
buildConfigField("String", "BUILD_COMMIT_HASH", "\"${project.buildCommitHash}\"")
34+
buildConfigField("String", "BUILD_GIT_REPO", "\"${project.buildGitRepo}\"")
35+
buildConfigField("String", "BUILD_VERSION_NAME", "\"${project.buildVersionName}\"")
8036
}
8137

8238
signingConfigs {
@@ -184,20 +140,13 @@ ksp {
184140
arg("room.schemaLocation", "$projectDir/schemas")
185141
}
186142

187-
val generateDataChecksum by tasks.register<DataChecksumsTask>("generateDataChecksum") {
188-
inputDir.set(file("src/main/assets"))
189-
outputFile.set(file("src/main/assets/checksums.json"))
190-
}
191-
192143
android.applicationVariants.all {
193-
val variantName = name.capitalizeUS()
194-
tasks.findByName("merge${variantName}Assets")?.dependsOn(generateDataChecksum)
144+
val variantName = name.capitalized()
145+
tasks.findByName("generateDataChecksums")?.also {
146+
tasks.getByName("merge${variantName}Assets").dependsOn(it)
147+
}
195148
}
196149

197-
tasks.register<Delete>("cleanGeneratedAssets") {
198-
delete(file("src/main/assets/checksums.json"))
199-
}.also { tasks.clean.dependsOn(it) }
200-
201150
tasks.register<Delete>("cleanCxxIntermediates") {
202151
delete(file(".cxx"))
203152
}.also { tasks.clean.dependsOn(it) }
@@ -236,83 +185,3 @@ dependencies {
236185
testImplementation("junit:junit:4.13.2")
237186
androidTestImplementation("junit:junit:4.13.2")
238187
}
239-
240-
abstract class DataChecksumsTask : DefaultTask() {
241-
@get:Incremental
242-
@get:PathSensitive(PathSensitivity.NAME_ONLY)
243-
@get:InputDirectory
244-
abstract val inputDir: DirectoryProperty
245-
246-
@get:OutputFile
247-
abstract val outputFile: RegularFileProperty
248-
249-
private val file by lazy { outputFile.get().asFile }
250-
251-
private fun serialize(map: Map<String, String>) {
252-
file.deleteOnExit()
253-
file.writeText(
254-
JsonOutput.prettyPrint(
255-
JsonOutput.toJson(
256-
mapOf<Any, Any>(
257-
"sha256" to Hashing.sha256()
258-
.hashString(
259-
map.entries.joinToString { it.key + it.value },
260-
Charset.defaultCharset()
261-
)
262-
.toString(),
263-
"files" to map
264-
)
265-
)
266-
)
267-
)
268-
}
269-
270-
@Suppress("UNCHECKED_CAST")
271-
private fun deserialize(): Map<String, String> =
272-
((JsonSlurper().parseText(file.readText()) as Map<Any, Any>))["files"] as Map<String, String>
273-
274-
companion object {
275-
fun sha256(file: File): String =
276-
Files.asByteSource(file).hash(Hashing.sha256()).toString()
277-
}
278-
279-
@TaskAction
280-
fun execute(inputChanges: InputChanges) {
281-
val map =
282-
file.exists()
283-
.takeIf { it }
284-
?.runCatching {
285-
deserialize()
286-
// remove all old dirs
287-
.filterValues { it.isNotBlank() }
288-
.toMutableMap()
289-
}
290-
?.getOrNull()
291-
?: mutableMapOf()
292-
293-
fun File.allParents(): List<File> =
294-
if (parentFile == null || parentFile.path in map)
295-
listOf()
296-
else
297-
listOf(parentFile) + parentFile.allParents()
298-
inputChanges.getFileChanges(inputDir).forEach { change ->
299-
if (change.file.name == file.name)
300-
return@forEach
301-
logger.log(LogLevel.DEBUG, "${change.changeType}: ${change.normalizedPath}")
302-
val relativeFile = change.file.relativeTo(file.parentFile)
303-
val key = relativeFile.path
304-
if (change.changeType == ChangeType.REMOVED) {
305-
map.remove(key)
306-
} else {
307-
map[key] = sha256(change.file)
308-
}
309-
}
310-
// calculate dirs
311-
inputDir.asFileTree.forEach {
312-
it.relativeTo(file.parentFile).allParents().forEach { p ->
313-
map[p.path] = ""
314-
}
315-
}
316-
serialize(map.toSortedMap())
317-
}
318-
}

app/src/main/java/com/osfans/trime/data/DataManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ object DataManager : DataDirectoryChangeListener.Listener {
6363

6464
@JvmStatic
6565
fun sync() {
66-
val newHash = Const.buildGitHash
66+
val newHash = Const.buildCommitHash
6767
val oldHash = prefs.internal.lastBuildGitHash
6868

6969
diff(oldHash, newHash).run {

app/src/main/java/com/osfans/trime/ui/fragments/AboutFragment.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@ import androidx.navigation.fragment.findNavController
99
import androidx.preference.Preference
1010
import androidx.preference.get
1111
import com.blankj.utilcode.util.ToastUtils
12-
import com.osfans.trime.BuildConfig
1312
import com.osfans.trime.R
1413
import com.osfans.trime.core.Rime
1514
import com.osfans.trime.data.opencc.OpenCCDictManager
1615
import com.osfans.trime.ui.components.PaddingPreferenceFragment
1716
import com.osfans.trime.ui.main.MainViewModel
1817
import com.osfans.trime.util.Const
18+
import com.osfans.trime.util.formatDateTime
1919
import com.osfans.trime.util.optionalPreference
2020
import com.osfans.trime.util.thirdPartySummary
2121
import splitties.systemservices.clipboardManager
@@ -35,11 +35,18 @@ class AboutFragment : PaddingPreferenceFragment() {
3535
intent =
3636
Intent(
3737
Intent.ACTION_VIEW,
38-
Uri.parse("${Const.currentGitRepo}/commits/${Const.buildGitHash}"),
38+
Uri.parse("${Const.currentGitRepo}/commits/${Const.buildCommitHash}"),
3939
)
4040
}
41-
get<Preference>("about__buildinfo")?.apply {
42-
summary = BuildConfig.BUILD_INFO
41+
get<Preference>("about__build_info")?.apply {
42+
summary =
43+
requireContext().getString(
44+
R.string.about__build_info_format,
45+
Const.builder,
46+
Const.currentGitRepo,
47+
Const.buildCommitHash,
48+
formatDateTime(Const.buildTimestamp),
49+
)
4350
setOnPreferenceClickListener {
4451
val info = ClipData.newPlainText("BuildInfo", summary)
4552
clipboardManager.setPrimaryClip(info)

app/src/main/java/com/osfans/trime/util/Const.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package com.osfans.trime.util
33
import com.osfans.trime.BuildConfig
44

55
object Const {
6-
val buildGitHash = BuildConfig.BUILD_GIT_HASH
6+
val builder = BuildConfig.BUILDER
7+
val buildTimestamp = BuildConfig.BUILD_TIMESTAMP
8+
val buildCommitHash = BuildConfig.BUILD_COMMIT_HASH
79
val displayVersionName = "${BuildConfig.BUILD_VERSION_NAME}-${BuildConfig.BUILD_TYPE}"
810
val originalGitRepo = "https://github.com/osfans/trime"
911
val currentGitRepo = BuildConfig.BUILD_GIT_REPO

app/src/main/java/com/osfans/trime/util/DeviceInfo.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ object DeviceInfo {
3434
}",
3535
)
3636
appendLine("--------- Build Info")
37-
appendLine(BuildConfig.BUILD_INFO)
37+
appendLine("Package Name: ${BuildConfig.APPLICATION_ID}")
38+
appendLine("Builder: ${Const.builder}")
39+
appendLine("Version Code: ${BuildConfig.VERSION_CODE}")
40+
appendLine("Version Name: ${Const.displayVersionName}")
41+
appendLine("Build Time: ${iso8601UTCDateTime(Const.buildTimestamp)}")
42+
appendLine("Build Git Hash: ${Const.buildCommitHash}")
3843
}
3944
}

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
<string name="pref_credits">贡献代码</string>
4141
<string name="about__product_prime">微软平台PRIME输入法</string>
4242
<string name="about__privacy_policy">隐私策略</string>
43+
<string name="about__build_info_format">构建者:%1$s\nGit 仓库:%2$s\n构建 Git 哈希:%3$s\n构建时间:%4$s</string>
4344
<string name="pref_enable">启用</string>
4445
<string name="pref_enable_summary">启用同文输入法</string>
4546
<string name="pref_select">选取软键盘</string>
@@ -100,7 +101,7 @@
100101
<string name="profile_sync_in_background">后台同步</string>
101102
<string name="profile_enable_syncing_in_background">点击以开启后台同步</string>
102103
<string name="profile_timing_sync">定时同步</string>
103-
<string name="profile_timing_sync_trigger_time">已开启定时同步 下次同步时间: %s</string>
104+
<string name="profile_timing_sync_trigger_time">已开启定时同步 下次同步时间: %1$s</string>
104105
<string name="profile_enable_timing_sync">点击以开启定时同步</string>
105106
<string name="pref_help__marketplace">应用市场</string>
106107
<string name="pref_help__user_community">用户社区</string>
@@ -181,7 +182,7 @@
181182
<string name="keyboard__swipe_enabled">允许触发按键的滑动手势</string>
182183
<string name="keyboard__key_swipe_velocity">触发按键滑动手势的速度(距离/速度满足其一即可)</string>
183184
<string name="keyboard__key_swipe_velocity_hi">连续击键时触发滑动手势的速度</string>
184-
<string name="about__buildinfo">编译信息</string>
185+
<string name="about__build_info">构建信息</string>
185186
<string name="keyboard__use_mini_keyboard_title">连接实体键盘时,显示迷你软键盘</string>
186187
<string name="pref_trime_custom_qq">修改版QQ群</string>
187188
<string name="pref_keyboard__candidate">候选栏</string>
@@ -234,7 +235,7 @@
234235
<string name="maintenance">维护</string>
235236
<string name="loading">正在加载</string>
236237
<string name="profile_reset">恢复默认设置</string>
237-
<string name="profile_last_sync_in_background">上次后台同步时间:%s\n状态:%s</string>
238+
<string name="profile_last_sync_in_background">上次后台同步时间:%1$s\n状态:%2$s</string>
238239
<string name="success">成功</string>
239240
<string name="failure">失败</string>
240241
<string name="pref_profile_summary">设定存储位置和修改同步设置等</string>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<string name="pref_credits">貢獻代碼</string>
4242
<string name="about__product_prime">Win10 PRIME輸入法平臺</string>
4343
<string name="about__privacy_policy">隱私權政策</string>
44+
<string name="about__build_info_format">建構者:%1$s\nGit 倉庫:%2$s\n建構 Git 雜湊值:%3$s\n建構時間:%4$s</string>
4445
<string name="pref_enable">啓用</string>
4546
<string name="pref_enable_summary">啓用同文輸入法平臺</string>
4647
<string name="pref_select">選取軟鍵盤</string>
@@ -105,7 +106,7 @@
105106
<string name="profile_never_sync_in_background">從未在後臺同步過</string>
106107
<string name="profile_enable_syncing_in_background">點擊以啟用後台同步</string>
107108
<string name="profile_timing_sync">定時同步</string>
108-
<string name="profile_timing_sync_trigger_time">已啟用定時同步 下次同步時間: %s</string>
109+
<string name="profile_timing_sync_trigger_time">已啟用定時同步 下次同步時間: %1$s</string>
109110
<string name="profile_enable_timing_sync">點擊以啟用定時同步</string>
110111
<string name="pref_help__marketplace">應用市場</string>
111112
<string name="pref_help__user_community">使用者社群</string>
@@ -185,7 +186,7 @@
185186
<string name="keyboard__swipe_enabled">允許觸發按鍵的滑動手勢</string>
186187
<string name="keyboard__key_swipe_velocity">觸發按鍵滑動手勢的速度(距離/速度滿足其一即可)</string>
187188
<string name="keyboard__key_swipe_velocity_hi">連續擊鍵時觸發滑動手勢的速度</string>
188-
<string name="about__buildinfo">編譯信息</string>
189+
<string name="about__build_info">建構資訊</string>
189190
<string name="keyboard__use_mini_keyboard_title">連接實體鍵盤時,顯示迷你軟鍵盤</string>
190191
<string name="pref_trime_custom_qq">修改版QQ羣</string>
191192
<string name="pref_keyboard__candidate">候選欄</string>
@@ -238,7 +239,7 @@
238239
<string name="maintenance">維護</string>
239240
<string name="loading">正在載入</string>
240241
<string name="profile_sync_in_background">後臺同步</string>
241-
<string name="profile_last_sync_in_background">上次後臺同步時間:%s\n狀態:%s</string>
242+
<string name="profile_last_sync_in_background">上次後臺同步時間:%1$s\n狀態:%2$s</string>
242243
<string name="success">成功</string>
243244
<string name="failure">失敗</string>
244245
<string name="other_managed_clipboard">剪貼板內容</string>

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<string name="pref_credits">Contribute</string>
4242
<string name="about__product_prime">Win10 PRIME Platform</string>
4343
<string name="about__privacy_policy">Privacy Policy</string>
44+
<string name="about__build_info_format">Builder: %1$s\nGit Repo: %2$s\nBuild Git Hash: %3$s\nBuild Time: %4$s</string>
4445
<string name="pref_enable">Enable</string>
4546
<string name="pref_enable_summary">Enable Trime</string>
4647
<string name="pref_select">Change Keyboard</string>
@@ -103,11 +104,11 @@
103104
<string name="profile_shared_data_dir">Shared directory</string>
104105
<string name="profile_user_data_dir">User directory</string>
105106
<string name="profile_sync_in_background">Sync in background</string>
106-
<string name="profile_last_sync_in_background">Last sync in background: %s\nStatus: %s</string>
107+
<string name="profile_last_sync_in_background">Last sync in background: %1$s\nStatus: %2$s</string>
107108
<string name="profile_never_sync_in_background">Never synced in the background</string>
108109
<string name="profile_enable_syncing_in_background">Click to enable</string>
109110
<string name="profile_timing_sync">Timing sync</string>
110-
<string name="profile_timing_sync_trigger_time">Timing sync is enabled Next sync at time: %s</string>
111+
<string name="profile_timing_sync_trigger_time">Timing sync is enabled Next sync at time: %1$s</string>
111112
<string name="profile_enable_timing_sync">Click to enable</string>
112113
<string name="pref_help__marketplace">Marketplace</string>
113114
<string name="pref_help__user_community">User Community</string>
@@ -189,7 +190,7 @@
189190
<string name="keyboard__swipe_enabled">Allow swipe gestures to trigger keys</string>
190191
<string name="keyboard__key_swipe_velocity">The speed of triggering the button swipe gesture (the distance/velocity is sufficient)</string>
191192
<string name="keyboard__key_swipe_velocity_hi">The velocity of the swipe gesture on consecutive keystrokes</string>
192-
<string name="about__buildinfo">Build info</string>
193+
<string name="about__build_info">Build Info</string>
193194
<string name="keyboard__use_mini_keyboard_title">Show mini keyboard with real keyboard attached</string>
194195
<string name="pref_trime_custom_qq">Custom QQ Group</string>
195196
<string name="pref_trime_custom_qq_summary" translatable="false"> </string>

app/src/main/res/xml/about_preference.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
app:iconSpaceReserved="false">
1212
</Preference>
1313

14-
<Preference app:key="about__buildinfo"
15-
app:title="@string/about__buildinfo"
14+
<Preference app:key="about__build_info"
15+
app:title="@string/about__build_info"
1616
app:iconSpaceReserved="false"> />
1717
</Preference>
1818

buildSrc/build.gradle.kts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
11
plugins {
22
`kotlin-dsl`
3+
kotlin("plugin.serialization") version embeddedKotlinVersion
34
}
45

56
repositories {
7+
google()
68
mavenCentral()
9+
gradlePluginPortal()
10+
}
11+
12+
dependencies {
13+
compileOnly("com.android.tools.build:gradle:8.2.0")
14+
compileOnly("org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.20")
15+
implementation("com.google.guava:guava:33.0.0-jre")
16+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.1")
17+
}
18+
19+
gradlePlugin {
20+
plugins {
21+
register("dataChecksums") {
22+
id = "com.osfans.trime.data-checksums"
23+
implementationClass = "DataChecksumsPlugin"
24+
}
25+
}
726
}

0 commit comments

Comments
 (0)