mirror of
https://github.com/rhunk/SnapEnhance.git
synced 2025-06-13 13:47:47 +02:00
fix(mapper): unique build hash
This commit is contained in:
@ -112,7 +112,7 @@ android {
|
|||||||
androidComponents {
|
androidComponents {
|
||||||
onVariants(selector().withFlavor("abi", "core")) {
|
onVariants(selector().withFlavor("abi", "core")) {
|
||||||
it.packaging.jniLibs.apply {
|
it.packaging.jniLibs.apply {
|
||||||
pickFirsts.set(listOf("**/lib${rootProject.ext["nativeName"]}.so"))
|
pickFirsts.set(listOf("**/lib${rootProject.ext["buildHash"]}.so"))
|
||||||
excludes.set(listOf("**/*.so"))
|
excludes.set(listOf("**/*.so"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ var versionCode = 1 //"1" for now until stable release
|
|||||||
rootProject.ext.set("appVersionName", versionName)
|
rootProject.ext.set("appVersionName", versionName)
|
||||||
rootProject.ext.set("appVersionCode", versionCode)
|
rootProject.ext.set("appVersionCode", versionCode)
|
||||||
rootProject.ext.set("applicationId", "me.rhunk.snapenhance")
|
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") {
|
tasks.register("getVersion") {
|
||||||
doLast {
|
doLast {
|
||||||
|
@ -18,6 +18,7 @@ android {
|
|||||||
buildConfigField("int", "VERSION_CODE", "${rootProject.ext["appVersionCode"]}")
|
buildConfigField("int", "VERSION_CODE", "${rootProject.ext["appVersionCode"]}")
|
||||||
buildConfigField("String", "APPLICATION_ID", "\"${rootProject.ext["applicationId"]}\"")
|
buildConfigField("String", "APPLICATION_ID", "\"${rootProject.ext["applicationId"]}\"")
|
||||||
buildConfigField("int", "BUILD_DATE", "${System.currentTimeMillis() / 1000}")
|
buildConfigField("int", "BUILD_DATE", "${System.currentTimeMillis() / 1000}")
|
||||||
|
buildConfigField("String", "BUILD_HASH", "\"${rootProject.ext["buildHash"]}\"")
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlinOptions {
|
kotlinOptions {
|
||||||
|
@ -4,6 +4,7 @@ import android.content.Context
|
|||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import com.google.gson.JsonElement
|
import com.google.gson.JsonElement
|
||||||
import com.google.gson.JsonParser
|
import com.google.gson.JsonParser
|
||||||
|
import me.rhunk.snapenhance.common.BuildConfig
|
||||||
import me.rhunk.snapenhance.common.Constants
|
import me.rhunk.snapenhance.common.Constants
|
||||||
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
|
import me.rhunk.snapenhance.common.bridge.FileLoaderWrapper
|
||||||
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
|
import me.rhunk.snapenhance.common.bridge.types.BridgeFileType
|
||||||
@ -35,11 +36,13 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
|
|||||||
private lateinit var context: Context
|
private lateinit var context: Context
|
||||||
|
|
||||||
private val mappings = ConcurrentHashMap<String, Any>()
|
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) {
|
fun init(context: Context) {
|
||||||
this.context = context
|
this.context = context
|
||||||
snapBuildNumber = getSnapchatVersionCode()
|
mappingUniqueHash = getUniqueBuildId()
|
||||||
|
|
||||||
if (isFileExists()) {
|
if (isFileExists()) {
|
||||||
runCatching {
|
runCatching {
|
||||||
@ -57,24 +60,16 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
|
|||||||
)
|
)
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
|
|
||||||
fun getSnapchatVersionCode() = getSnapchatPackageInfo()?.longVersionCode ?: -1
|
fun getGeneratedBuildNumber() = mappingUniqueHash
|
||||||
fun getApplicationSourceDir() = getSnapchatPackageInfo()?.applicationInfo?.sourceDir
|
fun isMappingsOutdated() = mappingUniqueHash != getUniqueBuildId() || isMappingsLoaded().not()
|
||||||
fun getGeneratedBuildNumber() = snapBuildNumber
|
fun isMappingsLoaded() = mappings.isNotEmpty()
|
||||||
|
|
||||||
fun isMappingsOutdated(): Boolean {
|
|
||||||
return snapBuildNumber != getSnapchatVersionCode() || isMappingsLoaded().not()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun isMappingsLoaded(): Boolean {
|
|
||||||
return mappings.isNotEmpty()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun loadCached() {
|
private fun loadCached() {
|
||||||
if (!isFileExists()) {
|
if (!isFileExists()) {
|
||||||
throw Exception("Mappings file does not exist")
|
throw Exception("Mappings file does not exist")
|
||||||
}
|
}
|
||||||
val mappingsObject = JsonParser.parseString(read().toString(Charsets.UTF_8)).asJsonObject.also {
|
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> ->
|
mappingsObject.entrySet().forEach { (key, value): Map.Entry<String, JsonElement> ->
|
||||||
@ -91,18 +86,18 @@ class MappingsWrapper : FileLoaderWrapper(BridgeFileType.MAPPINGS, "{}".toByteAr
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun refresh() {
|
fun refresh() {
|
||||||
snapBuildNumber = getSnapchatVersionCode()
|
mappingUniqueHash = getUniqueBuildId()
|
||||||
val mapper = Mapper(*mappers)
|
val mapper = Mapper(*mappers)
|
||||||
|
|
||||||
runCatching {
|
runCatching {
|
||||||
mapper.loadApk(getApplicationSourceDir() ?: throw Exception("Failed to get APK"))
|
mapper.loadApk(getSnapchatPackageInfo()?.applicationInfo?.sourceDir ?: throw Exception("Failed to get APK"))
|
||||||
}.onFailure {
|
}.onFailure {
|
||||||
throw Exception("Failed to load APK", it)
|
throw Exception("Failed to load APK", it)
|
||||||
}
|
}
|
||||||
|
|
||||||
measureTimeMillis {
|
measureTimeMillis {
|
||||||
val result = mapper.start().apply {
|
val result = mapper.start().apply {
|
||||||
addProperty("snap_build_number", snapBuildNumber)
|
addProperty("unique_hash", mappingUniqueHash)
|
||||||
}
|
}
|
||||||
write(result.toString().toByteArray())
|
write(result.toString().toByteArray())
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ plugins {
|
|||||||
alias(libs.plugins.kotlinAndroid)
|
alias(libs.plugins.kotlinAndroid)
|
||||||
}
|
}
|
||||||
|
|
||||||
val nativeName = rootProject.ext.get("nativeName")
|
val nativeName = rootProject.ext.get("buildHash")
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = rootProject.ext["applicationId"].toString() + ".nativelib"
|
namespace = rootProject.ext["applicationId"].toString() + ".nativelib"
|
||||||
|
Reference in New Issue
Block a user