Skip to content

Commit a9da2b4

Browse files
committed
Implement cache using ProtoBuf
1 parent e992509 commit a9da2b4

File tree

4 files changed

+39
-11
lines changed

4 files changed

+39
-11
lines changed

.github/workflows/android.yml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,9 @@ jobs:
3030
id: random
3131
run: echo "NUMBER=$(shuf -i 1-10000 -n 1)" >> $GITHUB_OUTPUT
3232

33-
- name: Build Debug
34-
run: ./gradlew assembleUniversalDebug -PPACKAGE_NAME_SEED=${{ steps.random.outputs.NUMBER }}
35-
3633
- name: Build Release
3734
run: ./gradlew assembleUniversalRelease -PPACKAGE_NAME_SEED=${{ steps.random.outputs.NUMBER }}
3835

39-
- name: Upload a Debug Artifact
40-
uses: actions/upload-artifact@v4
41-
with:
42-
name: rvxp-ci-debug-apk
43-
path: app/build/outputs/apk/universal/debug
44-
4536
- name: Upload a Release Artifact
4637
uses: actions/upload-artifact@v4
4738
with:

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.util.Random
44
plugins {
55
alias(libs.plugins.android.application)
66
alias(libs.plugins.jetbrains.kotlin.android)
7+
alias(libs.plugins.jetbrains.kotlin.plugin.serialization)
78
}
89

910
val gitCommitHashProvider = providers.exec {
@@ -105,6 +106,7 @@ dependencies {
105106
implementation(group = "", name = "dexkit-android", ext = "aar")
106107
implementation("com.google.flatbuffers:flatbuffers-java:23.5.26") // dexkit dependency
107108
implementation(libs.annotation)
109+
implementation(libs.kotlinx.serialization.protobuf)
108110
testImplementation(kotlin("test-junit5"))
109111
testImplementation(libs.junit.jupiter.params)
110112
testImplementation(libs.jadx.core)

app/src/main/java/io/github/chsbuffer/revancedxposed/BaseHook.kt

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import de.robv.android.xposed.XposedBridge
1010
import de.robv.android.xposed.XposedHelpers
1111
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam
1212
import io.github.chsbuffer.revancedxposed.BuildConfig.DEBUG
13+
import kotlinx.serialization.ExperimentalSerializationApi
14+
import kotlinx.serialization.Serializable
15+
import kotlinx.serialization.decodeFromByteArray
16+
import kotlinx.serialization.encodeToByteArray
17+
import kotlinx.serialization.protobuf.ProtoBuf
1318
import org.luckypray.dexkit.DexKitBridge
1419
import org.luckypray.dexkit.DexKitCacheBridge
1520
import org.luckypray.dexkit.result.ClassData
@@ -18,6 +23,7 @@ import org.luckypray.dexkit.result.MethodData
1823
import org.luckypray.dexkit.wrap.DexClass
1924
import org.luckypray.dexkit.wrap.DexField
2025
import org.luckypray.dexkit.wrap.DexMethod
26+
import java.io.File
2127
import java.lang.reflect.Constructor
2228
import java.lang.reflect.Member
2329
import java.lang.reflect.Method
@@ -69,9 +75,29 @@ interface IHook {
6975
fun DexField.toField() = getFieldInstance(classLoader)
7076
}
7177

78+
fun String.toSha256(): String {
79+
val bytes = this.toByteArray()
80+
val md = java.security.MessageDigest.getInstance("SHA-256")
81+
val digest = md.digest(bytes)
82+
return digest.toHexString()
83+
}
84+
85+
@Serializable
86+
data class Pairs(
87+
val map: MutableMap<String, String?>
88+
)
89+
7290
@Suppress("UNCHECKED_CAST")
91+
@OptIn(ExperimentalSerializationApi::class)
7392
class SharedPrefCache(app: Application) : DexKitCacheBridge.Cache {
74-
private val map = mutableMapOf<String, String>()
93+
val file = File(app.cacheDir.path, BuildConfig.BUILD_TYPE.toSha256())
94+
95+
val pref = runCatching { ProtoBuf.decodeFromByteArray<Pairs>(file.readBytes()) }.getOrElse {
96+
Pairs(mutableMapOf())
97+
}
98+
99+
val map get() = pref.map
100+
75101
override fun clearAll() {
76102
map.clear()
77103
}
@@ -82,7 +108,8 @@ class SharedPrefCache(app: Application) : DexKitCacheBridge.Cache {
82108

83109
override fun getList(
84110
key: String, default: List<String>?
85-
): List<String>? = map.getOrDefault(key, null)?.takeIf(String::isNotBlank)?.split('|') ?: default
111+
): List<String>? =
112+
map.getOrDefault(key, null)?.takeIf(String::isNotBlank)?.split('|') ?: default
86113

87114
override fun put(key: String, value: String) {
88115
map.put(key, value)
@@ -95,6 +122,10 @@ class SharedPrefCache(app: Application) : DexKitCacheBridge.Cache {
95122
override fun remove(key: String) {
96123
map.remove(key)
97124
}
125+
126+
fun saveCache() {
127+
file.writeBytes(ProtoBuf.encodeToByteArray(pref))
128+
}
98129
}
99130

100131
class DependedHookFailedException(
@@ -121,6 +152,7 @@ abstract class BaseHook(private val app: Application, val lpparam: LoadPackagePa
121152

122153
override fun Hook() {
123154
val t = measureTimeMillis {
155+
tryLoadCache()
124156
try {
125157
applyHooks()
126158
handleResult()
@@ -166,6 +198,7 @@ abstract class BaseHook(private val app: Application, val lpparam: LoadPackagePa
166198
}
167199

168200
private fun handleResult() {
201+
cache.saveCache()
169202
val success = failedHooks.isEmpty()
170203
if (!success) {
171204
XposedBridge.log("${lpparam.appInfo.packageName} version: ${getAppVersion()}")

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@ fuel = { group = "com.github.kittinunf.fuel", name = "fuel", version.ref = "fuel
2121
junit-jupiter-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" }
2222
jadx-core = { group = "io.github.skylot", name = "jadx-core", version.ref = "jadx" }
2323
slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" }
24+
kotlinx-serialization-protobuf = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-protobuf", version = "1.9.0" }
2425

2526
[plugins]
2627
android-application = { id = "com.android.application", version.ref = "agp" }
2728
android-library = { id = "com.android.library", version.ref = "agp" }
2829
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
30+
jetbrains-kotlin-plugin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
2931

0 commit comments

Comments
 (0)