commit 920e3ef4218863cffa0bbe11eb93c8b586b50dd4
parent 8aa2e572272d1fe40605bcfaa2624904a2b0d0cd
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Sun, 22 Oct 2023 18:48:12 +0200

fix(mapper): unique build hash

Diffstat:
Mapp/build.gradle.kts | 2+-
Mbuild.gradle.kts | 2+-
Mcommon/build.gradle.kts | 1+
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/bridge/wrapper/MappingsWrapper.kt | 29++++++++++++-----------------
Mnative/build.gradle.kts | 2+-
5 files changed, 16 insertions(+), 20 deletions(-)

diff --git a/app/build.gradle.kts b/app/build.gradle.kts @@ -112,7 +112,7 @@ android { androidComponents { onVariants(selector().withFlavor("abi", "core")) { it.packaging.jniLibs.apply { - pickFirsts.set(listOf("**/lib${rootProject.ext["nativeName"]}.so")) + pickFirsts.set(listOf("**/lib${rootProject.ext["buildHash"]}.so")) excludes.set(listOf("**/*.so")) } } diff --git a/build.gradle.kts b/build.gradle.kts @@ -11,7 +11,7 @@ var versionCode = 1 //"1" for now until stable release rootProject.ext.set("appVersionName", versionName) rootProject.ext.set("appVersionCode", versionCode) rootProject.ext.set("applicationId", "me.rhunk.snapenhance") -rootProject.ext.set("nativeName", properties["custom_native_name"] ?: java.security.SecureRandom().nextLong(1000000000, 99999999999).toString(16)) +rootProject.ext.set("buildHash", properties["custom_build_hash"] ?: java.security.SecureRandom().nextLong(1000000000, 99999999999).toString(16)) tasks.register("getVersion") { doLast { diff --git a/common/build.gradle.kts b/common/build.gradle.kts @@ -18,6 +18,7 @@ android { buildConfigField("int", "VERSION_CODE", "${rootProject.ext["appVersionCode"]}") buildConfigField("String", "APPLICATION_ID", "\"${rootProject.ext["applicationId"]}\"") buildConfigField("int", "BUILD_DATE", "${System.currentTimeMillis() / 1000}") + buildConfigField("String", "BUILD_HASH", "\"${rootProject.ext["buildHash"]}\"") } kotlinOptions { diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/bridge/wrapper/MappingsWrapper.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/bridge/wrapper/MappingsWrapper.kt @@ -4,6 +4,7 @@ import android.content.Context import com.google.gson.GsonBuilder import com.google.gson.JsonElement import com.google.gson.JsonParser +import me.rhunk.snapenhance.common.BuildConfig import me.rhunk.snapenhance.common.Constants import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper import me.rhunk.snapenhance.common.bridge.types.BridgeFileType @@ -35,11 +36,13 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr private lateinit var context: Context private val mappings = ConcurrentHashMap<String, Any>() - private var snapBuildNumber: Long = 0 + private var mappingUniqueHash: Long = 0 + + private fun getUniqueBuildId() = (getSnapchatPackageInfo()?.longVersionCode ?: -1) xor BuildConfig.BUILD_HASH.hashCode().toLong() fun init(context: Context) { this.context = context - snapBuildNumber = getSnapchatVersionCode() + mappingUniqueHash = getUniqueBuildId() if (isFileExists()) { runCatching { @@ -57,24 +60,16 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr ) }.getOrNull() - fun getSnapchatVersionCode() = getSnapchatPackageInfo()?.longVersionCode ?: -1 - fun getApplicationSourceDir() = getSnapchatPackageInfo()?.applicationInfo?.sourceDir - fun getGeneratedBuildNumber() = snapBuildNumber - - fun isMappingsOutdated(): Boolean { - return snapBuildNumber != getSnapchatVersionCode() || isMappingsLoaded().not() - } - - fun isMappingsLoaded(): Boolean { - return mappings.isNotEmpty() - } + fun getGeneratedBuildNumber() = mappingUniqueHash + fun isMappingsOutdated() = mappingUniqueHash != getUniqueBuildId() || isMappingsLoaded().not() + fun isMappingsLoaded() = mappings.isNotEmpty() private fun loadCached() { if (!isFileExists()) { throw Exception("Mappings file does not exist") } val mappingsObject = JsonParser.parseString(read().toString(Charsets.UTF_8)).asJsonObject.also { - snapBuildNumber = it["snap_build_number"].asLong + mappingUniqueHash = it["unique_hash"].asLong } mappingsObject.entrySet().forEach { (key, value): Map.Entry<String, JsonElement> -> @@ -91,18 +86,18 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr } fun refresh() { - snapBuildNumber = getSnapchatVersionCode() + mappingUniqueHash = getUniqueBuildId() val mapper = Mapper(*mappers) runCatching { - mapper.loadApk(getApplicationSourceDir() ?: throw Exception("Failed to get APK")) + mapper.loadApk(getSnapchatPackageInfo()?.applicationInfo?.sourceDir ?: throw Exception("Failed to get APK")) }.onFailure { throw Exception("Failed to load APK", it) } measureTimeMillis { val result = mapper.start().apply { - addProperty("snap_build_number", snapBuildNumber) + addProperty("unique_hash", mappingUniqueHash) } write(result.toString().toByteArray()) } diff --git a/native/build.gradle.kts b/native/build.gradle.kts @@ -3,7 +3,7 @@ plugins { alias(libs.plugins.kotlinAndroid) } -val nativeName = rootProject.ext.get("nativeName") +val nativeName = rootProject.ext.get("buildHash") android { namespace = rootProject.ext["applicationId"].toString() + ".nativelib"